int minmax(int turn, int n)
{
int v = check();
if(v != 2) return v;
int value = (turn==MARU)?INT_MIN:INT_MAX;
for(int y = 0; y < 3; y++){
for(int x = 0; x < 3; x++){
if(board[y][x] == 0){
board[y][x] = turn; // 置いてみる
// 勝負が決まるまでもぐ
v = minmax(-turn,n+1);
board[y][x] = 0;
if(turn == MARU){
if(v > value){
if(n == 0){
cx = x;
cy = y;
}
value = v;
}
}else {
if(v < value){
if(n == 0){
cx = x;
cy = y;
}
value = v;
}
}
}
}
}
return value;
}
int check()
{
// 横
if(board[0][0] != 0 && board[0][0] == board[0][1] && board[0][0] == board[0][2])
return board[0][0];
if(board[1][0] != 0 && board[1][0] == board[1][1] && board[1][0] == board[1][2])
return board[1][0];
if(board[2][0] != 0 && board[2][0] == board[2][1] && board[2][0] == board[2][2])
return board[2][0];
// 縦
if(board[0][0] != 0 && board[0][0] == board[1][0] && board[0][0] == board[2][0])
return board[0][0];
if(board[0][1] != 0 && board[0][1] == board[1][1] && board[0][1] == board[2][1])
return board[0][1];
if(board[0][2] != 0 && board[0][2] == board[1][2] && board[0][2] == board[2][2])
return board[0][2];
// ななめ
if(board[0][0] != 0 && board[0][0] == board[1][1] && board[0][0] == board[2][2])
return board[0][0];
if(board[0][2] != 0 && board[0][2] == board[1][1] && board[0][2] == board[2][0])
return board[0][2];
int cnt = 0;
for(int y = 0; y < 3; y++){
for(int x = 0; x < 3; x++){
if(board[y][x] == 0)
cnt++;
}
}
if(cnt == 0) return DRAW; // 引き分け
return 2; // 勝負はついていない
}
最終更新:2007年04月14日 09:35