给我一个Minimax算法,C语言实现
时间: 2024-05-09 17:15:19 浏览: 186
MinMax算法实现
4星 · 用户满意度95%
以下是一个简单的Minimax算法的C语言实现,假设我们要在一个tic-tac-toe游戏中实现这个算法:
```c
#include <stdio.h>
//定义游戏棋盘的大小
#define BOARD_SIZE 3
//定义玩家和机器的棋子
#define PLAYER 'X'
#define COMPUTER 'O'
#define EMPTY_CELL '-'
//函数声明
void display_board(char board[][BOARD_SIZE]);
int evaluate(char board[][BOARD_SIZE]);
int minimax(char board[][BOARD_SIZE], int depth, int is_max_player);
int is_moves_left(char board[][BOARD_SIZE]);
//主函数
int main() {
//初始化棋盘
char board[BOARD_SIZE][BOARD_SIZE] = {
{EMPTY_CELL, EMPTY_CELL, EMPTY_CELL},
{EMPTY_CELL, EMPTY_CELL, EMPTY_CELL},
{EMPTY_CELL, EMPTY_CELL, EMPTY_CELL}
};
//让机器先走
int best_val = minimax(board, 0, 1);
printf("最佳落子位置的得分是: %d\n", best_val);
return 0;
}
//显示棋盘
void display_board(char board[][BOARD_SIZE]) {
for(int i = 0; i < BOARD_SIZE; i++) {
for(int j = 0; j < BOARD_SIZE; j++) {
printf("%c ", board[i][j]);
}
printf("\n");
}
}
//评估棋盘的分数
int evaluate(char board[][BOARD_SIZE]) {
//检查每行是否有胜者
for(int row = 0; row < BOARD_SIZE; row++) {
if(board[row][0] == board[row][1] && board[row][1] == board[row][2]) {
if(board[row][0] == COMPUTER) {
return 10;
} else if(board[row][0] == PLAYER) {
return -10;
}
}
}
//检查每列是否有胜者
for(int col = 0; col < BOARD_SIZE; col++) {
if(board[0][col] == board[1][col] && board[1][col] == board[2][col]) {
if(board[0][col] == COMPUTER) {
return 10;
} else if(board[0][col] == PLAYER) {
return -10;
}
}
}
//检查对角线是否有胜者
if(board[0][0] == board[1][1] && board[1][1] == board[2][2]) {
if(board[0][0] == COMPUTER) {
return 10;
} else if(board[0][0] == PLAYER) {
return -10;
}
}
if(board[0][2] == board[1][1] && board[1][1] == board[2][0]) {
if(board[0][2] == COMPUTER) {
return 10;
} else if(board[0][2] == PLAYER) {
return -10;
}
}
//如果没有胜者,返回0
return 0;
}
//Minimax算法
int minimax(char board[][BOARD_SIZE], int depth, int is_max_player) {
int score = evaluate(board);
//如果机器赢了,返回分数10
if(score == 10) {
return score;
}
//如果玩家赢了,返回分数-10
if(score == -10) {
return score;
}
//如果没有可用的空位置,返回0
if(is_moves_left(board) == 0) {
return 0;
}
//如果当前轮到机器走
if(is_max_player) {
int best = -1000;
//遍历所有空位置
for(int i = 0; i < BOARD_SIZE; i++) {
for(int j = 0; j < BOARD_SIZE; j++) {
if(board[i][j] == EMPTY_CELL) {
//在当前空位置上尝试落子
board[i][j] = COMPUTER;
//递归计算分数
best = max(best, minimax(board, depth + 1, !is_max_player));
//撤回当前落子
board[i][j] = EMPTY_CELL;
}
}
}
return best;
} else { //如果当前轮到玩家走
int best = 1000;
//遍历所有空位置
for(int i = 0; i < BOARD_SIZE; i++) {
for(int j = 0; j < BOARD_SIZE; j++) {
if(board[i][j] == EMPTY_CELL) {
//在当前空位置上尝试落子
board[i][j] = PLAYER;
//递归计算分数
best = min(best, minimax(board, depth + 1, !is_max_player));
//撤回当前落子
board[i][j] = EMPTY_CELL;
}
}
}
return best;
}
}
//检查是否还有可用的空位置
int is_moves_left(char board[][BOARD_SIZE]) {
for(int i = 0; i < BOARD_SIZE; i++) {
for(int j = 0; j < BOARD_SIZE; j++) {
if(board[i][j] == EMPTY_CELL) {
return 1;
}
}
}
return 0;
}
```
这只是一个简单的示例,实际上Minimax算法可以用于任何具有双方对抗的游戏,例如五子棋、国际象棋等。
阅读全文