在nxn板上为n个玩家提供Tic tac toe - 检查获胜者

时间:2013-12-03 13:27:01

标签: java arrays tic-tac-toe

我正在为nxn板上的n个玩家制作一个tic tac toe游戏,但获胜条件是连续3个。 我到目前为止解决这个问题的方法是:当一个移动时,程序将检查以下方块是否连续3个。

(x-1,y+1) (x,y+1) (x+1,y+1)

 (x-1,y)   (x,y)   (x+1,y)

(x-1,y-1) (x,y-1) (x+1,y-1)

其中(x,y)是正在进行的移动。我们这里有4个案例进行检查:一排胜利,一场胜利,一场对角胜利和一场反对角胜利。然后程序将检查将检查下一个方块连续3个。

(x-2,y+2)     0     (x,y+1)     0     (x+2,y+2)

    0     (x-1,y+1) (x,y+1) (x+1,y+1)     0

 (x-2,y)   (x-1,y)   (x,y)   (x+1,y)   (x+2,y)

    0     (x-1,y-1) (x,y-1) (x+1,y-1)     0 

(x-2,y-2)     0     (x,y-2)     0     (x+2,y-2)

再次(x,y)是正在进行的移动。我们这里有8个案例,因为我们检查!移动坐标作为连续3的终点。上面的0表示未检查的那些。

检查这段代码的代码很长很多文本。 代码示例:

  public int checkWinning(Coordinate c) {
    if (board[c.getX()][c.getY()] == board[c.getX()+1][c.getY()] && board[c.getX()][c.getY()] == board[c.getX()-1][c.getY()]){
        return board[c.getX()][c.getY()];
    }else if(board[c.getX()][c.getY()] == board[c.getX()][c.getY()+1] && board[c.getX()][c.getY()] == board[c.getX()][c.getY()-1]){
        return board[c.getX()][c.getY()];
    }else if(board[c.getX()][c.getY()] == board[c.getX()-1][c.getY()+1] && board[c.getX()][c.getY()] == board[c.getX()+1][c.getY()-1]){
        return board[c.getX()][c.getY()];
    }
}

这是坐标c已经发生的“移动”(X和Y来自另一个类,这就是我使用getter的原因)并注意:

Board [x] [y] - >表示板的二维数组,坐标从左上角(0,0)到右下角(大小-1,大小-1)计数,板[x] [y] == 0表示位置自由( x,y),board [x] [y] == i for i> 0表示玩家我在(x,y)上移动

有更聪明的方法吗?

2 个答案:

答案 0 :(得分:1)

我唯一要做的就是将if更改为循环。考虑到在某些时候你可能想要将获胜条件从3改为5.在if s的情况下,你将不得不重写很多代码,循环它将保持不变。

我不建议您寻找比此更“智能”的解决方案,因为您的代码应该易于理解和支持。此外,我怀疑任何智能解决方案都会比现有解决方案更快。

答案 1 :(得分:0)

我看到了一个重大缺陷:

<强> 1 这里的第一个问题是这些数组将超出界限,因此通过使用“第一个方法”查看3x3数组然后循环所有内部大小为+ 1和size-1的元素将消除但是:

我错过了最顶级,最底部最左侧和右侧要检查。即我需要检查
(x-1,y + 1),(x,y + 1),(x + 1,y + 1),(x-1,y-1)(x,y-1)(x + 1,y -1),(x-1,y + 1)(x-1,y)(x-1,y-1),(x + 1,y + 1)(x + 1,y)(x + 1) ,y-1)获奖者......