C++编写的黑白棋.doc

C++编写的黑白棋.doc

ID:58807473

大小:68.50 KB

页数:18页

时间:2020-09-27

C++编写的黑白棋.doc_第1页
C++编写的黑白棋.doc_第2页
C++编写的黑白棋.doc_第3页
C++编写的黑白棋.doc_第4页
C++编写的黑白棋.doc_第5页
资源描述:

《C++编写的黑白棋.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、黑白棋实验报告我的黑白棋程序共分为两个大部分,UI部分和AI部分,分别通过若干个函数实现。UI部分包括基本规则实现、界面设计、悔棋、存档读档、提示功能。AI部分包含搜索与剪枝、估价函数。一、UI部分介绍1、规则黑白棋又叫翻转棋,棋盘为8*8正方形,有黑色和白色两种棋子,交替下棋,每次新下棋子和其他己方棋子夹住的对方棋子翻转为己方颜色。目前评价黑白棋棋力高低和局面优劣的主要参考标准包括:行动力,稳定子,外部子,内部子,奇偶性等等。2、界面界面为DOC命令行界面,用户使用鼠标点击菜单和棋盘。读取鼠标点击

2、位置时使用ReadConsoleInput函数。游戏菜单包括新游戏和读档,新游戏需要点击选择人人对战/人机对战;先手/后手;难度。游戏开始后界面为字符画出的棋盘,每次电脑下棋后更新棋盘位置。通过光标定位输出改变棋盘位置,避免连续刷屏给玩家带来不适。每次更新状态后提示可下棋位置,方便玩家选择。玩家点击棋盘上的位置即可下棋,点击无效位置无反应。玩家在每次下棋时也可以点击菜单,菜单包括5个选项:存档,读档,悔棋,退出,作弊。每个子菜单均可返回主菜单。下面一一介绍各自功能的作用和实现方式。3、悔棋悔棋功能即

3、为返回上一步下棋之前的状态,通过数组记录前一步棋盘状态,悔棋时返回上一步棋盘状态。悔棋功能可以无穷悔棋,如果已经是开局状态会提示无发悔棋。4、存档与读档存档和读档通过二进制文件流实现,共有三个存档位置,存在游戏安装目录下,存档时可选择三个存档中的一个存档。读档是若读取的是未存储的存档位置,会提示重新读档。5、提示功能提示功能是这个程序比较独特的功能之一,主要是在玩家不知道该怎么下时可以由AI代替玩家下一步棋,实现较为简单。一、AI部分介绍1、最大最小值搜索AI部分的主干采取的是博弈问题中常见的敌对搜

4、索,原理较为简单,不在过多赘述。模拟自己下棋以及对手下棋,当到达一定深度时通过估值函数给出对局面的估价。然后再对手下棋层取子节点中的最小值(对手不想让“我”赢),自己下棋的层取子节点最大值。2、剪枝:α-β剪枝和节点排序Alpha-beta剪枝是敌对搜索中较为常见的最优性剪枝,由于每层中先搜索的节点(为简单,以下称为兄节点)的返回值实际上给出了本层同父节点(上一个节点相同)的界限,例如在最小值节点A的子节点中a的返回值为5,那么A的返回值至多为5。若A的兄节点B的返回值为6,则AB的父节点X必定不会

5、取A的值。故A节点的其他子节点的搜索已经无意义。此时A节点直接返回5。我们发现在α-β剪枝中剪枝的效率同节点搜索顺序有极大关系,如果最先搜索的是最优解,那么剪枝效率极高。如果在最糟糕的情形下,先搜索的节点总比后搜索的节点糟糕,那么实际上不会进行剪枝。由此产生了对剪枝的进一步优化:节点排序。节点排序是在搜索之前先对所有待搜索的点做一步预搜索(本程序中采用的是直接估值的方式),按照大小顺序排序之后。按顺序进行搜索。这样先搜索的枝则有较大可能为较优枝,而预搜索层数很少,所以在时间上代价并不大。1、估价函数

6、估价函数是决定棋力高低的重要因素,较常见的估价包括行动力(可以下棋的位置)、稳定子、内部子(相对稳定子),外部子(危险子)、奇偶性(最后一步谁下)。因为估价函数的复杂性会使得AI思考时间迅速上升,故在折中考虑以及多次实践之后,我采取了以行动力为主,同时对于绝对稳定子(四个角上的子)和最大危险子(2,22,77,27,7)进行考虑。在试验多次后和考虑全部稳定子相比差距并不大,而时间上略有减少。因此采用这种方式。2、残局搜索(终局搜索)黑白棋在即将结束时的考虑因素和中局不太相同,中局时主要考虑稳定子和行

7、动力。但是在残局时应该考虑最多的是最终棋子数目,而且残局是可下棋位置逐渐变少,搜索层数限制的不大,因此在残局时直接搜索至游戏结束,从中选出必胜策略。代码:文件1:“MyFunction,h”#include#include#include#include#include#include#include#include#include#include<

8、conio.h>#includeusingnamespacestd;/*引用外部变量*/externHANDLEhout;externHANDLEhin;externINPUT_RECORDmouseRec;//控制台输入信息externDWORDres;externstringsidestr[3];//输出字符externintturn_side[2];//表示走棋次序对应黑棋/白棋externintdir[8][2];//方向externin

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。