2013-04-03 132 views
1

我正在处理我的任务,那就是创建一个TicTacToe检查器,出于某种原因,我无法想出创建游戏的第一步的方法。我们从包含一行代表一场比赛的文本文件读入;例如: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对象:当我编写用于检查行,列等的方法时,我将如何让板子检查?我是否以正确的方式去做这件事?

回答

1

[W]母鸡我写我的方法检查行,列等,我将如何 得到董事会检查?

您的对象的实例应包含有关董事会的所有信息。你已经完成了这个(大部分) - game是包含板的信息的字段。唯一的问题是每个板都将包含相同的板信息,如果更新,它将包含更新的信息。

如果你要正确对待这就像一个factory,则有,你会想要做的四两件事:

  • game取出static修改。这是不必要的,并且会导致跨多个对象的不一致状态。
  • 使你的构造函数是私人的 - 除非我错过了一些东西,没有理由在工厂外初始化它。

    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); 
    } 
    
  • 为板对象提供某种类型的getter。你可能不需要这样做,但这是一个很好的做法。它可能是String[][]上的直接吸气剂,或某种漂亮的表现形式;我不知道。相反,我将这个实现留给读者。
+0

感谢您解释它,我为board [i] [j]设置了一个值时出错,但我认为这是因为来自文本文件的一些输入游戏不是3x3板。尽管如此,我仍然可以运作。 – user123

+0

@ user1327636如果他们不是全部3x3板?他们至少是NxN吗?如果棋盘不是正方形的,那么你怎么知道一排的结尾?它们的大小是否明确提供? – Cruncher

1

你正在推翻它。而不是“返回null;”,使用“返回新TicTacToe(大小);”。

虽然通常当我创建一个静态工厂方法(比如你的“创建”方法)时,我将构造函数设置为私有的,所以它只能从静态create方法中调用。

...然后你将需要更新主板,如果要真正地记住你在通过X/O位置...

+0

谢谢,我肯定是混淆自己。我们的作业不需要创建私人和公共方法。 – user123

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);  
} 

如果您有兴趣了解更多,您可以找到整个Java实现井字游戏:https://github.com/ncaralicea/tictactoe

相关问题