- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
井字棋策略
一、问题描述
井字棋的棋盘是一个九宫格(即3×3的方格),因此通常可以在纸上画一个井字来做棋盘用,井字棋因此得名。下棋时双方交替向棋盘上布子,每个棋子要落在尚无棋子的方格内。棋子落下后不能移动,无吃子一说。当其中任意一方有三个棋子连成一线(横向、纵向或斜向均可)时,即为“胜”,另一方为“负”。如果棋盘上9个棋格都摆满了棋子,双方都没有连成一线的三子,即为“和棋”。在对弈问题中计算机操作的数据对象是每走一步棋后形成的棋盘状态(格局)对每一个格局来说它的下一步棋都有若干不同的走法这样一层一层就形成了一个状态空间树。
处于某一格局时计算机又是如何选择走下一步棋呢? 当然是选择对自己有利的格局而电脑是如何识别有利的格局?一般是使用一个估价函数对每个格局进行“估价”假设估价函数值越大表示对电脑走棋越有利那么电脑在走下一步棋时只要搜索出估价函数值最大的格局即可。实际上很难找到一个准确的函数来完全反映复杂的格局但希望它尽可能的接近。
在井棋中如果计算机赢value = + 1 ,对手赢value = - 1 ,平局value = 0 ,而这些格局可作为博奕树的终端结点对于非终端结点,电脑走棋会选估价函数值高的格局,当然对手走棋会选函数值低的格局,这样非终端结点的函数值就由其下层结点的这种最大最小交替递归调用得到,称为最小最大搜索算法。在图1 中,格局B、C 因对手走一步棋即赢,函数值为- 1 ,格局E 因电脑走一步棋即赢,函数值为+ 1 ,格局G平局,函数值为0 ,格局F 为电脑下棋,函数值F = Max( G) = 0 ,格局D 为对手下棋,D =Min(E ,F) = 0 ,格局A 为电脑下棋,A =Max(B ,C) = 0。下面给出这种最小最大搜索算法中,电脑和对手的走棋程序
int comp ( Int move)
{
int i ,response ,p ;
int value = - 2 ; 设临时最大值初始为- ∞
if (full () ) return(0) ;棋盘满为平局
if (win-comp () ) return(1) ;走一步棋,计算机赢
for (i = 0 ;i 9 ;i + + )测试棋盘上所有方格
if (chess[ i ] = = 0) 方格未落子
{chess[ i ] = 1 ;计算机下子为1
response = human() ;
chess[ i ] = 0 ;恢复棋盘
if (response value)
{ value = response ;
move = i ; }
}
return value ;
}
int human(int move)
{
int i ,response ,p ;
int value = 2 ; 设临时最小值初始为+ ∞+
if (full () ) return (0) ;
if (win- human() ) return ( - 1) ; 走一步棋,对手赢
for (i = 0 ;i 9 ;i + + )
if (chess[ i ] = = 0)
{chess[ i ] = 2 ; 对手下子为2
response = comp (p) ;
chess[ i ] [ j ] = 0 ; 恢复棋盘
if (response value)
{ value = response ;
move = I ;}
}
return value ;
}
对于一些更加复杂的游戏,如国际象棋、跳棋、五子棋等,要想搜索到终端结点是很困难的,甚至是不可能的,我们可以往下搜索几层,把最低一层看成终端结点,其估价函数值根据对格局的分析近似得出。
2. 设计方案
2.1 设计步骤
本程序最主要的任务是完成图形界面的井字棋的人机对弈模块的设计。在人机对弈过程中,计算机方所采用的算法,也就是博弈树的搜索技术是最重要的。所以,设计时,作者按照以下步骤进行:
(1) 选定博弈算法;
(2) 建立一个简单的应用程序(如字符界面程序)来测试算法;
(3) 选定图形界面中要实现的其他功能(如双人对弈、悔棋、难易级别选定、联机对战等);
(4) 实现图形界面的井字棋程序。
所采用的核心算法为极大极小值算法。极大极小值算法的核心是将搜索树的层分为MAX层和MIN层,MAX层和MIN层交替相邻(即,一个节点如果在MAX层,则其子女节点在MIN层;如果在MIN层,则其子女节点在MAX层),在MAX层的节点的评估函数值取其子女节点中的最大者,在MIN层的节点的评估函数值取其子女节点中的最小者。
此外,需要定义一个评估函数来计算叶节点的评估函数值,要注意将某方获胜的状态节点的评估函数值设为计算机能表示的最
文档评论(0)