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

顯示結果從第 1 筆 到 4 筆,共計 4 筆
  1. #1
    台灣科技大學
    註冊日期
    2002-01-01
    所在地區
    Giga ADSL 8M/640
    討論區文章
    767

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

      最近想說要來玩玩看小型遊戲的設計,所以寫了個圈圈叉叉來玩玩。但是現在有點小問題...

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

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



  2. #2
    還沒想到新的 海盜天使 的大頭照
    註冊日期
    2002-03-24
    討論區文章
    1,490
    把勝利的情形列出來 一共有8種
    還有分辨是O還是X勝利
    哪個先寫應該都可以
    然後再用if去判斷就好了

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

  3. #3
    台灣科技大學
    註冊日期
    2002-01-01
    所在地區
    Giga ADSL 8M/640
    討論區文章
    767
    欸...會這樣寫是因為盤面的大小不一定是三乘三...太貪心了...整個設計出來最大可以跑到九乘九...

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

  4. #4
    村人A lenbo 的大頭照
    註冊日期
    2001-04-30
    所在地區
    plala.co.jp
    討論區文章
    11,094
    用 goto 很容易出錯也抓不出來;
    只看這一小段程式也看不出什麼所以然;
    自己用 debug 模式來跑慢慢抓吧!

類似的主題

  1. 【閒聊】how to play夜市的套圈圈 ?
    作者:apencilbox 所在討論版:-- 閒 話 家 常 灌 水 版
    回覆: 1
    最後發表: 2005-04-29, 11:50 AM
  2. 【求助】請問有住在宜蘭頭城的網友嗎?
    作者:sam1302 所在討論版:-- 閒 話 家 常 灌 水 版
    回覆: 1
    最後發表: 2005-03-18, 08:50 AM
  3. 【笑話】實實在在的一生
    作者:xip6 所在討論版:-- 網路輕鬆版 [圖片 笑話 影片]
    回覆: 8
    最後發表: 2004-04-23, 02:46 PM
  4. 兩個圈圈
    作者:vvcvc 所在討論版:-- 網路輕鬆版 [圖片 笑話 影片]
    回覆: 8
    最後發表: 2002-01-20, 09:56 AM
  5. 我的clone cd都會出現紅色大叉叉
    作者:妹妹 所在討論版:-- 光 碟 燒 錄 討 論 版
    回覆: 1
    最後發表: 2001-11-03, 11:26 PM

 

此網頁沒有從搜尋引擎而來的訪客

發表文章規則

  • 不可以發表新主題
  • 不可以回覆文章
  • 不可以上傳附加檔案
  • 不可以編輯自己的文章
  •