2

TicTacToe チェッカーを作成するという課題に取り組んでいますが、何らかの理由で、ゲーム作成の最初のステップを実行する方法を考えることができません。1 つのゲームを表す行を含むテキスト ファイルから読み取ります。例えば:

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 オブジェクトを返す方法です: 行、列などをチェックするメソッドを書くとき、どのようにボードをチェックするのですか? 私はこれを正しい方法で行っていますか?

4

3 に答える 3

2

[いつ]行、列などをチェックするためのメソッドを作成した場合、どのようにボードにチェックさせるのですか?

オブジェクトのインスタンスには、ボードに関するすべての情報が含まれている必要があります。これは (ほとんど) 既に完了しています -gameボードに関する情報を含むフィールドです。唯一の問題は、すべてのボードに同じボード情報が含まれ、更新された場合は更新された情報が含まれることです。

これをfactoryのように扱いたい場合は、次の4 つのことを行う必要があります。

  • 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[][]、またはある種のプリティプリント表現のいずれかです。知らない。代わりに、この実装は読者に任せます。
于 2013-04-03T00:37:15.123 に答える
1

難しく考えすぎだよ。「return null;」ではなく、「return new TicTacToe(size);」を使用します。

ただし、通常、静的ファクトリ メソッド (「作成」メソッドなど) を作成するときは、コンストラクターをプライベートにして、静的作成メソッドからのみ呼び出すことができるようにします。

...そして、渡した x/o 位置を実際に覚えておきたい場合は、ボードを更新する必要があります...

于 2013-04-03T00:22:05.123 に答える
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

于 2015-09-03T16:17:57.360 に答える