Java 测试tic-tac-toe-win条件

Java 测试tic-tac-toe-win条件,java,algorithm,performance,Java,Algorithm,Performance,我正在寻找最有效的java方法来测试是否有人在tic-tac-toe中获胜。数据是在一个2d数组中,就像这样 char[][] ticTacToe = {{'X',' ','O'}, {'O','X','O'}, {'X',' ','X'},}; 我知道这不是初始化数组的专业方法,但我只是在这里进行测试 我现在能做的最好的事情就是一个详尽的if/else树。 这里有一棵树 if (ticTacToe[1][1] == 'X'){ if (ticTa

我正在寻找最有效的java方法来测试是否有人在tic-tac-toe中获胜。数据是在一个2d数组中,就像这样

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");
            }
        }
    }
这个只关心中间的东西


这是非常基本的,我想尽量减少代码行。

这有点冗长,但我认为这可能是最有效的方法(除非有人能想出一种聪明的方法同时检查两条对角线)

公共类TicTacToe
{
字符[][]ticTacToe=
{{'X','','O'},
{'O','X','O'},
{'X','','X'},};
私有字符winner=null;
公共字符getWinner()
{
返回此项。赢家;
}
公共布尔值()
{
这个。checkSolved();
返回此值。winner!=null;
}
私有void checkSolved()
{
for(int i=0;i
为了好玩,保留两个数字,从零开始,一个用于
X
,一个用于
O
。通过
使用移动更新它们。要检查获胜者,请先使用掩码检查
,然后检查
异或

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

276 & 273 ^ 273
1  ==> not.
277==parseInt(“100010101”,2)
273==parseInt(“100010001”,2)
276==parseInt(“100010100”,2)

为了获得更多乐趣,下面是一个在您喜爱的JavaScript控制台中播放
O
的示例:

<!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 += "\n\n" + (ot ? "O" : "X") + " wins!"
        else if (!(bd ^ 0777))
            b += "\n\nDraw."
        if (!ot){
            console.log(b + '\n\n"""')
            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>

变量x=0,o=0,计数=0,w=0
ws=[000700011110222044401240421]
功能t1(v){
var w1=0
for(ws中的var i)
w1 |=!(v&ws[i]^ws[i])
返回w1
}
函数t(i){
var ot=count%2,m=19 | | i<1 | | i!=Math.floor(i)))
返回“越界”
其他如果(m&bd)
返回“已采取的位置”
如果(ot){
变量n1=0,a1=-2
而(bd&(1>=1
}
如果(w)
b+=“\n\n”+(ot?“O”:“X”)+“获胜!”
否则如果(!(bd^0777))
b+=“\n\n读取。”
如果(!ot){
console.log(b+'\n\n'')
计数++
控制台日志(t(-1))
计数++
}
其他的
返回b+“\n”
返回''
}
函数mx(x1,o1,c1){
var ot1=c1%2,w1=ot1?t1(x1):t1(o1),
b1=x1 | o1,p=0400
如果(w1)
返回-1
如果(!(b1^0777))
返回0
变量a=-2
而(p>0){
如果(!(b1&p))
a=数学最大值(a,-mx(ot1?x1:x1 | p,ot1?o1 | p:o1,c1+1))
p>>=1
}
归还
}
console.log('Plays O!'
+“\n若要播放,请键入t(移动);移动是从1-9')

在tick-tack-toe比赛中,有四种不同的获胜方式:

  • 横排
  • 竖线
  • 从左上角到右下角形成一条对角线
  • 从左下角到右上角形成一条对角线

  • 所有这四个赢的条件都可以用for循环来解决。这个解决方案的优点是它可以应用于任何矩阵大小。

    对于一个玩家来说,比如“x”,有8种赢的方式,每种方式对应于行/列/对角线中的3个“x”。 因此,您可以创建一个长度为8的数组,每个项目对应于该行/列/对角线中的“x”数。 当玩家选择移动时,你将更新阵法并检查阵法中是否存在3。 虽然它需要更多的空间,但更容易推广到大型棋盘。

    将棋盘标记为3x3,当行中的和为15时,您就赢了


    请检查:-您也可以使用BASIC编程。采用面向对象的方法如何?将您的tic-tac-toeboard设置为类,并将网格封装在其中。使用方法,例如checkEndCondition(),以确定游戏是否结束。通过这种方式,您可以自由更改您代表棋盘的方式,甚至可以更改您的测试方式,以查看游戏是否结束
    <!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 += "\n\n" + (ot ? "O" : "X") + " wins!"
            else if (!(bd ^ 0777))
                b += "\n\nDraw."
            if (!ot){
                console.log(b + '\n\n"""')
                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>