没事写着玩玩,通过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剪枝的更多相关文章

  1. 新手立体四子棋AI教程(3)——极值搜索与Alpha-Beta剪枝

    上一篇我们讲了评估函数,这一篇我们来讲讲立体四子棋的搜索函数. 一.极值搜索 极值搜索是game playing领域里非常经典的算法,它使用深度优先搜索(因为限制最大层数,所以也可以称为迭代加深搜索) ...

  2. 基于Alpha-Beta剪枝的欢乐斗地主残局辅助

    2019年4月17日更新: 将搜索主函数优化为局部记忆化搜索,再次提高若干倍搜索速度 更新了main和player,helper无更新 #include "Player-v3.0.cpp&q ...

  3. 算法笔记--极大极小搜索及alpha-beta剪枝

    参考1:https://www.zhihu.com/question/27221568 参考2:https://blog.csdn.net/hzk_cpp/article/details/792757 ...

  4. python3+tkinter实现的黑白棋,代码完整 100%能运行

    今天分享给大家的是采用Python3+tkinter制作而成的小项目--黑白棋 tkinter是Python内置的图形化模块,简单易用,一般的小型UI程序可以快速用它实现,具体的tkinter相关知识 ...

  5. 用Dart写的黑白棋游戏

    2013年11月,Dart语言1.0稳定版SDK发布,普天同庆.从此,网页编程不再纠结了. 在我看来,Dart语法简直就是C#的升级版,太像了.之所以喜欢Ruby的一个重要理由是支持mixin功能,而 ...

  6. [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 ...

  7. 黑白棋游戏 (codevs 2743)题解

    [问题描述] 黑白棋游戏的棋盘由4×4方格阵列构成.棋盘的每一方格中放有1枚棋子,共有8枚白棋子和8枚黑棋子.这16枚棋子的每一种放置方案都构成一个游戏状态.在棋盘上拥有1条公共边的2个方格称为相邻方 ...

  8. bzoj 2281 [Sdoi2011]黑白棋(博弈+组合计数)

    黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是黑色棋子,相邻的棋子颜色 ...

  9. C#黑白棋制作~

    前些天自己复习一下C#语言 做了个黑白棋,望大家看一下,可能有些bug嘿嘿 链接如下 http://files.cnblogs.com/files/flyingjun/%E9%BB%91%E7%99% ...

随机推荐

  1. 使用 MSIX 打包 DotNetCore 3.0 客户端程序

    如何你希望你的 WPF 程序能够以 Windows 的保护机制保护起来,不被轻易反编译的话,那么这篇文章应该能帮到你. 介绍 MSIX 是微软于去年的 Windows 开发者日峰会 上推出的全新应用打 ...

  2. HeadFirst设计模式读书笔记之策略模式

    1. 例子 1. 做一个鸭子模拟器,里面有很多不同的鸭子,有的可以游泳,有的可以睡觉,有的可以呱呱叫,一般套路是定义一个鸭子的超类,在 超类里定义睡觉,游泳,呱呱叫的方法,再让不同的鸭子子类继承这个超 ...

  3. 学习笔记—MySQL基础

    数据库的介绍 mysql数据库介绍 开放源码的轻量级关系型数据库管理系统,体积小.速度快.操作便捷. 数据库的启动和连接 mysql数据库启动 在终端输入以下命令,启动mysql服务器 service ...

  4. C# winform 拖拽效果

    //是否在拖拽 bool isDrag = false; //鼠标相对于button控件左上角的坐标 Point contextbtnPoint = Point.Empty; private void ...

  5. Sharepoint 2013搜索服务配置总结(实战)

    分享人:广州华软 星尘 一. 前言 SharePoint 2013集成了Fast搜索,相对于以前版本搜索的配置有了一些改变,在安装部署Sharepoint 2013时可以选择默认创建搜索服务,但有时候 ...

  6. 你不可不知的Java引用类型之——Reference源码解析

    定义 Reference是所有引用类型的父类,定义了引用的公共行为和操作. reference指代引用对象本身,referent指代reference引用的对象,下文介绍会以reference,ref ...

  7. XE5 搭建DataSnap服务

    1   准备工作 1.1 环境准备 XE5或XE7,操作系统Windows7(64位)操作系统. 数据库MSSQL选择SQLServer2008. 如果数据库服务没有在开发电脑上,则需要在开发电脑上安 ...

  8. vue和angular的区别:

    相同: 1.数据绑定:vue和angular绑定都可以用{{}} 2.都支持内置指令和自定义指令 3.都支持内置过滤器和自定义过滤器. 区别: 1.学习成本和API 设计:vue相比于angular来 ...

  9. Vue.js04:vue样式-通过属性绑定方式为元素设置class类样式

    <!-- 传统写法 --> <h1 class="red thin">这是一个h1标签</h1> <!-- 第一种使用方式,直接传递一个数 ...

  10. Win7/Win8.1升级Win10后屏幕一直闪烁怎么办?

    有些用户在把Win7/Win8.1升级到Win10正式版后,发现屏幕一直不停闪烁,以至于无法正常使用.出现这种情况的原因可能有很多,微软社区的论坛审阅人Alex_Shen给出了一种解决方案:进入安全模 ...