还剩19页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
目录
一、!--[endif]--摘要五子棋游戏是一历史悠久,对抗性强,技巧性高的棋类游戏本文用VC
6.0设计了五子棋游戏并就以下问题进行了探讨!--[if!supportLists]--
(1)!--[endif]--棋子棋盘在程序中的表示;!--[if!supportLists]--
(2)!--[endif]--如何通过鼠标__落子;!--[if!supportLists]--
(3)!--[endif]--如何判断输赢,在棋盘的—,|,/,\,四个方向进行搜索,超过5子以上连成一线则认为赢了!--[if!supportLists]--
(4)!--[endif]--如何实现梅棋功能!--[if!supportLists]--
(5)!--[endif]--如何保存并读入棋谱;!--[if!supportLists]--
(6)!--[endif]--如何让电脑拥有人类的智慧;!--[if!supportLists]--
(7)!--[endif]--编写软件代码应遵守的编写规范,成对编码原则和代码的注释;!--[if!supportLists]--
(8)!--[endif]--其它未详尽处,请参看源代码
二、关键字棋盘数组搜索算法人工智能活半活双活
三三、程序主要类结构图!--[if!vml]--!--[endif]--!--[if!mso]--!--[endif]--CfiveStoneApp!--[if!mso]--!--[endif]--!--[if!mso!vml]--!--[endif]--!--[if!vml]--!--[endif]--!--[if!vml]--!--[endif]--
四、需求分析五子棋历史源远流长,发展形势喜人,以下在网络上一篇有关五子棋历史发展的报道五子棋是起源于中国古代的传统黑白棋种之一现代五子棋日文称之为“連珠”,英译为“Renju”,英文称之为“Gobang”或“FIR”FiveinaRow的缩写,亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接它是中西文化的交流点,是古今哲理的结晶 五子棋起源于古代中国,发展于__,风靡于欧洲对于它与围棋的关系有两种说法,一说早于围棋,早在“尧造围棋”之前,民间就已有五子棋游戏;一说源于围棋,是围棋发展的一个分支在中国的文化里,倍受人们的青睐古代的五子棋的棋具与围棋相同,纵横各十七道五子棋大约随围棋一起在我国南北朝时先后传入朝鲜、__等地据__史料文献介绍,中国古代的五子棋是经由高丽朝鲜,于1688年至1704年的__元禄时代传到__的到__明治32年公元1__9年,经过公开征名,“连珠”这一名称才被正式确定下来,取意于“日月如合壁,五星如连珠”从此,连珠活动经过了不断的改良,主要是规则的变化即对执黑棋一方的限制,例如,1__9年规定,禁止黑白双方走“双三”;1903年规定,只禁止黑方走“双三”;1912年规定,黑方被迫走“双三”亦算输;1916年规定,黑方不许走“长连”;1918年规定,黑方不许走“
四、
三、三”;1931年规定,黑方不许走“双四”,并规定将19×19的围棋盘改为15×15的连珠专用棋盘本世纪初五子棋传入欧洲并迅速风靡全欧通过一系列的变化,使五子棋这一简单的游戏复杂化、规范化,而最终成为今天的职业连珠五子棋,同时也成为一种国际比赛棋 目前,职业连珠已迅速在国际上发展起来1988年8月8日,国际连珠联盟RIF由__、___、瑞典、亚美尼亚、阿塞拜疆、爱沙尼亚、法国、拉脱维亚、白___等9个成员国在瑞典宣告创立,我国于1996年正式加入国际连珠联盟,现在全世界已有47个国家和地区成为国际连珠联盟的正式会员职业连珠的世界锦标赛从19__年起每两年举办一次,现已举办了六届,第
三、
五、六届的冠军是爱沙尼亚人,其余三届的冠军都是__人我国最好成绩是团体第七,个人张进宇第9名就水平而言,目前以___、__、瑞典最强,其中__研究也最深,我国只处于中等水平__拥有自己的五子棋职业棋手,并且对连珠技术的研究也相当普遍和全面__每年__连珠名人战 五子棋的根在中国,有着广泛的群众基础但与世界先进的五子棋技术相比,我们的棋艺水平还很低,所以我们要__五子棋,宣传五子棋,争取在较短的时间内赶上和超过世界五子棋坛的先进水平1990年,由那威和十几名五子棋爱好者,共同发起并成立了中国第一个现代职业五子棋的民间组织----京都五子棋队,现已发展成为拥有百余名选手的北京京都五子棋队__连珠联盟曾多次派代表团访问中国,与中国广大爱好者进行交流和友谊比赛,瑞典连珠联盟也于1995年派代表团访问了中国,京都五子棋队曾两次选派选手代表中国参加世界杯比赛,取得此成绩反映了我国五子棋水平在世界上所处的位置,同时也显示了我国在此项运动中的发展潜力1997年5月北京成功地举办了第一届“康柏杯”国际五子棋名人邀请赛,引起了国际棋联的极大重视,并在第四十四届棋联会议上提出“中国作为五子棋的发源国,不仅回到了国际大家庭中来,更重要的是对五子棋在下个世纪的发展起到了世界性的推动作用,并将为国际连珠棋成为__项目做出贡献”“中___智慧火种,往往使外国人得以燎原,反过来,燎原的火焰必将照亮火种的源头”如上文所述,五子棋既简单易学,又有其内涵和深度;集娱乐性和对抗性为一体,是一款为老、少、中各年龄阶段的人所喜欢的棋类游戏
五、关键部分设计算法及实现系统地将五子棋程序完成,是有一定难度的现将其关键部分的实现过程描述如下!--[if!supportLists]--
1、!--[endif]--如何表示棋盘棋子五子棋棋盘由15*15横竖线交叉绘制而成,落子点在横竖的交叉点上采用15*15的二维数组表示棋盘,每个数组元素表示一个交叉点,用数组的值表示棋子以0表示未落子;以1表示黑子;以2表示白子注在程序中棋盘数组在FIVE.H中定义,是一全局数组;longFiveChess
[15]
[15];在主程序FIVE.C中初始化forintI=0;I15;I++forintj=0;j15;j++FiveChess[I][j]=0;刚开始时棋盘中未落一子,故全部交叉点为0!--[if!supportLists]--
2、!--[endif]--如何用鼠标落子算法当程序在棋盘上__一次后,捕获这个鼠标__位置,如果这个点的位置在棋盘在棋盘范围内,则认可这一鼠标__,否则,则认为这次鼠标__无效若鼠标__在棋盘范围之内,则还要进一步判断,在这个位置是否已经落下了子,如果是也认为此次__无效,如不是,则在棋盘数组填写相应的数据(或1或2),并相应的位置画出一个棋子具体实现当用户在程序窗口__一次鼠标后,松开后,进入窗口过程的消息分支WM_LBUTTONUP;在这个消息中的参数lParam中带有鼠标__松开时的位置(x坐标,y纵坐标),放到一个用POINT定义的结构中POINTpp;pp.x=LOWORDlParam;//x纵坐标pp.y=LOWORDlParam;//y纵坐标接下来判定__坐标是否超出棋盘范围,在程序中,棋盘范围在窗口的(30,30,402,402)这个矩形范围中故用下面语句判断是否越位Ifpp.x30||pp.y30break;Ifpp.x.402||pp.y402break;//超出范围而退出,等待下一次按键落子下一步POINTArrayPp=PositionToPositionpp;把刚才棋盘范围内的有效__屏幕坐标转为棋盘数组坐标,012345678910111213145050!--[if!vml]--!--[endif]--!--[if!vml]--!--[endif]--400400例100,100转化成棋盘数组为1,1再对刚才ArrayPp所表示的棋盘位置进行判断是否有子;ifFiveChess[ArrayPp.x][ArrayPp.y]!=0{break;//退出,等待下一次按键}如无子,则在相应的棋盘数组中填写数据FiveChess[ArrayPp.x][ArrayPp.y]=1;或FiveChess[ArrayPp.x][ArrayPp.y]=2;并在相应的位置画好棋子;hdc1=GetDChWnd;hMemDc1=CreateCompatibleDChdc1;SelectO__ecthMemDc1hBlack;//黑子SelectO__ecthMemDc1hWhite;//白子BitBlthdc1pp.xpp.y2424hMemDc100SRCCOPY;DeleteDChMemDc1;ReleaseDChWndhdc1;!--[if!supportLists]--
3、!--[endif]--如何判输赢;算法每下一子则在-、|、/、\四个方向搜索一次,如果有五颗或五颗同一色棋子在同一线上,则判该方胜搜索算法如下置开始点和终止点坐标POINTstartend;都初始化为该点位置;whilestart上面一个位置不为空或异色子{start=上面的位置坐标;}whileend下面一个位置不为空或异色子{start=下面的位置坐标;}注-左面为上面,右面为下面;|上面为上面,下面为下面;/上面为上面,下面为下面;\上面为上面,下面为下面;如果end与start之间位置大于等于5,则认为该方赢具体实现见KERNEL.H中SEARCH()函数,则函数返回50,则表示赢了!--[if!supportLists]--
4、!--[endif]--如何实现悔棋功能和撤消悔棋功能悔棋一步算法首先设置好一全局数组,每下一步棋把相应的位置记录在该数组中,悔棋时只需要把该数组最后一次记录的位置所对应的棋盘数组中的值置为0,然后再根据棋盘数组中的数组,重复绘制一次棋盘棋子即可撤消悔棋算法同样定义一个全局数组,上面悔棋过程中每悔一步,把悔棋的位置记到该数组,撤消悔棋只需要把最后一次记录的撤消悔棋数组所对应的棋盘数组置为1或2即可具体实现见FIVE.H中__INWNDPROC()中的IDM_OPERATE_PREVIOR:分支(悔棋一步)IDM_OPERATE_BACK:分支(撤消悔棋)!--[if!supportLists]--
5、!--[endif]--如何保存并读入棋谱算法保存棋谱由于棋子的所有信息都保存在棋盘数组中,所以只需要把棋盘数组中内容存储进文件即可读入棋谱与前面相反,把文件中的数据读进棋盘组中,然后要求程序根据新棋盘数组的内容重绘一次即可具体实现见FIVE.H中的OPEN_CHESS_FAMILY和S__E_CHESS_FAMILY
6、五子棋中的人工智能:1首先定义两个数组用于表示每个未下的点的重要程度(用数字区别这个重要程度)两个数组分别定义为BlackSituation
[15]
[15]
[5]//表示白子(在下棋的时候可以敌方,也可以代表已方)WhiteSituation
[15]
[15]
[5]//表示黑子(在下棋的时候可以敌方,也可以代表已方)
[15]
[15]表示有15*15个点后面的
[5]表示每个点有四个方向和一个汇总数据0,分别是—横1,|(竖2),/(斜线3),\(反叛斜线4);例如(见图见表)!--[if!supportLists]--
(1)!--[endif]--!--[if!vml]--!--[endif]--在
(57)这个点落一子,横方向(对于黑子)只能构成成一个活一,故BlackSituation
[5]
[7]
[1]=4;!--[if!supportLists]--2!--[endif]--而
(57)这个点上落一子,竖方向(对于黑子)能构成一个活四,故BlackSituation
[5]
[7]
[2]=16384;3而
(57)这个点上落一子,横方向(对于白子)能构成一个活一,故BlackSituation
[5]
[7]
[2]=4;
(4)而
(57)这个点上落一子,反斜线方向(对于白子)能构成一个活二,活半活5262144565536416384440963102432562642161411修正数据双活三修正值说明_____大于半活四故BlackSituation
[5]
[7]
[2]=64;其它以此类推2按这个规则把所求的各个方向值汇总到BlackSituaiton[x][y]
[0]WhiteSituaiton[x][y]
[0]中3)然后把BlackSituaiton[x][y]
[0]和WhiteSituaiton[x][y]
[0]相加得到一个总的数值4)在BlackSituation[x][y]
[0]和WhiteSituaiton[x][y]
[0]相加的结果中,选出最大的值其坐标为作为电脑下子点这个数字,即包括了进攻也包括了防守因为这个数字把对于敌人和对于自己的重要程度都考虑进去了5)为了个别特别的情况,还特别设了修正值,见表
7、编写软件代码应遵守的规范格式,成对编码原则和代码的注释;当写程序写到具有一定规模的程序时,还有许多非程序语言与算法所能解决的问题,以下我在编写程序的过程中的一些体会!--[if!supportLists]--
(1)!--[endif]--成对编码正确的程序设计思路是成对编码,先写上面的大括号,然后马上写下面的大括号这样一个函数体就形成了它没有任何问题然后,比如你要写个for循环,这时候先申明一个变量I,再写这个for循环写上面的大括号,马上写下面的大括号,然后再在中间插一二行代码插这段代码后,如果你又要用到新变量,则再在头上添加新变量,然后再让它进行工作这就是种成对编码当你用到一个内存的时候,写一个分配函数分配一块内存,马上就接着写释放这块内存的代码然后你再在中间插上你要用这个内存做什么这是正确的快迅的编程方法否则,你去查或调试代码都无从下手针对这个程序来说,如果用成对编码,则它任何时候都是可以调试的,不需要你整个程序都写完后才能进行调试由此可见,优点是很明显的!--[if!supportLists]--
(2)!--[endif]--代码的注释代码本身体现不出价值来,有价值的代码一定是不仅格式非常规范,而且还要有很详细的设计思路和注释,这个是很重要的首先要养成这种习惯,我们的___里面很少讲___要做注释,注释应该怎么注有些人爱在哪儿下注释就在哪儿下注释,甚至还在语句中间也加,中间也可弄两个斜杠放两个花括号注释注释格式是非常重要的,但很少有去注意它现在的程序如果没有注释,则基本上是没法用的,也就跟你拿一个可执行程序没什么两样,你拿过来还不能修改,你改了后编出来的程序绝对不能用所以,程序如果没有详细的注释,别人就算拿到了代码也没有用,体现不出它的价值来我的建议是整个程序有个总的说明注释,每个分程序有分程序说明注释
六、文件清单文件名功能FIVE.C主程序FIVE.H主程序头文件及窗口过程文件FIVE.RC资源文件KERNEL.H五子棋核心函数文件RESRC
1.H宏定义常量文件LARGE.ICO大图标文件__ALL.ICO小图标文件BLANK.BMP黑色棋子位图文件WHITE.BMP白色棋子位图文件FIVE.BMP棋盘位图文件HELP.HTM帮助文档README.HTM自述文档。