棋类游戏的算法有哪些
棋类游戏的算法有哪些
棋类游戏通常包含三大要素:棋盘、棋子和游戏规则,其中游戏规则又包括胜负判定规则、落子的规则以及游戏的基本策略。下面我来给大家讲讲各类棋类游戏的算法。
除了棋盘和棋子的建模,棋类游戏最重要的部分就是AI算法的设计。目前棋类游戏的AI基本上就是带启发的搜索算法,那么常用的搜索算法有哪些呢?
1. 博弈与博弈树
博弈可以理解为有限参与者进行有限策略选择的竞争性活动,比如下棋、打牌、竞技、战争等。根据参与者种类和策略选择的方式可以将博弈分成很多种,比如“二人零和、全信息、非偶然”博弈,也就是我们常说的零和博弈(Zero-sum Game)。所谓“零和”,就是有赢必有输,不存在双赢的结果。所谓“全信息”,是指参与博弈的双方进行决策时能够了解的信息是公开和透明的,不存在信息不对称的情况。比如棋类游戏的棋盘和棋子状态是公开的,下棋的双方都可以看到当前所有棋子的位置,但是很多牌类游戏则不满足全信息的条件,因为牌类游戏都不会公开自己手中的牌,也看不到对手手中的牌。所谓的“非偶然”,是指参与博弈的双方的决策都是“理智”的行为,不存在失误和碰运气的情况。
在博弈过程中,任何一方都希望自己取得胜利,当某一方当前有多个行动方案可供选择时,他总是挑选对自己最为有利同时对对方最为不利的那个行动方案。当然,博弈的另一方也会从多个行动方案中选择一个对自己最有利的方案进行对抗。参与博弈的双方在对抗或博弈的过程中会遇到各种状态和移动(也可能是棋子落子)的选择,博弈双方交替选择,每一次选择都会产生一个新的棋局状态。
假设两个棋手(可能是两个人,也可能是两台计算机)MAX和MIN正在一个棋盘上进行博弈。当MAX做选择时,主动权在MAX手中,MAX可以从多个可选决策方案中任选一个行动,一旦MAX选定某个行动方案后,主动权就转移到了MIN手中。MIN也会有若干个可选决策方案,MIN可能会选择任何一个方案行动,因此MAX必须对做好应对MIN的每一种选择。如果把棋盘抽象为状态,则MAX每选择一个决策方案就会触发产生一个新状态,MIN也同样,最终这些状态就会形成一个状态树,这个附加了MAX和MIN的决策过程信息的状态树就是博弈树(Game Tree)。
2. 极大极小值搜索算法
极大极小值(Min-Max)搜索算法是各种博弈树搜索算法中最基础的搜索算法。假如MAX和MIN两个人在下棋,MAX会对所有自己可能的落子后产生的局面进行评估,选择评估值最大的局面作为自己落子的选择。这时候就该MIN落子,MIN当然也会选择对自己最有利的局面,这就是双方的博弈,即总是选择最小化对手的'最大利益(令对手的最大利益最小化)的落子方法。作为一种博弈搜索算法,极大极小值搜索算法的名字就由此而来。
3. 负极大值搜索算法
博弈树的搜索是一个递归的过程,极大极小值算法在递归搜索的过程中需要在每一步区分当前评估的是极大值节点还是极小值节点。1975年Knuth和Moore提出了一种消除MAX节点和MIN节点区别的简化的极大极小值算法,称为负极大值算法Negamax。该算法的理论基础是:
max(a,b) = -min(-a, -b)
简单地将递归函数MiniMax()返回值取负再返回,就可以将所有的MIN 节点都转化为MAX节点,对每个节点的搜索都尝试让节点值最大,这样就将每一步递归搜索过程都统一起来。
4. “α-β”剪枝算法
有很多资料将“α-β”剪枝算法称为“α-β”搜索算法,实际上,它不是一种独立的搜索算法,而是一种嫁接在极大极小值算法和负极大值算法上的一种优化算法。“α-β”剪枝算法维护了一个搜索的极大极小值窗口:[α,β]。其中α表示在搜索进行到当前状态时,博弈的MAX一方所追寻的最大值中最小的那个值(也就是MAX的最坏的情况)。在每一步的搜索中,如果MAX所获得的极大值中最小的那个值比α大,则更新α值(用这个最小值代替α),也就是提高α这个下限。
而β表示在搜索进行到当前状态时,博弈的MIN一方的最小值中最大的那个值(也就是MIN的最坏的情况)。在每一步的搜索中,如果MIN所获得的极小值中最大的那个值比β小,则更新β值(用这个最大值代替β),也就是降低β这个上限。当某个节点的α≥β时,说明该节点的所有子节点的评估值既不会对MAX更有利,也不会对MIN更有利,也就是对MAX和MIN的选择不会产生任何影响,因此就没有必要再搜索这个节点及其所有子节点了。
5. 估值函数
对于很多启发式搜索算法,其“智力”的高低基本上是由估值函数(评估函数)所决定,棋类游戏的博弈树搜索算法也不例外。
估值函数的作用是把一个棋局量化成一个可直接比较的数字,这个数字在一定程度上能反映取胜的概率。棋局的量化需要考虑很多因素,量化结果是这些因素按照各种权重组合的结果。这些因素通常包括棋子的战力(棋力)、双方棋子占领的空间、落子的机动性、威胁性(能吃掉对方的棋子)、形和势等。
6. 置换表与哈希函数
置换表(transposition table)也是各种启发式搜索算法中常用的辅助算法,它是一种以空间换时间的策略,使用置换表的目的就是提高搜索效率。一般情况下,置换表中的每一项代表者一个棋局中最好的落子方法,直接查找置换表获得这个落子方法能避免耗时的重复搜索,这就是使用置换表能大幅提高搜索效率的原理。
使用置换表最大的问题是置换表的组织和查找的效率。一般来说,置换表越大,查找的命中率就越高。但这个关系不是绝对的,当置换表大小达到一定规模后,不仅不会再提高命中率,反而会因为耗时的查找操作影响算法的效率。所以置换表不是越大越好,需要根据计算机的性能以及搜索的深度选择一个合适的大小。此外,为了查找操作更高效,通常都会用可直接访问的哈希表方式组织置换表,哈希函数的性能就成为影响置换表性能的重要因素。棋类游戏普遍采用Zobrist哈希算法。
LOL有没有很有用的游戏算法公式?
LO里的穿甲算法你了解吗?作为英雄联盟的老玩家,在怀旧老版LOL的同时,也对曾经游戏的氛围感慨万千。在S2时期,玩家很少讨论LPL战队,大家关心LPL战队的输赢,却不在乎比赛的过程。他们认为与其看职业比赛来学游戏技术,还不如揣摩一下若风的国服第一系列,亦或大司马的多边形打野。老玩家们甚至会为了LOL...
二十四点游戏3,4,-6,10有几种算法
四种 3×[10+4+(-6)]=24 3×(10-4)-(-6)=24 10-4-3×(-6)=24 4-(-6)×10÷3=24
游戏开发中会用到哪些常用AI算法
现在也流行一些跨平台的编程引擎,例如cocos2d-x、unity 3D等。接下来,再看看游戏开发的课程,游戏开发的课程除了理论知识还包括软件的操作。C++程序基础:通过学习C++语言,奠定编程基础。使用VS.net2005编译工具,高效构建代码。算法与数据结构:通过学习算法与数据结构的基本概念,了解常用的数据结构及相关...
战棋类游戏移动范围的算法
用1,2,3分别表示●为当前位置,※为障碍物,□为可移动到的地点 0为不是地图中的可见位置 整理数组,9*8的数组,障碍物的坐标给出后,循环检查每个数是3的则是可移动地点!~如果是寻路的话,有寻路算法!
通用AlphaGo诞生?MuZero在多种棋类游戏中超越人类
最受欢迎的方法是基于无模型强化学习的方法,即直接从智能体与环境的交互中估计优化策略和\/或价值函数。但在那些需要精确和复杂前向搜索的领域(如围棋、国际象棋),这种无模型的算法要远远落后于 SOTA。研究者在57个不同的雅达利游戏中评估了MuZero,发现该模型在雅达利2600游戏中达到了SOTA表现。此外,...
即时战略游戏(比如 WAR3)的 AI 是怎样实现的?
即使设计公司神经病般的决定如此设计,每当你的游戏有更新,兵种变化,数据变化,整个算法就要重新训练,玩家需要重新下载AI的全部内容,对用户的体验和公司的工作效率都有损害。战略类游戏的AI,还是有限状态机。根据不同情况分类做不一样的事情,全都设计好,设计的尽量详细,就OK了。关于其复杂度:这类...
游戏打出伤害的算法
伤害计算公式就是多个乘区相乘。(乘区:每个词条属性为一个乘区)。由此可以看出想要在游戏中打出大的伤害只有每个属性发展均衡,伤害才会最大化。
排列五中奖号的算法有哪些技巧?
排列五的和值计算方法是将五个位置上的数字相加,得到的总和就是排列五的和值。排列五是一种基于数字的彩票游戏,通常由五个数字组成的一注号码进行投注。这五个数字可以是任意的0-9之间的整数,且顺序不限。和值,就是这五个数字加起来的总和。例如,如果我们有一注排列五的号码:3、8、6、1、9...
用C++编写一个“投掷双骰子”游戏,具体的核心算法是什么啊!
一.rand()函数产生0到32767范围内的整数。 二.有且仅有5种规则立方体的所有面的形状和大小都相同(四、六、八、十二、二十面)。 三.算法:⒈把随机数除以6(面数)取余数,余数在0到5间的整数;⒉余数加一,得1到6的整数;⒊因为骰子有不同的面数,因此把第一步的面数用变量sides代替...
游戏场景管理的八叉树算法是怎样的?
八叉树(octree)是三维空间划分的数据结构之一,它用于加速空间查询,例如在游戏中: 加速用于可见性判断的视锥裁剪(view frustum culling)。加速射线投射(ray casting),如用作视线判断或枪击判定。 邻近查询(proximity query),如查询玩家角色某半径范围内的敌方NPC。碰撞检测的粗略阶段(broad phase...
邬仁万吉: 自走棋手游分数的计算是非常关键的,很多小伙伴好奇分数怎么计算?小编整理了相... MMR算法决定MMR变化的算法简单明了.首先,计算对局平均段位→用你的段位和...
封开县18758994222: 极大极小值算法有什么优缺点? - ?
邬仁万吉: Minimax算法常用于棋类等由两方较量的游戏和程序.该算法是一个零总和算法,即一方要在可选的选项中选择将其优势最大化的选择,另一方则选择令对手优势最小化的一个,其输赢的总和为0(...
封开县18758994222: 单机版的五子棋程序的算法是什么哦! - ?
邬仁万吉: 五子棋是一种受大众广泛喜爱的游戏,其规则简单,变化多端,非常富有趣味性和消遣性.这里设计和实现了一个人机对下的五子棋程序,采用了博弈树的方法,应用了剪枝和最大最小树原理进行搜索发现最好的下子位置.介绍五子棋程序的数...
封开县18758994222: Minimax怎么使用 - ?
邬仁万吉: Minimax算法又名极小化极大算法,是一种找出失败的最大可能性中的最小值的算法. 概述 Minimax算法常用于棋类等由两方较量的游戏和程序.该算法是一个零总和算法.如果我的回答对您有帮助希望您可以采纳,谢谢!
封开县18758994222: 电脑下棋的原理是什么?请详细一些.不要太深奥. - ?
邬仁万吉: 程序 差分法 就是说你下一步棋 程序会把所有的可能性都比较一遍 然后根据程序设定的差分法 选择最优
封开县18758994222: 高分求算法:关于井字棋(三子棋)的算法!!面谈感谢!!!! - ?
邬仁万吉: “井字棋”游戏(又叫“三子棋”),是一款十分经典的益智小游戏,想必很多玩家都有玩过.“井字棋”的棋盘很简单,是一个3*3的格子,很像中国文字中的“井”字,所以得名“井字棋”.“井字棋”游戏的规则与“五子棋”十分类似,...
封开县18758994222: 求Java五子棋斜方向的判断思路 - ?
邬仁万吉: 界面思路:用按钮数组模拟棋盘.改变按钮的背景图片标志这个棋盘的格子上是黑棋、白棋、空.同时使用一个二维数组记录棋盘棋子的分布,比如qipan[0][0]=1标示第1行第一列的棋子是黑棋子,乙烯类推.循环检测是否某行、某列、某斜线...
封开县18758994222: 围棋怎样算半子? - ?
邬仁万吉: 在中国规则中没有半子的算法,只有在日韩规则的比目法中才会出现赢半目或者输半目的.因为中国规则实行的是黑贴3又3/4子,在终局点子的时候,尾数只会出现四分之三子或四分之一子,绝不会出现半子的情况!只有日韩规则中黑贴6目半时尾数才会出现输赢半目
封开县18758994222: 电脑下棋程序设计原理? - ?
邬仁万吉: 棋类游戏一般都能建立起数学模型,电脑做的只是判断这一步棋的下一步的每种可能走法,以及每种走法的下一步……以此类推,也就是说电脑能判断下一步怎么走,才能对自己在下下一步以致以后的多少步内都对自己有利.随着电脑预测的步数的增加,计算量成指数级增加,计算时间也会更长,这样,除了棋类程序的算法因素以外,考验的就是计算机的CPU计算速度了~所以要在电脑的“预测能力”和等待时间之间取一个折中的步数,比如20步.1997年IBM的“深蓝”战败世界棋王卡西帕罗夫,就是因为他的计算机的计算能力是当时世界顶尖的.
封开县18758994222: 战棋类游戏移动范围的算法 - ?
邬仁万吉: 你看一下下面两篇,战棋是穷举法寻路的较多 http://dev.gameres.com/Program/Abstract/SLGPath.htm http://dev.gameres.com/Program/Abstract/SLGMove.htm