在我们的五子棋游戏中,黑白两方轮流下子,会产生不同的棋盘局面。对于一个局面来讲又有不同的应对方法,不同的应对方法,接着又会产生不同的局面。

也就是说黑方先下子,白方就有224种落子方法,如果黑方选择了一其中的一步应对,那白方接下来就有223种方案和223种局面。

这样看就是一个又一个的树,但是在一个五子棋游戏里面博弈树的全部遍历有10的41次方个局面,所以我们基本上就是设定一个深度就不在搜索了,用一个评估函数对局势进行判断,用估计值来代替实际的搜索值。而且搜索算法用的就是极大极小的搜索来减少我们搜索的工作量。我们可以把一个五子棋的走步看成,黑方的节点估计值对标乙方子节点的最大值确定,同时乙方从叶节点选的就是越小越对它有利,两者倒退就可以退出根节点的估计值,这样就可以确定根节点的出发的最佳走步。同时为了减少搜索量,将叶节点的评估,跟就算倒退值与树的生成同时进行。就可以减少搜索的数量,还可以保持效果的不便。

//---------搜索当前搜索状态极大值--------------------------------//

//alpha 祖先节点得到的当前最小最大值,用于alpha 剪枝

//beta 祖先节点得到的当前最大最小值,用于beta 剪枝。

//step 还要搜索的步数

//return 当前搜索子树极大值

protected int findMax(int alpha, int beta, int step) {//只有极小值的方法调用了这里

int max = alpha;

if (step == 0) {

return evaluate();

}

int[][] rt = getBests(1 - sbw);

for (int i = 0; i < rt.length; i++) {

int x = rt[i][0];

int y = rt[i][1];

if (getType(x, y, 1 - sbw) == 1) //电脑可取胜

return 100 * ( getMark(1) + step*1000 );

isChessOn[x][y] = 1 - sbw;

// 预存当前边界值

int temp1=x_min,temp2=x_max,temp3=y_min,temp4=y_max;

resetMaxMin(x,y);

int t = findMin(max, beta, step - 1);

isChessOn[x][y] = 2;

// 还原预设边界值

x_min=temp1;

x_max=temp2;

y_min=temp3;

y_max=temp4;

if (t > max)

max = t;

//beta 剪枝

if (max >= beta)

return max;

}

return max;

}

//-----------------------搜索当前搜索状态极小值---------------------------------//

//alpha 祖先节点得到的当前最小最大值,用于alpha 剪枝

//beta 祖先节点得到的当前最大最小值,用于beta 剪枝

//step 还要搜索的步数

//return 当前搜索子树极小值。

protected int findMin(int alpha, int beta, int step) {

int min = beta;

if (step == 0) {

return evaluate();

}

int[][] rt = getBests(sbw);

for (int i = 0; i < rt.length; i++) {

int x = rt[i][0];

int y = rt[i][1];

int type = getType(x, y, sbw);

if (type == 1) //玩家成5

return -100 * ( getMark(1) + step*1000 );

// 预存当前边界值

int temp1=x_min,temp2=x_max,temp3=y_min,temp4=y_max;

isChessOn[x][y] = sbw;

resetMaxMin(x,y);

int t = findMax( alpha, min, step - 1 );

isChessOn[x][y] = 2;

// 还原预设边界值

x_min=temp1;

x_max=temp2;

y_min=temp3;

y_max=temp4;

if (t < min)

min = t;

//alpha 剪枝

if (min <= alpha) {

return min;

}

}

return min;

}

