C++ 黑白棋AI minimax+alphabeta剪枝
没事写着玩玩,通过debian上的黑白棋测试,搜了10层,打hard应该问题不大
#include <cstdio>
#include <cstring>
using namespace std;
template <typename T> T min(const T &x, const T &y) { return x < y ? x : y; }
template <typename T> T max(const T &x, const T &y) { return x > y ? x : y; }
const int weight[10][10] =
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 65, -3, 6, 4, 4, 6, -3, 65, 0,
0, -3, -29, 3, 1, 1, 3, -29, -3, 0,
0, 6, 3, 5, 3, 3, 5, 3, 6, 0,
0, 4, 1, 3, 1, 1, 3, 1, 4, 0,
0, 4, 1, 3, 1, 1, 3, 1, 4, 0,
0, 6, 3, 5, 3, 3, 5, 3, 6, 0,
0, -3, -29, 3, 1, 1, 3, -29, -3, 0,
0, 65, -3, 6, 4, 4, 6, -3, 65, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};//苟的debian黑白棋AI的权值表
const int d[8][2] =
{
-1, 0, 1, 0, 0, -1, 0, 1,
-1, -1, -1, 1, 1, -1, 1, 1
};
#define re register
int state[10][10], ansx, ansy;
//black:1 white:-1
int cur[10][10];
inline int alpha_beta(int dep, int player, int alpha, int beta, int cnt) //0 for me 1 for it
{
if(dep > 9 || cnt > 64) //dep是搜索的层数
{
int ret = 0;
for(re int i = 1; i <= 8; ++i)
for(re int j = 1; j <= 8; ++j)
ret += weight[i][j]*state[i][j];
return ret;
}
int temp[10][10], tot = 0;
memcpy(temp, state, sizeof state);
if(!player)
for(re int id = 1, x, y, i, j; id <= 64; ++id)
{
i = (id-1>>3)+1, j = (id-1)%8+1;
if(state[i][j] == 0)
{
int flag = 0, t;
for(re int k = 0; k < 8; ++k)
{
t = 0, x = i+d[k][0], y = j+d[k][1];
while(state[x][y] == -1) t++, x += d[k][0], y += d[k][1];
if(t && state[x][y] == 1)
{
do
{
x -= d[k][0], y -= d[k][1];
state[x][y] = 1;
} while(x != i || y != j);
flag = 1;
}
}
if(flag)
{
tot++;
int v = alpha_beta(dep+1, player^1, alpha, beta, cnt+1);
if(v > alpha)
{
if(!dep) ansx = i, ansy = j, memcpy(cur, state, sizeof state);
alpha = v;
}
memcpy(state, temp, sizeof temp);
if(beta <= alpha) break;
}
}
}
if(!tot) player = 1;
if(player)
{
for(re int id = 1, x, y, tx, ty, i, j; id <= 64; ++id)
{
i = (id-1>>3)+1, j = (id-1)%8+1;
if(state[i][j] == 0)
{
int flag = 0, t;
for(re int k = 0; k < 8; ++k)
{
t = 0, x = i+d[k][0], y = j+d[k][1];
while(state[x][y] == 1) t++, x += d[k][0], y += d[k][1];
if(t && state[x][y] == -1)
{
do
{
x -= d[k][0], y -= d[k][1];
state[x][y] = -1;
} while(x != i || y != j);
flag = 1;
}
}
if(flag)
{
int v = alpha_beta(dep+1, player^1, alpha, beta, cnt+1);
if(beta > v) beta = v;
memcpy(state, temp, sizeof temp);
if(beta <= alpha) break;
}
}
}
}
return !player ? alpha : beta;
}
int main()
{
memset(cur, 0, sizeof cur);
cur[4][4] = cur[5][5] = -1, cur[4][5] = cur[5][4] = 1;
for(int i = 0; i < 10; ++i) cur[0][i] = cur[9][i] = -2;
for(int i = 1; i < 9; ++i) cur[i][0] = cur[i][9] = -2;
for(int i = 0, tx, ty; i < 32; ++i)
{
memcpy(state, cur, sizeof cur);
ansx = -1, ansy = -1;
alpha_beta(0, 0, -1000000000, 1000000000, i*2);
if(ansx != -1)
{
printf("----------\n");
printf("you should put here:%d %d\n", ansx, ansy);
for(int p = 1; p <= 8; ++p)
{
for(int q = 1; q <= 8; ++q) printf("%d", cur[p][q] < 0 ? 2 : cur[p][q]);
printf("\n");
}
printf("----------\n");
}
printf("Enter your competitor's move(If he can't even move,just type -1 -1):"); scanf("%d%d", &tx, &ty);
if(tx == -1) continue;
for(int k = 0, x, y, t; k < 8; ++k)
{
t = 0, x = tx+d[k][0], y = ty+d[k][1];
while(cur[x][y] == 1) t++, x += d[k][0], y += d[k][1];
if(t && cur[x][y] == -1)
{
do
{
x -= d[k][0], y -= d[k][1];
cur[x][y] = -1;
} while(x != tx || y != ty);
}
}
}
return 0;
}
C++ 黑白棋AI minimax+alphabeta剪枝的更多相关文章
- 新手立体四子棋AI教程(3)——极值搜索与Alpha-Beta剪枝
上一篇我们讲了评估函数,这一篇我们来讲讲立体四子棋的搜索函数. 一.极值搜索 极值搜索是game playing领域里非常经典的算法,它使用深度优先搜索(因为限制最大层数,所以也可以称为迭代加深搜索) ...
- 基于Alpha-Beta剪枝的欢乐斗地主残局辅助
2019年4月17日更新: 将搜索主函数优化为局部记忆化搜索,再次提高若干倍搜索速度 更新了main和player,helper无更新 #include "Player-v3.0.cpp&q ...
- 算法笔记--极大极小搜索及alpha-beta剪枝
参考1:https://www.zhihu.com/question/27221568 参考2:https://blog.csdn.net/hzk_cpp/article/details/792757 ...
- python3+tkinter实现的黑白棋,代码完整 100%能运行
今天分享给大家的是采用Python3+tkinter制作而成的小项目--黑白棋 tkinter是Python内置的图形化模块,简单易用,一般的小型UI程序可以快速用它实现,具体的tkinter相关知识 ...
- 用Dart写的黑白棋游戏
2013年11月,Dart语言1.0稳定版SDK发布,普天同庆.从此,网页编程不再纠结了. 在我看来,Dart语法简直就是C#的升级版,太像了.之所以喜欢Ruby的一个重要理由是支持mixin功能,而 ...
- [CareerCup] 8.8 Othello Game 黑白棋游戏
8.8 Othello is played as follows: Each Othello piece is white on one side and black on the other. Wh ...
- 黑白棋游戏 (codevs 2743)题解
[问题描述] 黑白棋游戏的棋盘由4×4方格阵列构成.棋盘的每一方格中放有1枚棋子,共有8枚白棋子和8枚黑棋子.这16枚棋子的每一种放置方案都构成一个游戏状态.在棋盘上拥有1条公共边的2个方格称为相邻方 ...
- bzoj 2281 [Sdoi2011]黑白棋(博弈+组合计数)
黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色 ...
- C#黑白棋制作~
前些天自己复习一下C#语言 做了个黑白棋,望大家看一下,可能有些bug嘿嘿 链接如下 http://files.cnblogs.com/files/flyingjun/%E9%BB%91%E7%99% ...
随机推荐
- asp.net core 今日所得
ViewBag中文变量被编码.乱码. 解决方法: @Html.Raw(@ViewBag.XX) 在 Startup.cs 的 ConfigureServices() 方法中添加下面的一行代码: ser ...
- kali linux 2019.1 替换burpsuite pro 1.7.37
下面全部实操: 先切换JDK版本为1.8.执行 update-alternatives --config java 然后会显示多个jdk版本,1.8选3 输入java –version会显示jdk为1 ...
- [总结]CSS/CSS3常用样式与web移动端资源
CSS/CSS3常用样式与知识点 IE条件注释 条件注释简介 IE中的条件注释(Conditional comments)对IE的版本和IE非IE有优秀的区分能力,是WEB设计中常用的hack方法.条 ...
- 使用VC建立网络连接并访问网络资源
目录 1. 提出问题 2. 解决方案 1. 提出问题 在windows下可以通过系统操作,将局域网的资源映射到本地,从而实现像本地数据一样访问网络资源.实际上这些步骤也可通过代码调用win32函数实现 ...
- SharpMap和NetTopologySuite叠加分析问题
先附上实现的相交叠加分析的部分代码,然后请教个问题,希望能够得到解答. /// <summary> 执行相交叠加分析 </summary> private void Execu ...
- C# 离线人脸识别Demo 使用ArcFace 2.0开发完成
环境: win7以上 VS2013以上 sdk版本:ArcFace v2.0 x86 x64平台Debug.Release配置都已通过编译 下载地址:https://github ...
- rocketmq有序消息
RocketMQ提供的顺序消费消息实现是使用的FIFO 先进先出算法 Producer消息发送 public class Producer { public static void main(Stri ...
- 小程序开发基础-view视图容器
view 视图容器. // wxml <view class="section"> <view class="section__title"& ...
- ASP.NET学习笔记 —— 一般处理程序之图片上传
简单图片上传功能目标:实现从本地磁盘读取图片文件,展示到浏览器页面.步骤:(1). 首先创建一个用于上传图片的HTML模板,命名为ImageUpload.html: <!DOCTYPE html ...
- 阿狸V任务页面爬取数据解析
需求: 爬取:https://v.taobao.com/v/content/video 所有主播详情页信息 首页分析 分析可以得知数据是通过ajax请求获取的. 分析请求头 详情页分析 详情页和详情页 ...