帮我写一段使用了minmax算法的反四子棋机器人的C++源代码
时间: 2024-02-05 11:14:05 浏览: 150
基于C++实现的可人机对战的五子棋游戏源码
以下是一个简单的反四子棋机器人的 C++ 源代码,使用了 Minimax 算法。
```cpp
#include <bits/stdc++.h>
using namespace std;
const int N = 20; // 棋盘大小
const int inf = 1e9; // 无穷大
int board[N][N]; // 棋盘
int dx[] = {-1, -1, 0, 1, 1, 1, 0, -1}; // 方向数组
int dy[] = {0, 1, 1, 1, 0, -1, -1, -1};
// 判断是否越界
bool inBound(int x, int y) {
return x >= 0 && x < N && y >= 0 && y < N;
}
// 统计在(x, y)处的连续棋子数
int count(int x, int y, int dx, int dy, int color) {
int cnt = 0;
while (inBound(x, y) && board[x][y] == color) {
cnt++;
x += dx;
y += dy;
}
return cnt;
}
// 判断当前局面是否结束
bool isGameOver() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (board[i][j] == 0) continue; // 如果当前位置为空,直接跳过
int color = board[i][j];
for (int k = 0; k < 8; k++) {
int cnt = count(i, j, dx[k], dy[k], color);
if (cnt >= 4) return true; // 如果有连续四个同色棋子,游戏结束
}
}
}
return false;
}
int evaluate(int color) {
int score = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (board[i][j] == color) { // 统计当前玩家的得分
for (int k = 0; k < 8; k++) {
int cnt = count(i, j, dx[k], dy[k], color);
if (cnt == 1) score += 10;
else if (cnt == 2) score += 100;
else if (cnt == 3) score += 1000;
else if (cnt == 4) score += 10000;
}
} else if (board[i][j] > 0) { // 统计对手的得分
for (int k = 0; k < 8; k++) {
int cnt = count(i, j, dx[k], dy[k], board[i][j]);
if (cnt == 1) score -= 10;
else if (cnt == 2) score -= 100;
else if (cnt == 3) score -= 1000;
else if (cnt == 4) score -= 10000;
}
}
}
}
return score;
}
// Minimax算法
int minimax(int depth, int color, int alpha, int beta) {
if (depth == 0 || isGameOver()) { // 如果达到搜索深度或游戏结束,返回当前局面评估值
return evaluate(color);
}
int bestScore = -inf;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (board[i][j] != 0) continue; // 如果当前位置已经有棋子,直接跳过
board[i][j] = color; // 在当前位置落子
int score = -minimax(depth - 1, 3 - color, -beta, -alpha); // 对手选择最优解,故取相反数
board[i][j] = 0; // 撤销落子
if (score > bestScore) {
bestScore = score;
}
if (bestScore > alpha) {
alpha = bestScore;
}
if (alpha >= beta) { // 剪枝
return bestScore;
}
}
}
return bestScore;
}
// 机器人下棋
void robotMove(int& x, int& y) {
int bestScore = -inf;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (board[i][j] != 0) continue; // 如果当前位置已经有棋子,直接跳过
board[i][j] = 2; // 在当前位置落子
int score = -minimax(3, 1, -inf, inf); // 搜索3层,当前玩家为1,对手为2
board[i][j] = 0; // 撤销落子
if (score > bestScore) {
bestScore = score;
x = i;
y = j;
}
}
}
}
int main() {
memset(board, 0, sizeof(board)); // 初始化棋盘
int x, y;
while (!isGameOver()) {
robotMove(x, y); // 机器人下棋
cout << "机器人下棋(" << x + 1 << ", " << y + 1 << ")" << endl;
board[x][y] = 2; // 在当前位置落子
for (int i = 0; i < N; i++) { // 打印棋盘
for (int j = 0; j < N; j++) {
if (board[i][j] == 0) cout << ".";
else if (board[i][j] == 1) cout << "O";
else cout << "X";
}
cout << endl;
}
int px, py;
cout << "请输入你要下的位置(px, py): ";
cin >> px >> py;
px--, py--;
if (board[px][py] != 0) { // 如果当前位置已经有棋子,重新输入
cout << "该位置已经有棋子,请重新输入!" << endl;
continue;
}
board[px][py] = 1; // 在当前位置落子
for (int i = 0; i < N; i++) { // 打印棋盘
for (int j = 0; j < N; j++) {
if (board[i][j] == 0) cout << ".";
else if (board[i][j] == 1) cout << "O";
else cout << "X";
}
cout << endl;
}
}
return 0;
}
```
此代码使用了 Alpha-Beta 剪枝对 Minimax 算法进行优化,可以有效减少搜索时间,提高机器人下棋的效率。
阅读全文