[Dev-C++代码] 实现AI下五子棋

这篇文章既不是原创,也不是转载,那么我选择了折中的方案:翻译。
本文中的主要代码来自C++五子棋AI_ [PE]经典八炮
运用了极小化极大算法,α-β剪枝。经过最近的优化,运行速度提高了许多,在maxDepth为3的情况下(加根节点是4层),开启O2优化并且用Release版本编译,能达到两秒左右搜索完毕。这个版本把maxDepth改为4,搜索时间大概30秒左右。
并且我在原代码的基础上 进行了游戏体验的优化,并且让原代码可以在Dev编辑器当中编译(主要还是原博主的指导)。

这篇文章可以进行智能度的修改(程序倒数第二行,括号中的3表示智能度,可以调大或调小,4~2),但是4会特别慢,好几分钟才下一步
代码如下:

#include
### 五子棋人机对战代码实现 以下是一个可以在 Dev-C++ 中运行的五子棋人机对战代码示例。该代码实现了基本的人机对战逻辑,其中 AI 使用简单的启发式算法进行下一步落子选择。 ```cpp #include <iostream> #include <vector> #include <algorithm> #include <ctime> using namespace std; #define ROWS 15 // 棋盘行数 #define COLS 15 // 棋盘列数 // 棋盘状态 enum State { EMPTY, PLAYER, AI }; // 棋盘类 class Checkerboard { public: vector<vector<State>> board; // 检查棋盘状态 int turn; // 当前回合玩家(1为玩家,-1为AI) Checkerboard() : board(ROWS, vector<State>(COLS, EMPTY)), turn(1) {} // 初始化棋盘 void Init() { for (int i = 0; i < ROWS; ++i) { for (int j = 0; j < COLS; ++j) { board[i][j] = EMPTY; } } turn = 1; } // 打印棋盘 void PrintBoard() const { for (int i = 0; i < ROWS; ++i) { for (int j = 0; j < COLS; ++j) { if (board[i][j] == EMPTY) cout << "."; else if (board[i][j] == PLAYER) cout << "X"; else if (board[i][j] == AI) cout << "O"; } cout << endl; } } // 玩家落子 bool PlayerMove(int x, int y) { if (x < 0 || x >= ROWS || y < 0 || y >= COLS || board[x][y] != EMPTY) return false; board[x][y] = PLAYER; turn = -1; // 轮到AI return true; } // AI落子 void AIMove() { pair<int, int> bestMove = {-1, -1}; int maxScore = -1e9; for (int i = 0; i < ROWS; ++i) { for (int j = 0; j < COLS; ++j) { if (board[i][j] == EMPTY) { board[i][j] = AI; int score = Evaluate(); board[i][j] = EMPTY; if (score > maxScore) { maxScore = score; bestMove = {i, j}; } } } } board[bestMove.first][bestMove.second] = AI; turn = 1; // 轮到玩家 } // 评估当前棋盘状态 int Evaluate() const { // 简单启发式评分规则 int score = 0; for (int i = 0; i < ROWS; ++i) { for (int j = 0; j < COLS; ++j) { if (board[i][j] != EMPTY) { score += CheckLine(i, j, 1, 0); // 水平方向 score += CheckLine(i, j, 0, 1); // 垂直方向 score += CheckLine(i, j, 1, 1); // 对角线方向 score += CheckLine(i, j, 1, -1); // 反对角线方向 } } } return score; } // 检查某条线上的连续棋子数量 int CheckLine(int x, int y, int dx, int dy) const { int countPlayer = 0, countAI = 0; for (int i = 0; i < 5; ++i) { int nx = x + i * dx, ny = y + i * dy; if (nx < 0 || nx >= ROWS || ny < 0 || ny >= COLS) break; if (board[nx][ny] == PLAYER) countPlayer++; else if (board[nx][ny] == AI) countAI++; } if (countPlayer > 0 && countAI > 0) return 0; // 玩家和AI不能同时存在 return countPlayer > 0 ? countPlayer * 100 : countAI * 100; } // 检查游戏是否结束 bool IsGameOver() const { for (int i = 0; i < ROWS; ++i) { for (int j = 0; j < COLS; ++j) { if (board[i][j] != EMPTY) { if (CheckLine(i, j, 1, 0) >= 500 || CheckLine(i, j, 0, 1) >= 500 || CheckLine(i, j, 1, 1) >= 500 || CheckLine(i, j, 1, -1) >= 500) { return true; } } } } return false; } }; int main() { Checkerboard game; game.Init(); while (true) { game.PrintBoard(); if (game.turn == 1) { int x, y; cout << "请输入你的落子位置(x y): "; cin >> x >> y; if (!game.PlayerMove(x, y)) { cout << "无效的位置,请重新输入!" << endl; continue; } } else { game.AIMove(); } if (game.IsGameOver()) { game.PrintBoard(); if (game.turn == 1) cout << "AI获胜!" << endl; else cout << "玩家获胜!" << endl; break; } if (cin.fail()) { cout << "输入错误,程序退出。" << endl; break; } } return 0; } ``` 上述代码实现了以下功能: - 初始化一个 `15x15` 的棋盘[^3]。 - 提供玩家手动输入落子位置的功能[^4]。 - 实现了一个简单的 AI 落子逻辑,基于启发式评分规则选择最佳落子位置[^5]。 - 检查游戏是否结束,并输出胜负结果[^6]。 ### 注意事项 1. 该代码未包含图形界面,仅支持控制台运行。 2. AI 的逻辑较为简单,适合初学者学习和改进。 3. 如果需要更复杂的 AI 行为,可以引入深度搜索算法如 Minimax 或 Alpha-Beta 剪枝[^7]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值