我已经创建了一个可以工作的tic-tac-toe引擎。到目前为止,它支持player vs player,player vs是一个非常基本的AI,可以选择完全随机的移动。我想增加AI继续随机选择的能力,除非它看到一个可以赢得游戏的走法。也就是说,AI随机移动,直到它在一行中有2个,其中一个点是空的,在这一点上,它将选择在获胜的位置玩。
这是我到目前为止所知道的:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (board[i][j] == ' ') {
possibleMove[0] = i;
possibleMove[1] = j;
}
if (board[i][j] == playerAI.moveType) {
winCount++;
if (winCount == 2) {
myMove = possibleMove;
winCount = 0;
System.out.println("row area " + Arrays.toString(myMove));
}
}
}
winCount = 0;
}我的想法是检查棋盘上的每个空格^^这一个检查行。我将存储董事会找到的任何可能的移动,然后如果我们已经在该行中有移动,它将增加一个计数器。如果计数器到了2,那么我们应该去我们存储的移动是什么。
我还有4个用于列,对角线和反对角线的函数,这是完全相同的原理。
有人能帮我找出我逻辑上的缺陷在哪里吗?
发布于 2021-01-03 08:44:03
另一种解决方案是让每个单元检查它的两个相邻单元是否已满以及是否为空:
public class StackOverflow{
static char[][] board = {{'x', 'x', ' '}, {'x', ' ', ' '}, {' ', ' ', ' '}};
public static int[] checkRow(){
for (int i = 0; i<3; i++){
for (int j = 0; j<3; j++){
if (board[i][(j+1)%3]=='x' && board[i][(j+1)%3]=='x' && board[i][j]==' '){
return new int[]{i, j};
}
}
}
return null;
}
public static void main(String[] args){
System.out.println(checkRow()[0] + " "+checkRow()[1]);
}
}这将遍历每个单元格,并检查左侧的1和2,mod 3,这样您就永远不会超出界限。如果尝试失败,它将返回null。(它将因为print语句而抛出,而不是因为函数本身)
发布于 2021-01-03 09:26:08
一个问题是:如果0,0,0,1和0,2都填满了,当你达到0时,3的winCount将是2,但是possibleMove在这个特定的循环中不会被设置。它会将myMove设置为以前的胡言乱语,例如0, 0,这显然与第0行无关。要解决这个问题(对于行),您可以在外部循环的每次迭代中将winCount重置为0,并将possibleMove重置为-1,-1,然后在设置myMove之前使用检查if (winCount == 2 && possibleMove[0] != -1 && possibleMove[1] != -1)。
显然,这只适用于行,对于列/图,您需要以稍微不同的方式重置值。
https://stackoverflow.com/questions/65545527
复制相似问题