五子棋算杀c语言,五子棋AI算法-算杀(示例代码)
关于剪枝问题
前面讲到的通过Alpha-Beta剪枝和启发式搜索可以将4层搜索的平均时间降低到1秒以下。只有这两个优化方式其实目前最多可以做到6层搜索,就是把AI和玩家各向后推算三步。
6层搜索的棋力其实相当弱,碰到经常玩五子棋的人基本都会输,更不要说对五子棋有研究的玩家。以目前的平均一个节点有50个子节点的搜索方式,把搜索效率提高50倍则可以增加一层搜索深度。而除了前面讲到的AlphaBeta剪枝和启发式搜索,其他的剪枝算法基本都是非安全剪枝。也就是说后序我们会使用一些非安全的剪枝算法来提升搜索效率,而这样做的话,有一定的概率会剪掉一些有益的分支。
这里我们把启发式搜索也当做一种剪枝算法,其实它的实际作用就是剪枝。
克服水平线效应
假设我们目前搜索深度为N层,那么AI只会考虑N层以内的利益,而对N+1层以及以后的局势全然没有任何考虑。那么造成的结果就是AI就是一个视力为N的近视眼,很容易因为N层以内的短期利益而造成大局上的劣势,这就是水平线效应。
如果我们提高搜索深度,依然会存在水平线效应,只是这个水平线会隐藏的更深。想要克服水平线效应,那么就需要在一定情况下对N层以外的节点进行搜索。当然,我们不可能搜索整个博弈树,所以只能在某些前提下进行一些代价不高的深入搜索。
这里我们先实现一种最简单的克服水平线效应的方式-算杀。所谓算杀就是计算出杀棋,杀棋就是指一方通过连续的活三和冲四进行进攻,一直到赢的一种走法。
很显然,同样的深度,算杀要比前面讲的搜索效率高很多。因为算杀的情况下,每个节点只计算活三和冲四的子节点。所以同样是1秒钟的时间,搜索只能进行4层,而算杀很多时候可以进行到12层以上。
为了方便,我们把前面的讲到全面的极大极小值搜索简称为搜索
而且很容易想到,算杀其实也是一种极大极小值搜索,具体的策略是这样的:
MAX层,只搜索己方的活三和冲四节点,只要有一个子节点的能赢即可
MIN 层,搜索所有的己方和对面的活三和冲四节点(进攻也是防守),只要有一个子节点能保持不败即可。
算杀的代码实现如下:
1 /*
2 * 算杀3 * 算杀的原理和极大极小值搜索是一样的4 * 不过算杀只考虑冲四活三这类对方必须防守的棋5 * 因此算杀的复杂度虽然是 M^N ,但是底数M特别小,可以算到16步以上的杀棋。6 */
7
8 /*
9 * 基本思路10 * 电脑有活三或者冲四,认为是玩家必须防守的11 * 玩家防守的时候却不一定根据电脑的棋来走,而是选择走自己最好的棋,比如有可能是自己选择冲四12 */
13
14 var R = require("./role.js");15 var hasNeighbor = require("./neighbor.js");16 var scorePoint = require("./evaluate-point.js");17 var S = require("./score.js");18 var win = require("./win.js");19 var config = require("./config.js");20
21 //找到所有比目标分数大的位置
22 var find = function(board, role, score) {23 var result =[];24 for(var i=0;i
29
30 if(role ==R.empty) {31 var s1 =scorePoint(board, p, R.com);32 var s2 =scorePoint(board, p, R.hum);33 var s = s1+s2;34 if(s >score) {35 p.score =s;36 result.push(p);37 }38 } else{39 var s =scorePoint(board, p, role);40 if(s >=score) {41 p.score =s;42 result.push(p);43 }44 }45 }46 }47 }48 }49 //注意对结果进行排序
50 result.sort(function(a, b) {51 return b.score -a.score;52 });53 returnresult;54 }55
56 var max = function(board, role, deep) {57 var w =win(board);58 if(w == role) return true;59 if(w == R.reverse(role)) return false;60 if(deep < 0) return false;61
62 var points =find(board, role, S.BLOCKED_FOUR);63 if(points.length == 0) return false;64 for(var i=0;i
72 returnm;73 } else{74 return[p];75 }76 }77 }78 return false;79 }80
81 //只要有一种方式能防守住,就可以了
82 var min = function(board, role, deep) {83 var w =win(board);84 if(w == role) return true;85 if(w == R.reverse(role)) return false;86 if(deep < 0) return false;87 var points =find(board, R.empty, S.FOUR);88 if(points.length == 0) return false;89
90 var cands =[];91 for(var i=0;i
102 }103 }104 return cands[Math.floor(cands.length*Math.random())]; //无法防守住
105 }
算杀算法的集成
有了算杀模块之后,我们可以直接对当前棋局进行算杀,但是显然更好的做法是在搜索中进行算杀,通过N层搜索结合M层算杀,我们可以最多搜索到N+M层。
至于如何组合算杀和搜索,最简单的是在每一个非连五的叶节点都进行一次算杀。为了避免算杀出现非最优解,还需要进行迭代加深,具体做法下一章再讲。
五子棋算杀c语言,五子棋AI算法-算杀(示例代码)相关推荐
- Java五子棋小游戏(控制台纯Ai算法)
Java五子棋小游戏(控制台纯Ai算法) 继续之前的那个五子棋程序 修复了一些已知的小Bug 这里是之前的五子棋程序 原文链接 打包源码下载不需要C币,请点击下载连接 配套算法精讲帖子Java五子棋小 ...
- java走棋_Java五子棋小游戏(控制台纯Ai算法)
Java五子棋小游戏(控制台纯Ai算法) 继续之前的那个五子棋程序 修复了一些已知的小Bug 这里是之前的五子棋程序 原文链接 修复了一些算法缺陷 本次增加了AI算法 可以人机对战 也可以Ai对Ai看 ...
- 五子棋对弈程序c语言,五子棋程序纯C语言版.doc
五子棋程序纯C语言版 五子棋程序纯C语言版 //以前发的代码里因为有C++的一点点代码,现在我把那C++的代码改掉.重发出来.//但是这些代码由于编译器的原因,在TC下仍无法运行.请使用VC.#inc ...
- wav文件降噪c语言,音频降噪算法 附完整C代码
降噪是音频图像算法中的必不可少的. 目的肯定是让图片或语音 更加自然平滑,简而言之,美化. 图像算法和音频算法 都有其共通点. 图像是偏向 空间 处理,例如图片中的某个区域. 图像很多时候是以二维数据 ...
- 五子棋博弈树剪枝c语言,五子棋AI博弈树之带Alpha-Beta剪枝的极大极小过程函数...
在博弈树的极大极小过程中是对每一个树节点(称它为全局搜索吧)都要计算其估值,然后在这些估值中做出选择.如果搜索比较大的话,全局搜索的方式效率会非常低,因为有一些节点根本不需要搜索.那么怎么加快搜 ...
- 五子棋棋谱16*16c语言,五子棋开局棋谱大全
梅花步:也叫梅花连环阵.每4子围一子.连续防守才能出现的技巧.(是目前最难破的先手攻杀局,落子有点像围棋) 另外:要素 1.留三不冲四,保留变化 2.防守活三时防在对方攻势强的方向 3.八卦马步是强防 ...
- c语言五子棋毕业设计,基于c语言五子棋小游戏--本科生毕业设计.doc
五子棋小游戏 需求分析 现在有越来越多的人使用电脑,而且五子棋的受众广泛但实体棋操作较为繁琐且平时较难实现,所以电脑版的五子棋游戏应运而生.大家对于这个小游戏的需求如下:首先,设计这个游戏最基本的就是 ...
- 五子棋人机对弈 c语言,五子棋人机对弈系统
********本科毕业论文(设计)任务书 论文(设计)题目:五子棋人机对弈系统 学院:专业:班级: 学生姓名:学号:指导教师:职称: 1.论文(设计)研究目标及主要任务 研究目标: 采用具有一定智能 ...
- 五子棋棋谱16*16c语言,五子棋棋谱
五子棋易学好懂,流传比较广泛,人们也将五子棋称为 连五子 . 连珠;下面是有五子棋棋谱,欢迎参阅. 第一名:寒星局 ┎┬┬┬┬┬┒ 点评:此局是最基本的布局, ┠┼┼●┼┼┨ 也很经典,适合初学者使用 ...
最新文章
- c3p0数据库连接池+mysql数据库基本使用方法
- View工作原理(一)事件传递原理详解
- 8.5 特征选择-机器学习笔记-斯坦福吴恩达教授
- python读取ttf_python解析字体反爬
- 对几种二叉树的简单理解
- python进行数据查询_如何进行python数据库查询?(实例解析)
- 持续集成coding
- html页面授权码,spring boot 2.0 整合 oauth2 authorization code授权码模式
- aix系统下oracle之ora-00471,Oracle RAC 9.2.0.7 (AIX53,HA52)三台主机实例全down的问题
- 线段树(Segment Tree)
- POJ 2996, Help Me with the Game
- 安卓android eclipse运行提示no compatible targets were found
- 前端跨域 ——实践总结,亲测有效
- 中国生物医药产业集群产业战略布局及运营管理模式分析报告2021-2027年
- Android Studio升级到3.5之后xml格式化问题
- Bootstrap框架快速上手
- 计算机硬盘加密的原理,对硬盘加密的加密技术是什么?
- ESXI虚拟机搭建华三vFW2000虚拟防火墙
- python黑客库长安十二时辰 更新_程序员爬取 3 万条评论,《长安十二时辰》槽点大揭秘!...
- JAVA开发与运维(配置中心Apollo的使用)