2010-10-27 66 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; 
}