我正在创建自己的井字棋项目来练习编程的各个方面。编写完机器人后,游戏的逻辑出现了问题,因为如果所有字段都被填写并且有人获胜,那么会显示两个窗口,游戏以平局结束,而另一个玩家 N 获胜。
public class GameLogic extends HelloApplication {
private final int[][] pole;
public boolean allCellsFilled;
public GameLogic(int[][] pole) {
this.pole = pole;
}
public boolean allCellsFilled() {
// Проверяем, заполнены ли все ячейки
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (pole[i][j] == 0) {
return false; // Если хоть одна ячейка не заполнена, возвращаем false
}
}
}
// Если все ячейки заполнены и никто не победил, возвращаем true
return true;
}
public boolean checkWin(int player) {
// Проверка строк
for (int i = 0; i < 3; i++) {
if (pole[i][0] == player && pole[i][1] == player && pole[i][2] == player) {
return true;
}
}
// Проверка столбцов
for (int j = 0; j < 3; j++) {
if (pole[0][j] == player && pole[1][j] == player && pole[2][j] == player) {
return true;
}
}
// Проверка диагоналей
return (pole[0][0] == player && pole[1][1] == player && pole[2][2] == player) ||
(pole[0][2] == player && pole[1][1] == player && pole[2][0] == player);
}
}
我在这里发送这个逻辑(注意到图片不完整后添加,所以平局和获胜的问题已经解决,但是出现了一个新的问题:两个玩家可以同时获胜,它发生在玩游戏时机器人)
if (gameLogic.checkWin(currentPlayer) && !gameLogic.allCellsFilled()) {
ShowGameResult(primaryStage, "Победитель: игрок " + currentPlayer);
}
if (gameLogic.checkWin(currentPlayer) && gameLogic.allCellsFilled())
ShowGameResult(primaryStage, "Победитель: игрок " + currentPlayer);
if (gameLogic.allCellsFilled() && !gameLogic.checkWin(currentPlayer))
ShowGameResult(primaryStage, "Ничья!");
无论我如何尝试通过引入额外的检查来解决此问题,结果都是相同的 - 错误或相同的问题。
根据所提供的代码,尚不完全清楚如何检查每个玩家的奖金,因为这样的检查应该在每次“半步”之后进行。
最先填满三个元素的人获胜,如果开始游戏的玩家已经达到了这一点,则游戏应该立即结束,并且不允许第二个玩家完成他的半步。
因此,检查整个字段是否被填满实际上只需要检查平局(尽管可以通过其他方式计算平局)。
所以逻辑可以重新定义如下:
在线演示