台灣科技大學 ![]() | 【求助】圈圈叉叉遊戲設計 最近想說要來玩玩看小型遊戲的設計,所以寫了個圈圈叉叉來玩玩。但是現在有點小問題... 比較普通的狀況(如:1P 或2P 在第三次下手就已經連成一直線或一斜線)沒有什麼問題,但是像下列 幾種情況就會出現判斷錯誤的情況: +-+-+-+ +-+-+-+ |○| |○| | |○|○| +-+-+-+ +-+-+-+ |○|╳|╳| |○|╳|╳| +-+-+-+ +-+-+-+ |╳|╳|○| |╳|╳|○| +-+-+-+ +-+-+-+ .......... ╳ 獲勝 ╳ 獲勝 目前是用三乘三的二維陣列來存放出手的資訊。一開始先將所有陣列的數值都歸零。然後圈圈的代表值是 「1」,叉叉的代表值是「2」。利用迴圈假設一個起始點,然後一一跟它右邊(橫排)的陣列值做比較 ,或是跟它下面的值(縱行)做比較。如果值是一樣的,那就設win 為起始點的陣列值,然後繼續比對, 否則win=0,並直接跳出迴圈,繼續讓下一行的判斷。(不知道這個邏輯上有沒有瑕疵...) 那麼,根據上面的想法,我可以寫成下面這樣的一個判斷程式,分橫排、縱行、左斜()和右斜(@) 分別討論。但是就是出了上面這些小紕漏,麻煩大家幫我看看好嗎!? 語法: /* 平行全相等時勝利 */ for(i=0;i<size;i++){ for(j=1;j<size;j++){ if(game[i][0]==game[i][j] && game[i][0]!=0 && game[i][j]!=0) { win=game[i][0]; } else { win=0; break; } if(win==0) { break; } } if(win!=0) { goto flag3; } } /* 垂直全相等時勝利 */ for(i=0;i<size;i++){ for(j=1;j<size;j++){ if(game[0][i]==game[j][i] && game[0][i]!=0 && game[j][i]!=0) { win=game[0][i]; } else { win=0; break; } if(win==0) { break; } } if(win!=0) { goto flag3; } } /* 右斜全相等時勝利 */ for(i=0;i<(size-1);i++){ if(game[0][0]==game[i+1][i+1] && game[0][0]!=0 && game[i+1][i+1]!=0) { win=game[0][0]; } else { win=0; break; } } if(win!=0) { goto flag3; } /* 左斜全相等時勝利 */ for(i=1;i<(size-1);i++){ if(game[size-1][0]==game[size-i-1][i] && game[size-1][0]!=0 && game[size-i-1][i]!=0) { win=game[size-1][0]; } else { win=0; break; } } if(win!=0) { goto flag3; } 利的訊息。因為陣列值只要不為零就可以判斷是圈圈下手或是叉叉下手,所以直接讓它成為win 值,方便 程式判斷哪一位玩家贏得了勝利。 |
回覆 |
還沒想到新的 | 把勝利的情形列出來 一共有8種 還有分辨是O還是X勝利 哪個先寫應該都可以 然後再用if去判斷就好了 我想你的錯誤來自太多if還有for了 你可以把全部的條件寫在同一個if下 if( (A=x && B=x && C=x) || (D=x && E=x && F=x) || ............................. ) 要不然你的程式真的在跑的時候 一展開會變的很大 恐怕不是人腦可以看的出來 |
回覆 |
台灣科技大學 ![]() | 欸...會這樣寫是因為盤面的大小不一定是三乘三...太貪心了...整個設計出來最大可以跑到九乘九... 當然,如果像您說的,只跑三乘三的話,那當然就是單純多了。 |
回覆 |
風来坊 | 用 goto 很容易出錯也抓不出來; 只看這一小段程式也看不出什麼所以然; 自己用 debug 模式來跑慢慢抓吧! |
回覆 |
|
XML | RSS 2.0 | RSS |
本論壇所有文章僅代表留言者個人意見,並不代表本站之立場,討論區以「即時留言」方式運作,故無法完全監察所有即時留言,若您發現文章可能有異議,請 email :[email protected] 處理。