-网络五子棋五子棋设计与实现学士学位论文.doc
北京邮电大学毕业设计 网络五子棋五子棋设计与实现 摘要五子棋是起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为“連珠”,英译为“Renju”,英文称之为“Gobang”或“FIR”。五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性它既有面的广阔,又有点的忠言,而且简单易懂人民群众喜爱闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。用户范围广阔,系统内容丰富益智,具有较高的市场前景。本次毕业设计通过C+语言在QT环境下编程,设计了五子棋游戏软件,使该软件具有美观友好的截面。使得能够实现选择颜色,悔棋,帮助,退出等功能,但是这次毕业设计的最大难点在于五子棋判断胜负的设计,已经对于在上,右上,右,右下,下,左下,左,左上。八个方向四条直线上的检索判断胜负。本游戏是以C+语言作为开发工具。本文详细地介绍了五子棋游戏软件设计的全过程,描述了该软件的功能。关键词 五子棋; C+; QT; 设计AbstractGobang originated in Chinese ancient Chinese tradition Reversi one. ModernGobang Japanese called "Pente", translated as "Renju", English called "Gobang"or "FIR". Gobang can not only enhance the thinking ability, improve intelligence, and rich in philosophy will help self-cultivation, it has the broad, and a bit of advice, but also easy to understand the people love to see and hear, and profound skills and a high level of international competition; the chess cultural source flow length,with the mystery of Oriental and Western intuition; both the concept of the "field",also have "point". It is the exchange of Chinese and Western culture, is the crystallization of the ancient and modern philosophy. A wide range of systemusers, content rich puzzle, high market prospects.The graduation design through the C+ language in the QT programming environment, designed the Gobang game software, cross section. The software has friendly. To enable color selection, afterwards, help, exit and other functions, the biggest difficulty but this graduation design is the design of Gobang to judge the outcome, is for, right, right, right, down, left, left, left. Search to determine the outcome of eight directions on four lines. The game is based on C+ language as a development tool. This paper introduces in detail the whole process of Gobang game software design, describes the software functions.Keywords C+; QT; Gobang; designII目录1. 绪论11.1 五子棋介绍以及开发环境11.1.1 五子棋简介11.1.2 五子棋国内发展情况21.1.3 开发以及运行环境31.1.4 QT的基本特征综述32 需求分析以及可行性研究52.1 需求分析52.2 可行性研究53 概要设计93.1 总体思路93.2 数据字典104 详细设计114.1 窗体的设计114.2 棋盘以及功能按钮的设计114.3 判断胜负的设计154.4 主要类和函数174.4.1 主要的使用到的类174.4.2 主要成员函数195 测试235.1 测试的重要性及目的235.2 测试结果246 补充说明29参考文献30致谢31外文资料321. 绪论计算机已经深入到人们日常工作和生活的方方面面,各程序软件也逐渐进入大众的视野,并开始影响人们的工作生活,与计算机相关的产业进入快速发展期。而且在高速的生活中,电脑小游戏已经成为了人们放松精神和打发无聊时间的一种非常有效的方式。而五子棋这种规则简单的传统游戏也是深受广大人民的喜爱。Windows系统的推出使得电脑从一些大公司,比较大的科研基地,进入了广大人民的家里。每个行业的人们不需要经过很多的培训或者特别的技术把我就可以在自己的家里轻松的完成对电脑的操作。然而,虽然现在世界上已经充满了各式各样的软件。但是呢有些用户的特殊要求也不是能够直接找一个软件就能满足了的。作为一名学生,特别是软件技术专业的程序编程学生,在系统的学习了一些编程语言之后,更加觉得自己应该多动手编程,做实训项目。不进行实际的操作,很难在编写程序上有进步!编写自己的软件,即使是小程序,你也会向前迈进一大步。我个人比较喜欢linux,在linux环境下的QT4.7通过这次设计,把所学的各项技能很好的整合在一起。又一次感受到了编程的乐趣,从中也学到了不少知识技巧,向前迈进了一大步!本次毕业设计通过C+语言在QT环境下编程,设计了五子棋游戏软件,使该软件具有美观友好的截面。使得能够实现选择颜色,悔棋,帮助,退出等功能,但是这次毕业设计的最大难点在于五子棋判断胜负的设计,已经对于在上,右上,右,右下,下,左下,左,左上。八个方向四条直线上的检索判断胜负。本游戏是以C+语言作为开发工具。本文详细地介绍了五子棋游戏软件设计的全过程,描述了该软件的功能。1.1 五子棋介绍以及开发环境1.1.1 五子棋简介五子棋是一种两人对弈的纯策略型汉族棋类益智游戏,棋具与围棋通用,由中国汉族人发明,起源于中国上古时代的传统黑白棋种之一。主要流行于华人和汉字文化圈的国家以及欧美一些地区。容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋已在各个游戏平台有应用。古代五子棋棋盘与围棋棋盘是通用的,汉魏时为十七路(17×17)棋盘,至南北朝时即已流行十九路(19×19)棋盘,直至1931年出现所谓五子棋专用棋盘如图所示,为十五路(15×15)棋盘,形状近于正方形,平面上画横竖各15条平行线,线路为黑色,构成225个交叉点,邻近两个交点的距离纵线约为2.5厘米,横线约为2.4厘米。棋盘正中一点为“天元”。棋盘两端的横线称端线,棋盘左右最外边的两条纵线称边线。从两条端线和两条边线向正中发展而纵横交叉在第四条线形成的四个点称为“星”。天元和星应在棋盘上用实心小圆点标出。五子棋的棋盘简洁明了在横竖橡胶的点进行下棋。老少皆宜简单易懂,它的棋盘简洁明了只是单纯的15条竖线跟15条横线就构成了整个“战场”。它的棋盘如图1-1。图1-1 五子棋棋盘1.1.2 五子棋国内发展情况五子棋是我国古代的、传统的黑白棋种之一,大约在南北朝时期随围棋一起传入朝鲜、日本等地。五子棋在日本叫“连珠棋”。据日本史料记载,五子棋先由中国传到朝鲜,再由朝鲜传到日本。当时主要在皇宫和贵族大家庭中流行。到元禄末年,在日本京都,这一当时被称做“五目碰”、“五格”的棋戏在民间开始盛行起来,无论武士、僧侣、农夫都能参加这一活动。到日本明治32年(公元1899年),经过公开征名,“连珠”这一名称才被正式确定下来。从这之后,连珠这一活动已经过了不断的改良,主要是规则的变化,例如1899年规定禁止黑白双方走“双三”,1903年规定只禁止先行的黑方走“双三”,到了1912年规定,黑方被迫走“双三”亦算输;1916年规定,黑方也不许走“四、三、三”;1931年规定,黑方不许走“双四”,并规定将19X19道线的围棋棋盘改为15X15道线的五子棋专用棋盘。通过一系列的规则变化使连珠五子棋这一简单的游戏复杂化、规范化,而最终成为今天的职业连珠五子棋,同时也成为一种国际比赛棋。目前,连珠五子棋这一棋类运动已迅速在国际上发展起来。有40多个国家和地区已开展了五子棋活动。许多国家的人对五子棋都有不同的爱称,例如韩国人把五子棋称为“情侣棋”,言下之意是说情人之间下五子棋有利于增加情感的交流;欧洲人称之为“绅士棋”,喻棋手下五子棋的君子风度胜似绅士;美洲人称之为“商业棋”,意思可能是边下五子棋边谈生意,是商业贸易之桥;日本称之为“中老年棋”,表示五子棋适合成熟的中老年的生理特点和思维方式。不同语言、地区的人们都可以借助五子棋这一简单而又深奥的棋艺进行交流、比赛,以增进友谊。1988年8月8日,国际连珠联盟(RIF)在瑞典宣告成立。 五子棋在我国的很多大、中城市发展很快,尤其是首都北京,曾多次举办了五子棋的各种比赛,中央电视台体育频道也长期播放着五子棋的讲座,还有,一些大型企业和单位也曾举办过五子棋的比赛。预计在几年后,五子棋将成为国内最受欢迎的项目之一。 1.1.3 开发以及运行环境本次的五子棋游戏的设计与实现的完成时在HP笔记本型号6450b上设计开发并完成的。HP6450b使用英特尔酷睿i5处理器CPU主频2.53GHZ采用DMI2.5GT/S的规格总线,3MB的3级缓存。2G内存,512独显。在HP6450b上安装Ubuntu12.0.4的版本。Ubuntu12.0.4是一个以桌面应用为主的linux操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词(译为友帮拓或乌班图),意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu基于Debian发行版和GNOME桌面环境,与Debian的不同在于它每6个月会发布一个新版本。Ubuntu的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。Ubuntu具有庞大的社区力量,用户可以方便地从社区获得帮助。在Ubuntu12.0.4系统下面安装QT4.7。在QT4.7中完成设计编码与实现。1.1.4 QT的基本特征综述QT是Trolltech公司的标志性产品,是一个跨平台的C+图形用户界面(GUI)工具包,QT应用程序接口与工具兼容于所有支持平台,让开发员们掌握一个应用程序接口,便可执行与平台非相关的应用开发与配置(QT/windows QT/Mac QT/x11(linux))QT对不同平台的API进行了进行了专门的封装(文件处理,网络)。Qt 是一个完整的应用程序开发框架,包括一个类库和一些跨平台、国际化的工具。它是挪威Troll Tech公司的标志产品。Qt工具箱有三种不同的版本,一种是专业版(Professional Edition),另一种是免费版(Free Edition),还有一种是嵌入式免费版(Embedded free Edition)。专业版用于创造成功的商业贸易方面的跨平台软件;而自由版已经成为用C+ GUI工具包在Linux上进行自由软件开发的主流,它是Linux上流行的KDE桌面环境的基础。由于Qt是一个跨平台的GUI工具箱,它确保了软件非常方便的应用于绝大多数操作系统。 Qt 是一个跨平台的C+图形用户界面应用程序框架,它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt 有着众多的优势:优良的跨平台特性、面向对象、丰富的API、支持2D/3D 图形渲染、支持OpenGL、支持XML,集成了开源浏览器网页排版引擎Webkit 等等。而Qt/Embedded,缩写为Qt/E,是为了开发自由软件所提供的嵌入式版本,包含GUI 和基于Linux 的嵌入式平台开发工具。1.面向对象 QT有模块设计和注重软件构件或元素的可重用性的特点。2.构件支持 QT提供信号和槽概念,这是一种类型安全的方法,他允许回调,并支持对象之间在彼此不知道对方信息的情况下进行合作,这使得QT非常适合于构件编程。3.友好的联机帮助 QT提供大量的联机参考文档。并且可以很轻松的通过互联网访问QT官网,在诺基亚公司的网页上面可以查询到特别多的帮主文献,以及开发帮助,还有可以与全世界的使用者在论坛上面交流使用心得,与发表问题。QT程序的编译和链接:一般来说,无论是C、C+、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是.obj文件,UNIX下是.o文件,即Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C+文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。链接器只管函数的中间目标文件(Object File)。2 需求分析以及可行性研究2.1 需求分析需求分析是软件生存周期中重要的一个步骤,只有通过需求分析才能把软件的需求描述为软件的需求规格说明,从而奠定软件开发的基础。在期阶段了解本软件必须达到用户要求的各种功能。弄清用户希望软件做到什么。准确的表达用户的要求。功能需求:1)界面简洁,亲切友好用户能够清楚的知道该怎么使用。2)提供帮助,关于等说明。3)具有悔棋,选择颜色,关闭等功能。4)符合五子棋的基本规则。本软件是一个五子棋游戏程序,主要功能是可以实现人机对战,电脑的AI较高,通过游戏,玩家能深刻体会到五子棋游戏的乐趣。确保应用程序具有良好的系统性能,友好的用户界面。较高的处理效率,便于使用和维护。采用成熟技术开发,使系统具有较高的技术水平和较长的生命周期。2.2 可行性研究社会和经济意义:五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性它既有面的广阔,又有点的忠言,而且简单易懂人民群众喜爱闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。项目前景:用户范围广阔,系统内容丰富益智,具有较高的市场前景。1.技术可行性运用linux操作系统,以QT4.7为平台开发界面友善简洁,功能完整的五子棋游戏。2.经济可行性一目了然的界面设计,是使用者可以非常轻松的操作。而且系统开发成本低在现有的计算机上可以很轻松的完成整个环境的需求。3.操作可行性新的系统运行后对现行旧的系统带来包括(工作环境、管理方式、组织机构等)的后果以及影响来进行评判和估计。同时更需要考虑到的是:对现有的管理人员进行培训,补充、分析在给出的时间里是不是能完成预定开发系统的任务等系统的开发,是典型的Mis开发,主要是对数据的处理,包括数据的收集,数据的变换,及数据的各种报表形式的输出.只需要鼠标的点击就可以完成真个游戏。4.法律可行性从法律角度看,Android是个开放的平台,代码是开放的,加上基于Android的教学管理系统主要为师生提供便利,作为毕业设计,并不以盈利为目的,且是自主开发设计,因此不会在社会上引起侵权或其它责任问题,在法律上是可行的。可行性研究的目的不在于提出解决问题的方案,而在与研究解决问题的必要性和可能性。在软件开发实践中,由于软件开发人员或用户对市场的了解不充分,对技术的把握不成熟,对进行开发的各项风险估计不足等因素,许多问题都不能在预期的时间范围内或资源限制下得到解决。如果开发人员能够尽早预知存在的问题没有合理的解决方案,那么尽早停止项目的开发就能够避免时间、资金、人力和物力的浪费。流程图是以特定的图形符号加上说明,表示算法的图,称为流程图或框图。流程图是流经一个系统的信息流、观点流或部件流的图形代表。在企业中,流程图主要用来说明某一过程。这种过程既可以是生产线上的工艺流程,也可以是完成一项任务必需的管理过程。例如,一张流程图能够成为解释某个零件的制造工序,甚至组织决策制定程序的方式之一。这些过程的各个阶段均用图形块表示,不同图形块之间以箭头相连,代表它们在系统内的流动方向。下一步何去何从,要取决于上一步的结果,典型做法是用“是”或“否”的逻辑分支加以判断。流程图是揭示和掌握封闭系统运动状况的有效方式。作为诊断工具,它能够辅助决策制定,让管理者清楚地知道,问题可能出在什么地方,从而确定出可供选择的行动方案。流程图有时也称作输入-输出图。该图直观地描述一个工作过程的具体步骤。流程图对准确了解事情是如何进行的,以及决定应如何改进过程极有帮助。这一方法可以用于整个企业,以便直观地跟踪和图解企业的运作方式。流程图使用一些标准符号代表某些类型的动作,如决策用菱形框表示,具体活动用方框表示。但比这些符号规定更重要的,是必须清楚地描述工作过程的顺序。流程图也可用于设计改进工作过程,具体做法是先画出事情应该怎么做,再将其与实际情况进行比较。流程图的优缺点优点:形象直观,各种操作一目了然,不会产生“歧义性”,便于理解,算法出错时容易发现,并可以直接转化 为程序。缺点:所占篇幅较大,由于允许使用流程线,过于灵活,不受约束,使用者可使流程任意转向,从而造成程序阅读和修改上的困难,不利于结构化程序的设计。为了便于识别,绘制流程图的习惯做法是:1) 圆角矩形表示“开始”与“结束”。2) 矩形表示行动方案、普通工作环节用3) 菱形表示问题判断或判定(审核/审批/审评)环节。4) 用平行四边形表示输入输出。5)箭头代表工作流方向。本次程序设计的流程图如图2-1。图2-1 程序流程图(4) 用户的需求五子棋游戏的一个特点是先行的一方优势很大,因此在职业比赛中对黑方做了种种限制,以利公平竞争。五子棋的比赛规则如下: (1) 黑棋先手、白棋后手,从天元开始相互顺序落子;(2) 最先在棋盘横向、纵向或斜向形成连续的同色五个棋子的一方为胜;(3) 黑棋禁手判负、白棋无禁手。黑棋禁手有“三、三”、“四、四”和“长连”,包括“四、三、三”和“四、四、三”。黑棋只能以“四、三”取胜;(4) 如分不出胜负,则到为平局; (5) 五连与禁手同时形成,判胜; (6) 黑方禁手形成时,白方应立即指出。若白方未发现或发现后不立即指出,反而继续落子,则禁手失效,不再判黑方负。五子棋是黑白双方或两个人之间的竞技活动,由于对黑白双方规则不同,黑棋必须先行。一般采用猜先的方法来决定谁执黑先行,即双方各抓一种颜色的几枚棋子,大数减小数,单数双方交换,偶数不换;黑方在落下关键的第五子即形成五连的同时,如又形成禁手,此时因黑方已经成五,而“五”在五子棋中是至高无上的,故禁手失效,黑方胜;所谓黑方形成禁手,是指黑方落下一子同时形成两个或两个以上的活三、冲四及长连等。此时白方应立即指出,自然而胜。 专业连珠五子棋虽然对黑棋采取了种种限制,但是黑棋先行的优势依然很大。因此,在高段位的专业比赛中,又出现了三种特殊的规定: (1) “指定打法”:指比赛双方按照约定好的开局进行对弈。例如“斜月局”、“长星局”等。 (2) “三手可交换”:指黑棋下第二手棋盘面第三手棋之后,白方如感觉黑方棋形不利于己方,可提出交换,即执白棋一方变为执黑棋一方此方法不适用于指定开局打法,而用于随意开局。采用此规定以后,黑棋就不会再使用诸如“浦月”、“花月”之类的必胜开局了。 (3) “五手两打”:指黑棋在下盘面上关键的第五手棋时,必须下两步棋,让白方在这两步棋中任选一步,然后再继续下。 采用这一系列规定以后,黑棋先行就再无优势可言。3 概要设计3.1 总体思路 首先应当刻画出来一个窗体可以最大化,最小化和关闭。然后在窗体中刻画自己分配的区域:键盘区域,标示区域,功能区域。键盘区域:传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为19×19,现代一般采用15×15棋盘。棋子放置于棋盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。标示区域:在生个窗体上面显示游戏的名称。在各个需要用到的按钮上面显示该按钮的名字,最好就是用它应该实现的功能命名。然后再分开每个区域。功能区域:1.选择颜色的单选框:建立一个单选框其中应包含两个选择即1:选择为黑色。2选择为白色。(同一时间只能选择一个颜色作为自己的)。2.显示信息的小块:设立两个按钮使其能够对其居中。在使用鼠标单击help按钮式能够显示出来关于这个游戏的玩法帮助说明。鼠标单击about按钮时能够显示出来这有游戏的关于信息。3.悔棋,重新开始,关闭小块:当游戏进行到一定的时间段时可以根据自己的意向使用鼠标单击悔棋按钮自动清除上一步黑白双方所下的旗子,使其还原到上上次落子的状态。当本局已经不想再继续下去时可以通过鼠标的单击重新开始的按钮使其直接还原到刚开始选择颜色的那步若是不再选择颜色则直接进行游戏,此时所执的颜色与选择重新开始以前所选择的颜色相同。当游戏者不想玩这个游戏的时候点击关闭按钮能够关闭整个游戏包括窗体。最后就是再实现下棋时的规则要求双方轮流下子,棋盘刻画也是一黑一白交替进行,悔棋清除也是清除一黑一白的清除,然后再实现判断胜负,当有一方完成5个或者5个以上的相同颜色的旗子连在同一条直线上时能够显示出来胜负的结果并且本局游戏结束。考虑到整个的下棋过程(无论对方是电脑抑或其他网络玩家)可以分为:己方落子、等待对方落子、对方落子、设置己方棋盘数据这一系列过程,因此一人游戏类、二人游戏类和棋盘类之间的关系参考了抽象工厂模式,以实现对两个不同模块进行一般化的控制。(一)棋盘类整个架构的核心部分,类名为Board。封装了棋盘的各种可能用到的功能,如保存棋盘数据、初始化、判断胜负等。用户操作主界面,主界面与Board进行交互来完成对游戏的操作。(二)游戏模式类用来管理人机对弈/网络对弈两种游戏模式,类名为CGame。CGame是一个抽象类,经由它派生出一人游戏类COneGame和网络游戏类CTwoGame。设计基于QT的五子棋程序只需要从硬件升接受消息就可以了,当鼠标在某个窗口内移动时,系统会不断地发出鼠标移动消息WM_MOUSEMOVE,并把鼠标的最新位置传给该窗口。如果在窗口的范围内按下鼠标左键,系统就会发出“按下左键”的WM_LBUTTONDOWN消息给该窗口,等到用户放开按键后,再发出“放开左键”的WM_LBUTTONUP消息给该窗口。3.2 数据字典表1 主要类功能表类标识符类名功能 Qframe五子棋主程序窗体类它是程序界面设计部分的实现,它主要负责界面的绘制,判断下棋位置是否正确。chess五子棋主程序运行类在界面上绘制棋盘,实现鼠标与棋子之间的转换并下棋,判断胜负,输出胜利者。 Resource 主要资源类它包括手工绘制的棋子及一些程序需用到的资源。4 详细设计4.1 窗体的设计1. 定义一个窗体类在其public属性中设置必要的属性,然后完成setupUi的函数。在函数中设置成个窗体大小为固定大小(745,570)。并将其需要的按钮图片棋盘刻画图片棋子图片全部添加进去,使得窗体在初始化的时候整个需要用到的按钮和棋盘全部显示出来。2.在Edit中打开真个布局图画,然后使用鼠标拖拽完成棋盘区域,显示信息区域,功能区域的划分,并且在其各自的区域里设置相应的属性以及相应的对象。3.讲一些可以直接设置好的简单功能在各自的属性列表中通过信号和槽设置完毕。实现简单的退出最小化等功能。使用到的类Board:Board()delete boardIcon;for( int i = 0; i < 225; i+ )if( gridi != NULL )delete gridi;for( int i=0; i<15; i+)/棋子数组初始化for( int j=0; j<15; j+)realgridij = NULL;4.2 棋盘以及功能按钮的设计1.定义一个棋盘类,在public slot属性中定义需要使用的函数Class Board:public QWidget。然后定义Chess *grid225用来存储棋子指针。Char realgrid1515(棋子网络数组,真正的网络,标示已有棋子,用于节点和生成字节点的判断)等。定义胜利标志位bool victory。要把棋盘和棋子显示出来,分为以下几步过程: 1) 得到当前绘图DC句柄,并保存当前绘图环境到内存DC中。2) 载入一张棋盘BMP图片,并在主界面对话框的客户区绘画出来。 3) 遍历棋子数组,根据数组中的数据,把相应颜色的棋子图片绘出来。 4) 更新内存DC到当前绘图DC中。这样就可以把棋盘和棋子图片显示出来了。 2.鼠标输入数据的处理,要实现鼠标输入数据的处理,可以分为以下几步: 1) 得到鼠标在当前窗口中点击的左键坐标。 2) 根据棋盘每格的大小得到当前坐标在棋子二位数组中的相应行和列数据。 3) 判断数组中对应的行和列的数据是否是有效数据。如果是有效数据,说明有棋 子已经在当前位置落下,这里就不能落子,提示并等待用户下一次点击。如果 无效数据,就把这个数据填写为相应的颜色数据。 4) 把对应的行列和颜色数据发送出去。调用规则类判断当前的胜负状态,如果获胜直接提示。用到的代码/* 棋盘重置 */* 删除所有棋子,并将chess指针数组置NULL */void Board:InitializeBoard()for( int i=0; i<225; i+ )if( gridi != NULL )delete gridi;for(int i=0; i<225; gridi= NULL, i+ ); for(int i=0; i<15; i+)/棋子数组初始化for(int j=0; j<15; j+)realgridij = NULL;/存棋子顺序的变量和数组初始化whosturn = 0;for(int i=0; i<15; i+)for(int j=0; j<15; j+)orderij = 0;victory = true;/胜利或重新开局标示,停止自动下棋chessnow = 'B' /电脑黑棋,电脑先手if( robotcolor = 'B')float y = ( 7 + 1 - 0.5 ) * 35 + 30;float x = ( 7 + 1 - 0.5 ) * 35 + 30;newchess = new ChessBlack( x, y, this );/new棋子对象newchess->DrawChess( x, y );/画棋子/chessnow换色switch( chessnow )case 'B':chessnow = 'W'break;default:chessnow = 'B'/* 填完新棋子,按八个方向搜索棋盘,是否有五连 */* 作按8个方向,准备递归查找 */* newchess用引用传递 */void Board:ScanBoard()/下句为显示中文QTextCodec:setCodecForTr(QTextCodec:codecForName("GB2312");for(int i=1; i<5; i+ )/计算某两个相对方向上相同棋子数,相加,4次循环,8个方向int count = newchess->CheckStart(i) + newchess->CheckStart( 9 - i );/1 左上, 9 - 1 = 8 右下if( count >= 6 )/新棋子按两个方向递归,自己加了两次/胜利对话框之前(下完棋),需要刷新,更改过期棋子的图片RefreshChesspic();QMessageBox messageBox(this);QAbstractButton *initialize;switch( chessnow )case 'B': initialize=messageBox.addButton(tr("BlackWin!")QMessageBox:ActionRole);break;case 'W': initialize=messageBox.addButton(tr("WhiteWin!"),QMessageBox:ActionRole);break;messageBox.exec();if (messageBox.clickedButton() = initialize)/* 胜利对话框,跳出循环,棋盘重置,删除不用的指针和chess对象 */InitializeBoard();/* 初始化后,停止各个方向上的查找 */break;/* 点击鼠标,填新棋子 */* 1、填子是否有效 */* 2、控制黑白棋交替填子 */从上面的代码中可以看到,这个棋盘类已经包含前面设计的内同,每个功能都有一个成员函数实现。声明玩累的结构和成员后,现在就用基础函数实现这个类。3.绘制棋子Draw这是非常重要的一个函数,它根据参数给定的坐标和颜色绘制棋子。绘制的详细过程如下:1)将给定的棋盘坐标换算为绘图的像素坐标。2)根据坐标绘制棋子位图。3)如果先前曾下过棋子,则利用R2_NOTXORPEN将上一个绘制棋子上的最后落子指示矩形擦除。4)在刚绘制完成的棋子四周绘制最后落子指示。Node:Node( int x, int y, Node *parentnode )for( int i=0; i<15; i+)/数组初始化for( int j=0; j<15; j+) realgridij = NULL;for( int i=0; i<15; i+)/数组初始化for( int j=0; j<15; j+) legalblankij = NULL;m = x;/本节点位置n = y;nweight = 0;/父节点为node,保存父节点指针pnode = parentnode;Initial();/* 初始化完后,相当于已经把该节点填到棋盘,接下来计算权值 */MakeDecision();4.悔棋 :开始以前按钮设置为禁止,只有在棋局的过程中,并且轮到该本方落子,并且棋盘有2个棋子或2个棋子以上时,“悔棋”按钮才被置于激活状态(T)。如果本方下棋判断已经落下的旗子棋子是否大于两颗若是返回值为正数激活“悔棋”按钮如果点击接受按钮,则在双方棋盘上清除最新下的两个棋子,然后请双方继续进行下子操作。5清除棋盘:在每一局游戏开始的时候都需要调用这个函数将棋盘清空,也就是棋盘的初始化工作。在这个函数中,主要发生了这么几件事情:1)将m_data中每一个落子位都置为无子状态(-1)。2)按照传入的参数设置棋盘等待标志m_bWait,以供先、后手的不同情况之用。使用delete将m_pGame指针所指向的原有游戏模式对象从堆上删除。6左键消息作为棋盘唯一响应的左键消息,也需要做不少的工作:1)如果棋盘等待标志m_bWait为TRUE,则直接发出警告声音并返回,即禁止落子。2)如果点击时的鼠标坐标在合法坐标(0, 0)(14, 14)之外,亦禁止落子。 3)如果走的步数大于1步,方才允许悔棋。4)进行胜利判断,如胜利则修改UI状态并增加胜利数的统计。5)如未胜利,则向对方发送已经落子的消息。6)落子完毕,将m_bWait标志置为TRUE,开始等待对方回应。4.3 判断胜负的设计五子棋的胜负,在于判断棋盘上是否有一个点,从这个点开始的右、下、右下、左下四个方向是否有连续的五个同色棋子出现,每当一方落子后,