c语言五子棋博弈树代码,五子棋项目的实现(二)博弈树算法的描述相关推荐

  1. C语言三子棋,五子棋,n子棋的代码实现

    C语言三子棋,五子棋,n子棋的代码实现 这里以五子棋为例,来说明开发过程 开发思路 菜单打印 棋盘的打印 棋子的打印 电脑下棋(随机数) 判断输赢 代码整合 注意事项 这里以五子棋为例,来说明开发过程 ...

  2. 简单五子棋游戏c语言简单,C语言制作简单的五子棋游戏

    原标题:C语言制作简单的五子棋游戏 C语言制作简单的五子棋游戏 学习C语言的人很多,但是用C语言很少,而用来为自己所用,来做游戏的人就更少了,很多人都是跟着学校学习,学校讲到哪就坐到哪,但是以后却还是 ...

  3. 基于博弈树的五子棋 AI 算法及其 C++ 实现

    基于博弈树的五子棋 AI 算法及其 C++ 实现 摘要 一   五子棋的游戏规则 二   五子棋对弈的算法描述 2.1 博弈树搜索算法 2.2 α ─ β 剪枝 2.3 估价函数 三   五子棋对弈的 ...

  4. c语言课程设计作业五子棋,c语言课程设计案例-五子棋.ppt

    <c语言课程设计案例-五子棋.ppt>由会员分享,可在线阅读,更多相关<c语言课程设计案例-五子棋.ppt(25页珍藏版)>请在人人文库网上搜索. 1.C语言综合编程训练,C程 ...

  5. C语言简单五子棋两人/五子棋人机

    对于初学C语言的同学,五子棋不可谓不是一个好的练习.我们不但要考虑玩家及电脑的落子,还要考虑棋盘是否已满.是否有一方已经获得胜利.因此我们要考虑好各种情况,设定好函数及循环. 下面是两人五子棋的简单代 ...

  6. c语言课程设计作业五子棋,C语言课程设计之五子棋小游戏.doc

    C语言课程设计之五子棋小游戏.doc C语言课程设计 题目名称:五子棋小游戏 氺氺木木木 专 业计算机类 班 级 *班 指导教师J22 编写日期2016.05.26 目录 TOC \o "1 ...

  7. java五子棋悔棋代码_小猿圈前端编写JS五子棋游戏

    前段时间发的飞机大战的游戏很多小伙伴都私聊让再做个游戏,今天小猿圈web前端讲师为大家分享的是JS五子棋的游戏,想玩的小伙伴记得自己运行一下呦. JS五子棋游戏代码: 五子棋 canvas { dis ...

  8. java五子棋棋盘_java绘制五子棋棋盘代码示例

    本篇文章小编给大家分享一下java绘制五子棋棋盘代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 代码如下: import javax.imag ...

  9. 用python编写五子棋游戏代码

    好的,我可以帮助你写五子棋游戏代码.首先,你需要准备一个二维列表来存储棋盘信息,并为每个玩家准备一个变量来存储他们的棋子颜色.然后,你可以使用一个循环来让玩家交替落子.在每次落子之后,你需要检查该玩家 ...

最新文章

  1. 动态引入/添加js脚本
  2. 使用Beautifulsoup爬取药智网数据
  3. 前端学习(508):水平和垂直居中第一种方式
  4. python 模块和包
  5. 百万 Go TCP 连接的思考: epoll方式减少资源占用
  6. 二十六. Python基础(26)--类的内置特殊属性和方法
  7. 最新搭建GIT服务器仓库
  8. 什么是WAP?wap技术简介(转)
  9. mysql还原数据库非常慢_mysql还原数据库慢
  10. C学习笔记之---八皇后算法
  11. ssh 原理及fingerprint异常处理
  12. python取出列表的第一列_python取第一列
  13. html和js制作个人所得税表格,【JS】计算个人所得税(新版)
  14. 采用JDBC解释java SPI机制和线程上下文类加载器 —————— 开开开山怪
  15. 【中亦安图】导致Oracle性能抖动的参数提醒(4)
  16. 解决Vue运行报js内存溢出问题
  17. 智慧城市水质在线COD监测传感器
  18. 洛谷P3799 妖梦拼木棒 题解
  19. java实现抽奖游戏,java实现抽奖功能解析
  20. 计算机中专专业规划400字,中专计算机专业规划书

热门文章

  1. 【数据库题目复习】期末试卷 一、二
  2. 茅台集团黔茅酒产品介绍
  3. Python append 函数
  4. CCF认证考试题解目录(持续更新)
  5. 华为eNSP 模拟器 配置静态路由
  6. AI智能语音识别算法原理 一
  7. 2013买房靠不靠谱?---“秒杀”三件最蛋疼的房事儿是关键
  8. 流体力学中动力粘度和运动粘度的定义和区别
  9. 搭建私人《我的世界》服务器,使用Cpolar内网穿透更简单
  10. Python中的字典到底是有序的吗