Alpha_beta剪枝井字棋C++代码
时间: 2023-12-20 15:04:46 浏览: 43
以下是一个简单的Alpha_beta剪枝井字棋C代码:
#include <stdio.h>
#define N 3
#define human 'O'
#define computer 'X'
#define empty ' '
int board[N][N];
void print_board() {
int r, c;
printf("\n");
for (r = 0; r < N; r++) {
for (c = 0; c < N; c++) {
printf("%c", board[r][c]);
if (c != N - 1)
printf("|");
}
printf("\n");
if (r != N - 1) {
for (c = 0; c < N; c++)
printf("--");
printf("\n");
}
}
}
int evaluate(char player) {
int r, c;
int score = 0;
char opponent = (player == human) ? computer : human;
// check rows
for (r = 0; r < N; r++) {
int player_count = 0, opponent_count = 0;
for (c = 0; c < N; c++) {
if (board[r][c] == player)
player_count++;
else if (board[r][c] == opponent)
opponent_count++;
}
if (player_count == N)
return 1000;
if (opponent_count == N)
return -1000;
score += player_count * player_count;
score -= opponent_count * opponent_count;
}
// check columns
for (c = 0; c < N; c++) {
int player_count = 0, opponent_count = 0;
for (r = 0; r < N; r++) {
if (board[r][c] == player)
player_count++;
else if (board[r][c] == opponent)
opponent_count++;
}
if (player_count == N)
return 1000;
if (opponent_count == N)
return -1000;
score += player_count * player_count;
score -= opponent_count * opponent_count;
}
// check diagonals
int player_count = 0, opponent_count = 0;
for (r = 0; r < N; r++) {
if (board[r][r] == player)
player_count++;
else if (board[r][r] == opponent)
opponent_count++;
}
if (player_count == N)
return 1000;
if (opponent_count == N)
return -1000;
score += player_count * player_count;
score -= opponent_count * opponent_count;
player_count = 0, opponent_count = 0;
for (r = 0; r < N; r++) {
if (board[r][N - r - 1] == player)
player_count++;
else if (board[r][N - r - 1] == opponent)
opponent_count++;
}
if (player_count == N)
return 1000;
if (opponent_count == N)
return -1000;
score += player_count * player_count;
score -= opponent_count * opponent_count;
return score;
}
int alphabeta(int depth, int alpha, int beta, char player) {
int r, c, score;
if (depth == 0)
return evaluate(player);
char opponent = (player == human) ? computer : human;
// maximize score if it's computer's turn
if (player == computer) {
score = alpha;
for (r = 0; r < N; r++) {
for (c = 0; c < N; c++) {
if (board[r][c] == empty) {
board[r][c] = computer;
score = alphabeta(depth - 1, alpha, beta, opponent);
board[r][c] = empty;
if (score > alpha)
alpha = score;
if (beta <= alpha)
return alpha;
}
}
}
return alpha;
}
// minimize score if it's human's turn
else {
score = beta;
for (r = 0; r < N; r++) {
for (c = 0; c < N; c++) {
if (board[r][c] == empty) {
board[r][c] = human;
score = alphabeta(depth - 1, alpha, beta, opponent);
board[r][c] = empty;
if (score < beta)
beta = score;
if (beta <= alpha)
return beta;
}
}
}
return beta;
}
}
void computer_move() {
int r, c;
int max_score = -1000;
char opponent = human;
for (r = 0; r < N; r++) {
for (c = 0; c < N; c++) {
if (board[r][c] == empty) {
board[r][c] = computer;
int score = alphabeta(4, -1000, 1000, opponent);
board[r][c] = empty;
if (score > max_score) {
max_score = score;
printf("Computer moves to (%d, %d) with score %d\n", r, c, score);
}
}
}
}
}
int main() {
int r, c;
for (r = 0; r < N; r++) {
for (c = 0; c < N; c++) {
board[r][c] = empty;
}
}
printf("Let's play Tic Tac Toe!\n");
print_board();
while (1) {
printf("\nYour move:\n");
scanf("%d%d", &r, &c);
if (r < 0 || r >= N || c < 0 || c >= N || board[r][c] != empty) {
printf("Invalid move. Try again.\n");
continue;
}
board[r][c] = human;
print_board();
int score = evaluate(human);
if (score == 1000) {
printf("You win!\n");
break;
}
else if (score == -1000) {
printf("Computer wins!\n");
break;
}
else if (score == 0) {
printf("Tie game!\n");
break;
}
printf("\nComputer's move:\n");
computer_move();
print_board();
score = evaluate(computer);
if (score == 1000) {
printf("Computer wins!\n");
break;
}
else if (score == -1000) {
printf("You win!\n");
break;
}
else if (score == 0) {
printf("Tie game!\n");
break;
}
}
return 0;
}