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