Java TicTacToe游戏

时间:2013-04-03 00:12:58

标签: java

我正在完成我的任务,即创建一个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对象:当我编写检查行,列等的方法时,我将如何让电路板检查?我是以正确的方式来做这件事吗?

3 个答案:

答案 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