六子棋AI代码C语言
时间: 2023-08-18 10:23:37 浏览: 68
以下是一个简单的六子棋AI代码,使用了C语言:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 6
#define COL 6
#define DEPTH 3
int chess_board[ROW][COL]; // 0表示空格,1表示玩家棋子,-1表示AI棋子
int evaluate(int player);
int minmax(int depth, int player, int *row, int *col);
int main() {
srand((unsigned int) time(NULL));
int row = 0, col = 0;
int player = 1;
int win = 0;
// 初始化棋盘
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
chess_board[i][j] = 0;
}
}
// 游戏开始
while (1) {
// 玩家下棋
if (player == 1) {
printf("请输入行号和列号(1~6):");
scanf("%d%d", &row, &col);
if (row < 1 || row > 6 || col < 1 || col > 6) {
printf("输入错误,请重新输入!\n");
continue;
}
if (chess_board[row - 1][col - 1] != 0) {
printf("这个位置已经有棋子了,请重新输入!\n");
continue;
}
chess_board[row - 1][col - 1] = player;
}
// AI下棋
else {
minmax(DEPTH, player, &row, &col);
printf("AI下棋:(%d,%d)\n", row + 1, col + 1);
chess_board[row][col] = player;
}
// 打印当前棋盘
printf(" 1 2 3 4 5 6\n");
for (int i = 0; i < ROW; i++) {
printf("%d ", i + 1);
for (int j = 0; j < COL; j++) {
if (chess_board[i][j] == 1) {
printf("O ");
} else if (chess_board[i][j] == -1) {
printf("X ");
} else {
printf("- ");
}
}
printf("\n");
}
// 判断是否获胜
int score = evaluate(player);
if (score >= 1000) {
printf("玩家获胜!\n");
win = 1;
break;
} else if (score <= -1000) {
printf("AI获胜!\n");
win = 1;
break;
}
// 判断是否平局
int is_full = 1;
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
if (chess_board[i][j] == 0) {
is_full = 0;
break;
}
}
if (!is_full) {
break;
}
}
if (is_full) {
printf("平局!\n");
win = 1;
break;
}
// 切换玩家
player *= -1;
}
return 0;
}
// 评估当前局面分数
int evaluate(int player) {
int score = 0;
// 横向和纵向
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL - 5; j++) {
int count = 0;
for (int k = 0; k < 6; k++) {
if (chess_board[i][j + k] == -player) {
count = 0;
break;
} else if (chess_board[i][j + k] == player) {
count++;
}
}
score += count * count * count * player;
}
for (int j = 0; j < COL - 5; j++) {
int count = 0;
for (int k = 0; k < 6; k++) {
if (chess_board[j + k][i] == -player) {
count = 0;
break;
} else if (chess_board[j + k][i] == player) {
count++;
}
}
score += count * count * count * player;
}
}
// 对角线
for (int i = 0; i < ROW - 5; i++) {
for (int j = 0; j < COL - 5; j++) {
int count = 0;
for (int k = 0; k < 6; k++) {
if (chess_board[i + k][j + k] == -player) {
count = 0;
break;
} else if (chess_board[i + k][j + k] == player) {
count++;
}
}
score += count * count * count * player;
}
for (int j = COL - 1; j > 4; j--) {
int count = 0;
for (int k = 0; k < 6; k++) {
if (chess_board[i + k][j - k] == -player) {
count = 0;
break;
} else if (chess_board[i + k][j - k] == player) {
count++;
}
}
score += count * count * count * player;
}
}
return score;
}
// 极大极小搜索
int minmax(int depth, int player, int *row, int *col) {
if (depth == 0) {
return evaluate(player);
}
int max_score = -100000000;
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
if (chess_board[i][j] == 0) {
chess_board[i][j] = player;
int score = -minmax(depth - 1, -player, row, col);
chess_board[i][j] = 0;
if (score > max_score) {
max_score = score;
if (depth == DEPTH) {
*row = i;
*col = j;
}
}
}
}
}
return max_score;
}
```
这个AI使用了极大极小搜索算法,对当前的局面进行评估,然后通过递归搜索将评估结果向上返回,最终选择分数最高的落子点。这个算法的时间复杂度比较高,可以通过剪枝等方法进行优化。