#人工智能课程设计报告-五子棋
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
1.五子棋简介- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 3
2.需求分析- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 3
3.主要名词说明- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 3
4.主要算法- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 4
5.程序运行界面展示- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 7
6.不足说明- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 8
7.心得体会- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 8
1、五子棋简介
选择五子棋游戏作为本设计的课题,是因为该游戏的规则简单,所涉及的方向比较少。这样才能将问题的重点放在人工智能解决上,而非规则的解决,有更多的精力放在高效算法的优化。希望能通过本次系统的设计,整合所学的知识,实现从理论到实践上的升华。
五子棋是起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为“连珠”,英译为“Renju”,英文称之为“Gobang”或“FIR”(Five in a Row的缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。它不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。
五子棋的规则如下:
棋盘:采用15×15的棋盘。
下法:两人分别执黑白两色棋子,轮流在棋盘上选择一个无子的交叉点落子。
输赢判断:黑、白双方有一方的5个棋子在横、竖或斜方向上连接成一线即为该方赢。
2、需求分析
作为五子棋的设计需要考虑到的最基本的需求莫过于人机对战功能的实现,当然还有下棋过程中的悔棋功能以及判断游戏的胜负等方面的要求。当然最好是要考虑到界面的友好性,作为一个娱乐软件,还应该考虑到玩家在游戏时的舒适性,比如可以考虑加入一些背景音乐和音效。
3、主要名词说明
3.1 棋盘数据——m_data
这是一个15*15的二位数组,用来保存当前棋盘的落子数据。其中对于每个成员来说,0表示落黑子,1表示落白子,-1表示无子。
3.2 清空棋盘——Clear
在每一局游戏开始的时候都需要调用这个函数将棋盘清空,也就是棋盘的初始化工作。这个函数主要将m_data中每一个落子位都置为无子状态(-1)。
3.3 初始化操作——Init
对于人机对弈而言,初始化操作包括以下几个步骤:
(1)初始化所有的获胜组合。
(2)如果是计算机先走,则占据天元(棋盘正中央)的位置。
3.4 绘制棋子——Draw
这是很重要的一个函数,它根据参数给定的坐标和颜色绘制棋子。绘制的详细过程如下:(1)将给定的棋盘坐标换算为绘图的像素坐标。
(2)根据坐标绘制棋子位图。
(3)如果先前曾下过棋子,则利用R2_NOTXORPEN将上一个绘制棋子上的最后落子指示矩形擦除。(4)在刚绘制完成的棋子四周绘制最后落子指示矩形。
3.5 左键消息——OnLButtonUp
作为棋盘唯一响应的左键消息,也需要做不少的工作:
(1)如果点击时的鼠标坐标在合法坐标(0, 0)~(14, 14)之外,亦禁止落子。
(2)如果走的步数大于1步,则允许悔棋。
3.6 绘制棋盘——OnPaint
每当WM_PAINT消息触发时,都需要对棋盘进行重绘。OnPaint作为响应绘制消息的消息处理函数使用了双缓冲技术,减少了多次绘图可能导致的图像闪烁问题。这个函数主要完成了以下工作:
(1)装载棋盘位图并进行绘制。
(2)根据棋盘数据绘制棋子。
(3)绘制最后落子指示矩形。
3.7 胜负的判断——Win
这是游戏中一个极其重要的算法,用来判断当前棋盘的形势是哪一方获胜。其详细内容请参见“主要算法”一节。
3.8 悔棋操作——Back
因为是人机对弈,所以计算机是完全允许玩家悔棋的,但是出于对程序负荷的考虑,只允许玩家悔当前的两步棋(计算机一步,玩家一步)。
4、主要算法
4.1 判断胜负
五子棋的胜负,在于判断棋盘上是否有一个点,从这个点开始的横竖斜四个方向是否有连续的五个同色棋子出现,如图1:
图1
这个算法就是Win函数。从设计的思想上,需要它接受一个棋子的参数,然后返回一个值,这个值来指示是否胜利,代码如下:
int x, y;
for ( y = 0; y < 15; y++ ) // 判断横向
{for ( x = 0; x < 11; x++ )
{if ( color == m_data[x][y] &&color == m_data[x + 1][y] &&color == m_data[x + 2][y] &&color == m_data[x + 3][y] &&color == m_data[x + 4][y] )
{return TRUE;}}}
for ( y = 0; y < 11; y++ ) // 判断纵向