【求助】圈圈叉叉遊戲設計 - PCZONE 討論區

返回   PCZONE 討論區 > ▲ -- 電 腦 軟 體 討 論 區 > -- HELP ME 電 腦 軟 硬 體 急 救 版


PCZONE 討論區



通知

-- HELP ME 電 腦 軟 硬 體 急 救 版 若您有簡單的電腦軟硬體或網路等各種疑難雜症想要請教高手,請在此發表。此區不分種類的問題皆可發表,以小問題為主,請電腦新手多多利用此一新的版版。

台灣科技大學
【求助】圈圈叉叉遊戲設計
  最近想說要來玩玩看小型遊戲的設計,所以寫了個圈圈叉叉來玩玩。但是現在有點小問題...

  比較普通的狀況(如: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 值,方便

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

回覆
還沒想到新的

把勝利的情形列出來 一共有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 
本站使用 vBulletin 合法版權程式
站務信箱 : [email protected]

本論壇所有文章僅代表留言者個人意見,並不代表本站之立場,討論區以「即時留言」方式運作,故無法完全監察所有即時留言,若您發現文章可能有異議,請 email :[email protected] 處理。