15

誰かが三目並べで勝ったかどうかをテストする最も効率的なJavaの方法を探しています。データは次のような2次元配列にあります...

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

これは真ん中にあるものだけを気にします

これは非常に基本的なことであり、コード行を最小限に抑えるために改善したいと考えています。

4

5 に答える 5

12

ボードを 3x3 magicSquareとしてマークし、ラインの合計が 15 になったら勝ちです。

ここに画像の説明を入力

于 2013-09-08T00:11:00.317 に答える
3

少し冗長ですが、これがおそらく最も効率的な方法だと思います (両方の対角線を一度にチェックする賢い方法を誰かが考え出さない限り)。

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
        }
    }
}
于 2013-08-31T14:37:32.477 に答える
0

ティックタックトゥで勝つには、次の 4 つの方法があります。

  1. 水平線を形成する
  2. 垂直線を形成する
  3. 左上隅から右下隅まで対角線を形成する
  4. 左下隅から右上隅まで対角線を形成する

これら 4 つの勝利条件はすべて for ループで解決できます。このソリューションの利点は、任意のマトリックス サイズに適用できることです。

于 2013-08-31T15:45:41.113 に答える