2010-10-27 105 views
3

我想製作一個非常簡單的井字遊戲。我已經在0-8 ArrayList中存儲了「X」和「O」的值(基本上是3x3的正方形)。我可以爲獲勝的每種情況執行以下操作:Java ArrayList比較 - TicTacToe

if ((newBoard().get(0)).equals("X") && 
    (newBoard().get(1)).equals("X") && 
    (newBoard().get(2)).equals("X")){ 
System.out.println("Player-X has won!"); 
return true; 

但是,這將花費TON代碼!我想創建包含「X」贏得(3-in-roe)情況的新ArrayList,然後複製並粘貼,用「O」代替「X」,然後將它們與當前ArrayList板進行比較與'互動'。這很好,但我不知道如何比較它們。我查看了API,但是我找不到任何可以做我想做的事情,即與ArrayLists進行比較,但僅限於指定的索引。

任何有關使這種情況有點小,代碼方面,將不勝感激。謝謝!

+0

感謝您的幫助!我現在有一個indexOutofRange錯誤,但我會在另一個問題中發佈。你們都有很好的解決方案,但是我選擇了Adam's,因爲它是最有意義的,考慮到我的技術水平和這個項目的目標,並不是說Jon和其他人沒有幫助,也許會幫助其他人解決這個普遍問題未來。再次感謝! – 2010-10-27 20:04:16

回答

1

點不說行,列和diaganols等於X和O,但他們都爲彼此是否是X或O的所以不是你的線路使用:

if ((newBoard().get(0)).equals(newBoard().get(1)) && newBoard().get(1).equals(newBoard().get(2))){ 
    System.out.println("Player-" + newBoard().get(0) +" has won!"); 
return true; 

這意味着同樣的事情,但適用於X 和O。下一步是使剛比較3個位置索引的功能:

private boolean checkForWin(int x, int y, int z){ 
    return newBoard().get(x).equals(newBoard().get(y)) && newBoard().get(y).equals(newBoard().get(z)); 
} 

那麼你可以繼續傳遞給函數的所有可能獲勝的位置索引。

+0

你不能連鎖'equals' ... – wchargin 2013-04-03 00:15:51

+0

@WChargin好點。我編輯了答案。 – Adam 2013-04-04 02:50:20

0

結帳這個代碼高爾夫看到各種算法來檢查和球員有一個井字遊戲:

Code Golf: Tic Tac Toe

+0

特別是[Java解決方案](http://stackoverflow.com/questions/2245801/code-golf-tic-tac-toe/2565507#2565507)。 – jball 2010-10-27 16:16:50

7

那麼,一個選擇是不去想所有獲獎的,但所有獲獎要求地點。例如:

private static final int[][] LINES_OF_THREE = { 
    { 0, 1, 2 }, // Horizontals 
    { 3, 4, 5 }, 
    { 6, 7, 8 }, 
    { 0, 3, 6 }, // Verticals 
    { 1, 4, 7 }, 
    { 2, 5, 8 }, 
    { 0, 4, 8 }, // Diagonals 
    { 6, 4, 2 } 
}; 

然後是這樣的:

for (int[] line : LINES_OF_THREE) { 
    boolean won = true; 
    for (int place : line) { 
    // player = "O" or "X" 
    if (!newBoard.get(place).equals(player)) { 
     won = false; 
     break; 
    } 
    } 
    if (won) { 
    // Yippee! 
    } 
} 
+1

您將C#和Java與混合「for(int place IN line)」語法混淆在一起:p – 2010-10-27 17:51:41

+0

@Luke:哎呀,是的。修復... – 2010-10-27 17:56:39

1

Sun發佈了一個TicTacToe應用程序,它使用逐位操作來存儲遊戲狀態並計算計算勝利。

http://java.sun.com/products/jfc/tsc/articles/tictactoe/src/TicTacToe.java

每個球員都有自己的電路板狀態,並使用按位運算的遊戲講述其空間是免費的。

很像喬恩的回答,勝利條件與勝利地點陣列進行檢查。只需要一個for循環,而不是兩個循環。

如果你要檢討這個的時候,它是一個奇妙的解決方案,井字遊戲

0

只有3井字真正的勝利條件。行,列和對角線

這裏有一個正方形數組[3,3](根據需要進行調整),然後使用迭代遍歷列和行。然後你只需要檢查兩個對角線。

我發現這是最簡單的方法來做到這一點。

boolean HasWon(PLAYER p) 
{ 
    for (int i = 0; i < 3; i++) 
    { 
     // Columns 
     if (board[i, 0] == p) 
      if (board[i,1] == p && board[i,2] == p) 
       return true; 
     // Rows 
     if (board[0, i] == p) 
      if (board[1, i] == p && board[2, i] == p) 
       return true; 
    } 
    //Check diagonals 
    if (board[0,0] == p && board[1,1] == p && board[2,2] == p) return true; 
    if (board[2,0] == p && board[1,1] == p && board[0,2] == p) return true; 
    return false; 
}