c++六子棋博弈算法代码
时间: 2024-05-25 07:09:11 浏览: 37
C++六子棋博弈算法代码的实现需要用到博弈树和极大极小值算法。具体实现步骤如下:
1.定义棋盘数据结构,用二维数组来表示棋盘,0表示空位,1表示黑子,2表示白子。
2.定义玩家和电脑的棋子颜色,用变量来表示。
3.定义胜利条件,当有一方连成六子即可获胜。
4.实现落子函数,判断当前位置是否为空,如果是,则在该位置落子,并判断是否有一方获胜。
5.实现博弈树生成函数,从当前局面开始,递归生成所有可能的下一步局面,并记录每个局面的得分。
6.实现极大极小值算法,根据博弈树的得分计算出当前最优的落子位置。
7.最后,实现主函数,调用以上函数,实现完整的六子棋博弈算法。
这里给出一个参考代码供您参考:
```
#include<iostream>
#include<cstring>
using namespace std;
const int MAXN = 15;
const int INF = 0x3f3f3f3f;
int mp[MAXN][MAXN];
int color, oppo_color;
bool is_win(int x, int y) { // 判断是否赢了
int cnt = 1;
for(int i = x + 1; mp[i][y] == color && i <= 10; i++) cnt++;
for(int i = x - 1; mp[i][y] == color && i >= 1; i--) cnt++;
if(cnt >= 6) return true;
cnt = 1;
for(int i = y + 1; mp[x][i] == color && i <= 10; i++) cnt++;
for(int i = y - 1; mp[x][i] == color && i >= 1; i--) cnt++;
if(cnt >= 6) return true;
cnt = 1;
for(int i = x + 1, j = y + 1; mp[i][j] == color && i <= 10 && j <= 10; i++, j++) cnt++;
for(int i = x - 1, j = y - 1; mp[i][j] == color && i >= 1 && j >= 1; i--, j--) cnt++;
if(cnt >= 6) return true;
cnt = 1;
for(int i = x + 1, j = y - 1; mp[i][j] == color && i <= 10 && j >= 1; i++, j--) cnt++;
for(int i = x - 1, j = y + 1; mp[i][j] == color && i >= 1 && j <= 10; i--, j++) cnt++;
if(cnt >= 6) return true;
return false;
}
int eval() { // 计算当前局面得分
int score = 0;
for(int i = 1; i <= 10; i++) {
for(int j = 1; j <= 10; j++) {
if(mp[i][j]) {
int cnt = 0;
for(int k = i + 1; mp[k][j] == mp[i][j] && k <= 10; k++) cnt++;
if(cnt >= 4) score += mp[i][j] * cnt * cnt;
cnt = 0;
for(int k = j + 1; mp[i][k] == mp[i][j] && k <= 10; k++) cnt++;
if(cnt >= 4) score += mp[i][j] * cnt * cnt;
cnt = 0;
for(int k = i + 1, l = j + 1; mp[k][l] == mp[i][j] && k <= 10 && l <= 10; k++, l++) cnt++;
if(cnt >= 4) score += mp[i][j] * cnt * cnt;
cnt = 0;
for(int k = i + 1, l = j - 1; mp[k][l] == mp[i][j] && k <= 10 && l >= 1; k++, l--) cnt++;
if(cnt >= 4) score += mp[i][j] * cnt * cnt;
}
}
}
return score;
}
int dfs(int depth, int alpha, int beta) { // 极大极小值算法
if(depth == 0) return eval();
int value, max_value, min_value;
if(color == oppo_color) { // 玩家回合
max_value = -INF;
for(int i = 1; i <= 10; i++) {
for(int j = 1; j <= 10; j++) {
if(!mp[i][j]) {
mp[i][j] = oppo_color;
if(is_win(i, j)) { // 如果这一步可以获胜,则直接返回极大值
mp[i][j] = 0;
return INF;
}
value = dfs(depth - 1, alpha, beta);
max_value = max(max_value, value);
alpha = max(alpha, value);
mp[i][j] = 0;
if(alpha >= beta) return max_value; // 剪枝
}
}
}
return max_value;
} else { // 电脑回合
min_value = INF;
for(int i = 1; i <= 10; i++) {
for(int j = 1; j <= 10; j++) {
if(!mp[i][j]) {
mp[i][j] = color;
if(is_win(i, j)) { // 如果这一步可以获胜,则直接返回极小值
mp[i][j] = 0;
return -INF;
}
value = dfs(depth - 1, alpha, beta);
min_value = min(min_value, value);
beta = min(beta, value);
mp[i][j] = 0;
if(alpha >= beta) return min_value; // 剪枝
}
}
}
return min_value;
}
}
void computer_move() { // 计算电脑的落子位置
int x, y, max_score = -INF, score;
for(int i = 1; i <= 10; i++) {
for(int j = 1; j <= 10; j++) {
if(!mp[i][j]) {
mp[i][j] = color;
if(is_win(i, j)) { // 如果这一步可以获胜,则直接落子
cout << "Computer move: (" << i << ", " << j << ")" << endl;
mp[i][j] = color;
return;
}
score = dfs(3, -INF, INF); // 搜索深度为3层
if(score > max_score) {
max_score = score;
x = i;
y = j;
}
mp[i][j] = 0;
}
}
}
cout << "Computer move: (" << x << ", " << y << ")" << endl;
mp[x][y] = color;
}
void print_board() { // 打印当前棋盘
cout << " ";
for(int i=1;i<=10;i++)
cout<<" "<<i%10<<" ";
cout<<endl;
for(int i=1;i<=10;i++)
{
cout<<i%10<<" ";
for(int j=1;j<=10;j++)
{
if(mp[i][j]==0)
cout<<" . ";
else if(mp[i][j]==1)
cout<<" X ";
else
cout<<" O ";
}
cout<<endl<<endl<<endl;;
}
}
int main() {
memset(mp,0,sizeof(mp));
int op;
cout<<"请选择先手:"<<endl<<"1.我"<<endl<<"2.电脑"<<endl;
cin>>op;
if(op ==2){
color=2;
oppo_color=1;
computer_move();
print_board();
}else{
color=1;
oppo_color=2;
}
while(1) {
int x,y;
cout<<"请下棋:"<<endl;
cin>>x>>y;
if(mp[x][y]) {
cout<<"该位置已经有子,请重新输入!"<<endl<<endl;;
continue;
}
mp[x][y]=oppo_color;
if(is_win(x,y)) {
cout<<"你赢了!"<<endl<<endl;;
print_board();
break;
}
computer_move();
if(is_win(x,y)) {
cout<<"你输了!"<<endl<<endl;;
print_board();
break;
}
print_board();
}
return 0;
}
```
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![cpp](https://img-home.csdnimg.cn/images/20210720083646.png)