【求助】圈圈叉叉遊戲設計



贊助商連結


wpeter
2006-01-12, 07:42 PM
  最近想說要來玩玩看小型遊戲的設計,所以寫了個圈圈叉叉來玩玩。但是現在有點小問題...

  比較普通的狀況(如: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;
}
  其中goto flag3是勝利的情況(很不好的寫法...但是太懶惰了...),直接跳出迴圈,然後輸出某某玩家勝

  利的訊息。因為陣列值只要不為零就可以判斷是圈圈下手或是叉叉下手,所以直接讓它成為win 值,方便

  程式判斷哪一位玩家贏得了勝利。

贊助商連結


海盜天使
2006-01-12, 09:01 PM
把勝利的情形列出來 一共有8種
還有分辨是O還是X勝利
哪個先寫應該都可以
然後再用if去判斷就好了

我想你的錯誤來自太多if還有for了
你可以把全部的條件寫在同一個if下
if( (A=x && B=x && C=x) || (D=x && E=x && F=x) || ............................. )
要不然你的程式真的在跑的時候 一展開會變的很大
恐怕不是人腦可以看的出來

wpeter
2006-01-12, 09:27 PM
欸...會這樣寫是因為盤面的大小不一定是三乘三...太貪心了...整個設計出來最大可以跑到九乘九...

當然,如果像您說的,只跑三乘三的話,那當然就是單純多了。

lenbo
2006-01-12, 10:38 PM
用 goto 很容易出錯也抓不出來;
只看這一小段程式也看不出什麼所以然;
自己用 debug 模式來跑慢慢抓吧!