测试tic tac toe win条件

我正在寻找最有效的java方法来测试是否有人赢得了tic tac toe。 数据是二维数组,如此……

char[][] ticTacToe = {{'X',' ','O'}, {'O','X','O'}, {'X',' ','X'},}; 

我知道这不是初始化数组的专业方法,但我只是在这里测试。

我现在能做的最好的是一个详尽的if / else树。 这是其中一棵树……

 if (ticTacToe[1][1] == 'X'){ if (ticTacToe[0][0] == 'X'){ if (ticTacToe[2][2] == 'X'){ System.out.println("X wins"); } } else if (ticTacToe[0][1] == 'X'){ if (ticTacToe[2][1] == 'X'){ System.out.println("X wins"); } } else if (ticTacToe[1][0] == 'X'){ if (ticTacToe[1][2] == 'X'){ System.out.println("X wins"); } } else if (ticTacToe[2][0] == 'X'){ if (ticTacToe[0][2] == 'X'){ System.out.println("X wins"); } } } 

这个只关心中间的东西

这是非常基本的,我想在最小化代码行的情况下改进它。

它有点冗长,但我认为这可能是最有效的方法(除非有人能够提出一种巧妙的方法来同时检查两个对角线)。

 public class TicTacToe { char[][] ticTacToe = {{'X',' ','O'}, {'O','X','O'}, {'X',' ','X'},}; private Character winner = null; public Character getWinner() { return this.winner; } public boolean isSolved() { this.checkSolved(); return this.winner != null; } private void checkSolved() { for(int i = 0; i < ticTacToe.length; i++) { Character win = checkRow(i); if(win != null || (win = checkColumn(i)) != null) { this.winner = win; return; } } //Check diagonal top left to bottom right if(this.ticTacToe[0][0] != ' ') { if(this.ticTacToe[0][0] == this.ticTacToe[1][1] && this.ticTacToe[1][1] == this.ticTacToe[2][2]) { this.winner = this.ticTacToe[0][0]; } } //Check diagonal top right to bottom left else if(this.ticTacToe[0][2] != ' ') { if(this.ticTacToe[0][2] == this.ticTacToe[1][1] && this.ticTacToe[1][1] == this.ticTacToe[2][0]) { this.winner = this.ticTacToe[0][2]; } } } private Character checkRow(int row) { if(this.ticTacToe[row][0] == ' ') { return null; } if(this.ticTacToe[row][0] == this.ticTacToe[row][1] && this.ticTacToe[row][1] == this.ticTacToe[row][2]) { return this.ticTacToe[row][0]; } return null; } private Character checkColumn(int column) { if(this.ticTacToe[0][column] == ' ') { return null; } if(this.ticTacToe[0][column] == this.ticTacToe[1][column] && this.ticTacToe[1][column] == this.ticTacToe[2][column]) { return this.ticTacToe[column][0]; } return null; } public static void main(String[] args) { TicTacToe ttt = new TicTacToe(); if(ttt.isSolved()) { System.out.println(ttt.getWinner()); // X } } } 

只是为了好玩,保留两个数字,从零开始,一个用于X ,一个用于O 通过移动更新它们。 首先检查胜利者,然后使用面具进行xor检查。

 277 & 273 ^ 273 0 ==> we have a winner. 276 & 273 ^ 273 1 ==> not. 

277 == parseInt(“100010101”,2)
273 == parseInt(“100010001”,2)
276 == parseInt(“100010100”,2)

为了更有趣,这里有一个在您喜欢的JavaScript控制台中播放O的示例:

          

将棋盘标记为3×3 magicSquare ,当你的总和为15时你就赢了。

在此处输入图像描述

对于玩家来说,比如’x’,有8种方法可以获胜,每种方式对应于行/列/对角线中的3’x’。 因此,您可以创建一个长度为8的数组,每个项目对应于该行/列/对角线中的“x”数。 当玩家选择移动时,您更新arrays并检查arrays中是否存在3。 虽然它需要更多空间,但更容易推广到大型电路板。

有四种不同的方法可以赢得嘀嗒声:

  1. 形成一条水平线
  2. 形成一条垂直线
  3. 从左上角到右下角形成一条对角线
  4. 形成从左下角到右上角的对角线

所有这四个胜利条件都可以通过for循环解决。 该解决方案的优点是它可以应用于任何矩阵大小。