你知道胜利的移动只能发生在X或O进行最近的移动后,所以你只能搜索行/列与可选的diag包含在该移动,以限制您的搜索空间,当试图确定一个获胜板。此外,由于在最后一次移动之后,如果不是获胜移动,则在抽奖游戏中存在固定数量的移动,所以默认为抽奖游戏。
编辑:此代码是一个n乘n板,n在一行中赢(3×3板需求连续3,等)
编辑:添加的代码检查anti diag,我无法找出一个非循环的方式来确定点是否在反对这就是为什么这一步缺少
public class TripleT {
enum State{Blank, X, O};
int n = 3;
State[][] board = new State[n][n];
int moveCount;
void Move(int x, int y, State s){
if(board[x][y] == State.Blank){
board[x][y] = s;
}
moveCount++;
//check end conditions
//check col
for(int i = 0; i < n; i++){
if(board[x][i] != s)
break;
if(i == n-1){
//report win for s
}
}
//check row
for(int i = 0; i < n; i++){
if(board[i][y] != s)
break;
if(i == n-1){
//report win for s
}
}
//check diag
if(x == y){
//we're on a diagonal
for(int i = 0; i < n; i++){
if(board[i][i] != s)
break;
if(i == n-1){
//report win for s
}
}
}
//check anti diag (thanks rampion)
if(x + y = n - 1){
for(int i = 0;i
if(board[i][(n-1)-i] != s)
break;
if(i == n-1){
//report win for s
}
}
}
//check draw
if(moveCount == (n^2 - 1)){
//report draw
}
}
}