你好我正在创造一个基本的tic tac toe游戏,我有自己的乐趣,有4x4字段,我已经完成了程序,但我在游戏的一部分,我必须决定一个赢家,如果有任何x' s或o按2x2分组我已经有水平和垂直以及对角线算法来决定胜利者是否已完成 所以,例如,如果我们有
x|x|o|o
x|x|o|x
| | |
| | |
X将成为赢家,因为他有一个2x2组 谢谢你的帮助!
我的垂直赢家代码的示例代码
public boolean checkForWin()
{
char symbol = SYMBOL[turn];
//check vertical win
Check1:
for(int i=0; i<BOARD_SIZE; i++)
{
for(int j=0; j<BOARD_SIZE; j++)
if(board[i][j] != symbol)
continue Check1;
//if reached, winning line found
return true;
}
//check horizontal win
Check2:
for(int j=0; j<BOARD_SIZE; j++)
{
for(int i=0; i<BOARD_SIZE; i++)
if(board[i][j] != symbol)
continue Check2;
//if reached, winning line found
return true;
}
//check back slash diagonal win q
for(int i=0; i<BOARD_SIZE; i++)
if(board[i][i] != symbol)
break;
else if(i == BOARD_SIZE-1)
return true; // winning line found
//check forward slash diagonal win
for(int i=0; i<BOARD_SIZE; i++)
if(board[i][BOARD_SIZE - i - 1] != symbol)
break;
else if(i == BOARD_SIZE-1)
return true; // winning line found
//if reach here then no win found
return false;
}
我会在哪里输入该代码?
答案 0 :(得分:0)
创建一个获胜配置列表,每个配置包含4个位置。有4个获胜行,4个获胜列,2个对角线和9个块。然后检查每个配置。
代码大概是
// Set this up once at the start
WinningConfiguration[] allWinningConfigurations = {
WinningConfiguration.row(0),
...
WinningConfiguration.row(3);
WinningConfiguration.column(0);
...
WinningConfiguration.column(3);
WinningConfiguration.block(0,0);
...
WinningConfiguration.block(3,3);
WinningConfiguration.diagonal();
WinningConfiguration.reversedDiagonal();
}
..
// Now all your checks, (row, column, diagonal and blocks) become
for(WinningConfiguration config : allWinningConfigurations) {
boolean configWins = true;
for(int i=0; i<4; ++i) {
if(board[config.pts[i].x][config.pts[i].y]!=symbol) {
configWins = false;
break;
}
}
if(configWins)
return true;
}
return false;
如果您想添加其他获胜组合(比如所有四个角),您只需要在获胜的Configurations数组中添加一行就可以了。
还可以进行进一步的重构来制作这个整理器,比如将支票移入WinningConfiguration
类以便循环变为
for(WinningConfiguration config : allWinningConfigurations) {
if(config.wins(symbol)
return true;
}
return false;
答案 1 :(得分:0)
按照这种方式思考:每次赢得2x2广场都会有一个角落。因此,如果您看到一个标记,您可以检查右侧,底部和底部的方格是否都是相同的类型,如果是,则标记该玩家是赢家。由于你开始检查topleft角落,你永远不需要在最右边或最下面的线上进行启动检查(因为你的板外没有方形延伸!)
因此对于从i延伸到BOARD_SIZE-1的int i,以及从0延伸到BOARD_SIZE-1的int j,如果board [i] [j] == board [i + 1] [j] == board [我] [j + 1] ==登上[i + 1] [j + 1] ==符号然后你自己就是胜利者。
除此之外还有一些事情可以让它更有效率,但是因为它是tic-tac-toe我不认为你太关注可扩展性=)