我正在完成我的任务,即创建一个TicTacToe检查器,由于某种原因,我无法想办法创建游戏的第一步。我们从包含代表一个游戏的一行的文本文件中读入;例如:
x,x,o, , ,x, ,o,o
在传统的电路板上看起来像这样:
x|x|o
-----
| |x
-----
|o|o
这是我到目前为止所拥有的:
class TicTacToe{
static String[][] game;
public TicTacToe(int size){
this.game = new String[size][size];
}
public static TicTacToe create(String input){
String tokens = input.split(",");
int size = (int)Math.sqrt(tokens.length); //For setting a size
// of the board
return null;
}
}
我不明白的是如何返回一个新的TicTacToe对象:当我编写检查行,列等的方法时,我将如何让电路板检查?我是以正确的方式来做这件事吗?
答案 0 :(得分:1)
你过度思考它。而不是"返回null;",使用"返回新的TicTacToe(大小);"。
虽然,通常当我创建一个静态工厂方法(比如你的" create"方法)时,我将构造函数设为私有,因此只能从静态create方法调用它。
...如果你想真正记住你传入的x / o位置,你需要更新电路板......
答案 1 :(得分:1)
[W]我写我的方法来检查行,列等等。我将如何 让董事会检查?
对象的实例应包含有关该板的所有信息。您(大部分)已经完成了这项工作 - game
是包含有关电路板信息的字段。唯一的问题是每个板都包含相同的板信息,如果更新,它将包含更新的信息。
如果您想将此视为factory,那么您有四件事需要做:
static
删除game
修饰符。这是不必要的,并且会导致多个对象之间的状态不一致。将您的构造函数设为私有 - 除非我遗漏了某些内容,否则没有理由在工厂外初始化它。
private TicTacToe(int size) {
game = new String[size][size];
}
或者,更好的是:
private TicTacToe(String[][] hydratedBoard) {
game = hydratedBoard;
}
我马上就会告诉你原因。
实施TicTacToe.create(String)
,并返回完全水合的物体。建议是隐式创建String[][]
,使用作为构造函数的参数传入的对象创建对象,并返回TicTacToe
对象。
public static TicTacToe create(String input) {
String[][] board = new String[3][3];
int i = 0; // count the row we're on
String[] tokens = input.split(",");
for(int j = 0; j < board.length; j++) {
if (j % 3 == 0) { // advanced to the end of the column set (SO)
i++;
}
board[i][j] = tokens[i*3 + j];
}
return new TicTacToe(board);
}
String[][]
上的直接吸气剂,也可以是某种漂亮的印刷品;我不知道。我将把这个实现留给读者。答案 2 :(得分:0)
在这里,我添加了一款针对此游戏的集成测试,可能会为您提供有关如何创建/思考游戏的一些想法。
public void testWinnerPlayerIWithVerticalLine() {
this.displayUnitTestDescription("Integration Test for having player 'X' as winner on a vertical line use case");
final IBoardGame<TicTacToeMove, TicTacToePlayer> ticTacTocGame = new TicTacToeGame();
final String playerIDisplayName = "X";
final String playerIIDisplayName = "O";
final TicTacToePlayer playerI = new TicTacToePlayer(playerIDisplayName);
final TicTacToePlayer playerII = new TicTacToePlayer(playerIIDisplayName);
ticTacTocGame.setGamePlayers(new TicTacToePlayer[]{playerI, playerII});
TicTacToePlayer[][] expectedBoardInteractionSnapshot = new TicTacToePlayer[][]{
new TicTacToePlayer[]{playerI, null, playerII},
new TicTacToePlayer[]{playerI, playerII, null},
new TicTacToePlayer[]{playerI, playerII, playerI}
};
ticTacTocGame.start();
ticTacTocGame.makeMove(new TicTacToeMove(0, 0));
ticTacTocGame.makeMove(new TicTacToeMove(1, 1));
ticTacTocGame.makeMove(new TicTacToeMove(2, 2));
ticTacTocGame.makeMove(new TicTacToeMove(0, 2));
ticTacTocGame.makeMove(new TicTacToeMove(2, 0));
ticTacTocGame.makeMove(new TicTacToeMove(2, 1));
ticTacTocGame.makeMove(new TicTacToeMove(1, 0));
this.displayBoardPlayerInteractionSnapshot(ticTacTocGame);
final TicTacToePlayer[][] actualBoardInteractionSnapshot = ticTacTocGame.getPlayerInteractionSnapshotBoard();
Assert.assertFalse(ticTacTocGame.isGameDraw());
Assert.assertTrue(ticTacTocGame.existWinner());
Assert.assertEquals(ticTacTocGame.getWinner().getDisplayName(), playerIDisplayName);
Assert.assertArrayEquals(actualBoardInteractionSnapshot, expectedBoardInteractionSnapshot);
}
如果您有兴趣了解更多内容,可以找到TicTacToe游戏的整个java实现:https://github.com/ncaralicea/tictactoe