java - 测试 tic tac获胜情况

  显示原文与译文双语对照的内容
0 0

这个问题已经有了答案如下:

我在找最有效 java 方式就是如果有人取得了在井字游戏。 该数据位于二维数组如下。。。

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

这个只关心什么是中间

这是非常基本的我想改进它至于最小化代码行干得不错。

时间:原作者:10个回答

0 0

有点冗长,不过我想这可能是最有效的方式去做( 除非有人能想出巧妙的方法来检查这两个对角线一次) 。

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
        }
    }
}
原作者:
0 0

只是出于好玩,要两个数,从距,另一个用于 X,一个用于 O. 更新它们。 oring和采取行动。 先检查是否有赢家 and,那么 xor使用掩码。

277 & 273 ^ 273
0  ==> we have a winner.
276 & 273 ^ 273
1  ==> not.

277 == parseInt( " 100010101 " ,2 )
2.73 == parseInt( " 100010001 " ,2 )
276 == parseInt( " 100010100 " ,2 )

更有趣的,下面是一个播放的 O在首选的Javascript台:

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-type" content="text/html;charset=UTF-8">
  </head>
  <body>
    <script>
    var x = 0, o = 0, count = 0, w = 0
        ws = [0007,0070,0700,0111,0222,0444,0124,0421]
    function t1(v){
        var w1 = 0
        for (var i in ws)
            w1 |= !(v & ws[i] ^ ws[i])
        return w1
    }
    function t(i){
        var ot = count % 2, m = 1 << (9 - i), bd = x | o
        if (!ot && (i > 9 || i < 1 || i != Math.floor(i)))
            return "Out of bounds."
        else if (m & bd)
            return "Position taken."
        if (ot){
            var n1 = 0, a1 = -2
            while (bd & (1 << n1))
                n1++
            var n = n1
            while (n1 < 9){
                var m1 = 1 << n1
                if (!(bd & m1)){
                    var bt = -mx(x,o | m1,count + 1)
                     if (bt > a1){
                         a1 = bt
                         n = n1
                     }
                }
                n1++
            }
            w = t1(o |= 1 << n)
        }
        else
            w = t1(x |= m)
        var b = "n", p = 0400
        while (p > 0){
            if (p & x)
                b += "X"
            else if (p & o)
                b += "O"
            else b += "."
            if (p & 0110)
                b += "n"
            p >>= 1
        }
        if (w)
            b += "nn" + (ot ? "O" : "X") + " wins!"
        else if (!(bd ^ 0777))
            b += "nnDraw."
        if (!ot){
            console.log(b + 'nn"""')
            count++
            console.log(t(-1))
            count++
        }
        else
            return b + "n"
        return '"'
    }
    function mx(x1,o1,c1){
        var ot1 = c1 % 2, w1 = ot1 ? t1(x1) : t1 (o1),
              b1 = x1 | o1, p = 0400
        if (w1)
            return -1
        if (!(b1 ^ 0777))
            return 0
        var a = -2
        while (p > 0){
            if (!(b1 & p))
                a = Math.max(a,-mx(ot1 ? x1 : x1 | p,ot1 ? o1 | p : o1,c1 + 1))
            p >>= 1
        }
        return a
    }
    console.log('              Plays O!'
            + 'nTo play, type t(MOVE); MOVE is from 1-9')
    </script>
  </body>
</html>
原作者:
0 0

对于播放器,说'x',有8 种方法可以赢得并且每个对应于3 中的'x'row/column/diagonal 。 因此,可以创建一个长度为8 的数组,每一项都对应于中的'x'数的row/column/diagonal 。 当玩家选择一个移动,然后更新数组并检查是否存在数组中的3 。 尽管需要更多空间,更容易概括在很大板。

原作者:
0 0

板标记为3x3 magickSquare 之时你也赢了,不符合为15 。

enter image description here

原作者:
0 0

有四种不同的方式的去赢得tick tack toe:

  1. 形成一个水平线
  2. 形成竖线
  3. 形成对角线从左上角到右下角
  4. 形成对角线从左下角到右上角

所有这四个赢条件能够以大小写输入关键词For循环。 这个解决方案的优点是它可应用于任何矩阵大小。

原作者:
...