2012-04-30 59 views
2

我想了解遊戲是完成還是繪製或仍然可玩。但我想用動態代碼來做到這一點。我如何在tictactoe遊戲中做check_game_state方法?

例如我做靜態3 * 3井字遊戲這樣的:

private static boolean check_game_state(char[] board) 
{ 
    if ( (board[0]==cSymbol && board[1]==cSymbol && board[2]==cSymbol) 
     || (board[3]==cSymbol && board[4]==cSymbol && board[5]==cSymbol) 
     || (board[6]==cSymbol && board[7]==cSymbol && board[8]==cSymbol) 
     || (board[0]==cSymbol && board[3]==cSymbol && board[6]==(cSymbol)) 
     || (board[1]==(cSymbol) && board[4]==(cSymbol) && board[7]==(cSymbol)) 
     || (board[2]==(cSymbol) && board[5]==(cSymbol) && board[8]==(cSymbol)) 
     || (board[0]==(cSymbol) && board[4]==(cSymbol) && board[8]==(cSymbol)) 
     || (board[2]==(cSymbol) && board[4]==(cSymbol) && board[6]==(cSymbol))) 
    { 
     if (cSymbol == 'X') 
     { 
      state = 5; //player 1 win 
     } 
     else if (cSymbol == 'O') 
     { 
      state = 4; player 2 win 
     } 
    } 
} 

我想將其動態地爲4×4或5×5或更高板。但我該怎麼做呢?可能嗎?

+2

這個家庭作業? – Jivings

+0

在android中期項目的一小塊:)我做它靜態3 * 3與minimax alg –

回答

1

而不是硬編碼索引,你需要訪問循環中的元素。例如。而不是

boolean test = (board[0]==cSymbol && board[1]==cSymbol && board[2]==cSymbol); 

你會做這樣的事情

boolean test = true; 
for (int i = 0; i < length; ++i) { 
    test = test && board[i] == cSymbol ; 
} 

其中length是電路板的尺寸(如5,6),相同的平方根board.length你需要從要麼計算這個數組的長度或將它傳遞給功能與陣列本身

這將設置test爲true僅當所有元素都等於cSymbolfalse否則沿。

更新:我給你的行的計算;你將需要採取這種給(提示:計算指數i+j*length),主要dialonal(索引:i*length+i)和子對角線(索引:i*length+(length-1-i))。該指數i*length + j翻譯爲i列,第j列:

private static boolean check_game_state(char[] board, int length) 
{ 
    bool row = false; 
    for (int i = 0; i < length; ++i) { 
    bool innerRow = true; 
    for (int j = 0; j < length; ++j) { // calculate the ith row 
     innerRow = innerRow && board[i*length+j] == cSymbol; 
    } 
    row = row || innerRow; 
    } 
    if (row) 
    { 
    // somebody won... 
    } 
} 
+0

,但它是動態的5 * 5 - 6 * 6 - 7 * 7 ... –

+0

查看更新的答案 – Attila

+0

它是工作所有的代碼?我的意思是我想在我的問題中同樣的事情,但我把它寫成靜態的。我想幽默。編輯check_game_state()方法,使其成爲動態的。謝謝 –

1

然後,您可以不硬代碼的檢查條件。你必須有3獨立情況:

  1. 要檢查行
  2. 要檢查
  3. 列要檢查對角線

可以在所有那些運行情況下,使用簡單的循環從0N(您的遊戲大小)。我會說,跟蹤當前正在填充的單元格。說那是x,y。現在使用這個座標並檢查特定的rowcolumn。如果x == y那麼它在前向對角線,所以你檢查它。同樣檢查反向對角線。

0

如果你不想硬編碼它,你應該實現一些搜索獲勝位置的算法等。看看例如http://www.codeproject.com/Articles/43622/Solve-Tic-Tac-Toe-with-the-MiniMax-algorithm

+0

{0,1,2},{3,4,5}, {6,7,8},{0,3,6}, {1,4,7}, {2,5,8}, {0,4,8},{2,4,6}它也是靜態的 }; –

+1

不理解你的投票。靜態數據和靜態邏輯是有區別的。有一件事是你靜態定義一些東西 - 例如一塊板子。但另一件事是你硬編碼IF語句 - 這是糟糕的代碼。但靜態INITIAL數據是確定的。 –

相關問題