毕业设计(论文)C++网络五子棋对战系统

上传人:无*** 文档编号:44537965 上传时间:2021-12-05 格式:DOC 页数:48 大小:273.54KB
返回 下载 相关 举报
毕业设计(论文)C++网络五子棋对战系统_第1页
第1页 / 共48页
毕业设计(论文)C++网络五子棋对战系统_第2页
第2页 / 共48页
毕业设计(论文)C++网络五子棋对战系统_第3页
第3页 / 共48页
点击查看更多>>
资源描述
网络五子棋对战系统共 48 页 第 1 页装订线摘 要五子棋游戏以其优秀的人工智能深受广大玩家的喜爱,而对于初步探究网络编成的编程爱好者来说,编制五子棋程序因其规则简单而大受欢迎,然而它却要求程序员对五子棋规则有相当深入的了解。程序员考虑得越周到,其五子棋程序就越智能。 五子棋游戏软件设计的主要内容是:根据五子棋的基本规则,要让对方客户端知道该在哪一点下子,就要根据盘面的形势,并把棋盘棋子的重新绘制绘制,也就是更新该点的位置,然后再通过监听网络传递的消息,直到新的位置放在棋盘的什么位置上,在进行修改,并通过计算,得出玩家是否获得胜利.,因此玩家就能反复的进行联机游戏。本文论述了采用联机对战的方式体现出五子棋程序的分析与设计,并采用面向对象的开发工具 VC来具体实现。关键词关键词:五子棋;VC;面向对象 网络五子棋对战系统共 48 页 第 2 页装订线AbstractWuziqi game with excellent artificial intelligence by the vast number of players who, for the initial research network organization programming enthusiasts, Wuziqi procedures for the preparation of the rules simple and popular, but it requires programmer to Wuziqi game has a deep understanding of the rules. Other thoughtful consideration they treat their Wuziqi game procedures more wisdom.Wuziqi game software design is the main content: According Wuziqi basic rules to know each others customers - in violation of the West, we must under Permian situation, and the board pawn re-mapping mapping, that is updating the point position, and then through the monitoring network news until the new location on the board what position, Following changes, and through the calculation, resulting in players is victory. , the on-line game players can repeatedly.This article discusses the use of on-line way reflect those Wuziqi procedures analysis and design, object-oriented development tools and the adoption of specific VC+ to achieve.Key Words : Wuziqi, VC+,object-oriented 网络五子棋对战系统共 48 页 第 3 页装订线目目 录录1. 引言 .41.1 课题背景 .41.1.1 背景知识.41.1.2 五子棋游戏的规则.42. 系统目标 .123. 系统需求分析 .133.1 系统需求 .133.2 功能需求 .133.3 系统运行环境 .133.4 MFC 简述.133.5 服务器与客户端 SOCKET 设计 .134. 系统设计 .154.1 概要设计 .154.2 流程图 .154.3 详细设计 .174.3.1 钩子的使用.174.4 程序设计 .184.4.1 程序窗口的设计 .185. 结论 .265.1 关键技术 .265.2 总结 .26设计总结.27致谢.28参考文献.29附 录.30 网络五子棋对战系统共 48 页 第 4 页装订线1.引言1.1 课题背景1.1.1 背景知识五子棋是起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为“连珠”,英译为“Renju”,英文称之为“Gobang”或“FIR”(Five in a Row 的缩写),亦有“连五子”、“五子连”、 “串珠”、 “五目”、 “五目碰”、 “五格”等多种称谓。 五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。 五子棋起源于古代中国,发展于日本,风靡于欧洲。对于它与围棋的关系有两种说法,一说早于围棋,早在“尧造围棋”之前,民间就已有五子棋游戏;一说源于围棋,是围棋发展的一个分支。在中国的文化里,倍受人们的青睐。古代的五子棋的棋具与围棋相同,纵横各十七道。五子棋大约随围棋一起在我国南北朝时先后传入朝鲜、日本等地。据日本史料文献介绍,中国古代的五子棋是经由高丽(朝鲜),于 1688 年至 1704 年的日本元禄时代传到日本的。到日本明治 32 年(公元 1899 年),经过公开征名, “连珠”这一名称才被正式确定下来,取意于“日月如合壁,五星如连珠”。从此,连珠活动经过了不断的改良,主要是规则的变化(即对执黑棋一方的限制),例如,1899 年规定,禁止黑白双方走“双三”;1903 年规定,只禁止黑方走“双三”;1912 年规定,黑方被迫走“双三”亦算输;1916 年规定,黑方不许走“长连”;1918 年规定,黑方不许走“四、三、三”;1931 年规定,黑方不许走“双四”,并规定将 1919 的围棋盘改为 1515 的连珠专用棋盘。本世纪初五子棋传入欧洲并迅速风靡全欧。通过一系列的变化,使五子棋这一简单的游戏复杂化、规范化,而最终成为今天的职业连珠五子棋,同时也成为一种国际比赛棋。1.1.2 五子棋游戏的规则(1)棋盘,棋子:1、棋盘为十五路,正中一点为“天元”,周围四点为小星。2、棋子分黑白两色,黑子 113 枚,白子 112 枚,共 225 枚。(2)比赛规则:1、黑先白后,从天元开始落子。然后执白棋的一方在黑棋周围的交叉点上落子,白第二着棋应布在自己河界的一侧。此后,执黑方在以天元为中心的 25 个交叉点的范围内布盘面的第三着棋。2、最先在横向,竖向,斜向形成连续的相同色五个棋子的一方为胜。 网络五子棋对战系统共 48 页 第 5 页装订线3、黑棋禁手判负,白棋无禁手。黑棋禁手包括“三三”, “四四”,“长连”。黑方只能“四三”胜。所谓禁手,是指黑方一子落下同时形成两个或两个以上的活三,冲四及长连禁手。长连禁手是指黑方形成六个或六个以上的连续棋子。4、双方均不能形成五连为和棋。5、对局中拔子,中途退场均判为负。6、五连与禁手同时形成,先五为胜。因黑方已形成五连,故禁手失效,黑方胜。7、黑方禁手形成时,白方应立即指出禁手点,黑方即负。若白方继续应子,则黑方禁手不成立。8、高段位职业比赛的特殊规定:“三手可交换”:黑下完第手,执白者可提出交换。即执白方变为执黑方。 “五手两打法”:执黑下第五手时,必须下两手棋,执白者从这两手棋中任选一步。本文所论述的联机五子棋系统就是依照这种方式进行的。1.1.3 开发系统的几点建议(1)开发系统不必贪大求全,力争简单实用。应从大处着眼,小处着手,循序渐进,逐步完善。(2)对开发过程中的各种文档应当注意保存。这是系统开发所要求的必要条件。(3)尽可能取得对程序设计重视,使用简化的程序代码保证整个系统开发的清晰。1.2 相关技术介绍1.2.1 结构化生命周期法简介结构化生命周期法是一种传统的系统开发方法,其基本思想是把整个系统开发过程分成若干个阶段,每个阶段进行若干活动,每项活动应用一系列标准、规范、方法和技术,完成一个或多个任务,形成符合给定规范的产品。采用结构化生命周期法来开发系统时,应遵循的主要原则:(1)用户参与的原则。(2)“先逻辑后物理”的原则。(3)“自顶向下”的原则。(4)工作成果描述(主要指文档)标准化的原则。其具体开发步骤可分为以下四步:(1)系统规划。(2)系统开发。(3)系统的运行及维护。(4)系统评价 。其中系统开发又分为以下四个步骤: 网络五子棋对战系统共 48 页 第 6 页装订线(1)系统分析:系统初步调查、系统可行性研究、行系统的详细调查、系统逻辑方案的提出。(2)系统设计:系统总体结构设计、系统总体功能设计、系统总体物理结构设计、系统详细设计、代码设计、输入输出设计。(3)系统实施:程序设计、系统测试。1.2.2 开发技术快速原型法简介快速原型法是 80 年代发展起来的,旨在缩短开发周期,提高开发效率和用户对系统的满意程度。其基本思想是在系统开发的初期,尽快构造出系统的原型,使用户能及早地运行这个系统原型,通过使用它、熟悉它,受到启发并取得经验,然后对系统的目标和功能提出更精确、具体的要求,研制人员据此逐渐修改和完善原型,使它满足用户的需求,最后完成系统的开发。该方法大大提高了系统开发效率,弥补了结构化生命周期法来开发的时间长的缺陷。通常采用原型法需要以下四个阶段:(1)明确用户的基本要求。(2)研制系统的原型。(3)使用、评价系统原型。(4)修改和完善原型。1.2.3 本系统开发方法的选择基于以上开发方法的优劣和本系统的实际情况,本系统总体上采用结构化生命周期法进行系统规则、系统分析和系统设计,但在系统实施阶段采用原型法。在开发程序的方法上,本系统将采用 VISUAL C+棋联机游戏的软件,用以实现客户端与服务端管理。1.2.4 VISUAL C+1、VC 是什么?学 VC 是学什么? 首先 VC 是一个软件( IDE 集成开发环境) (编译、编辑、调试); C 和 C+;WindowsSDK(软件开发工具) ;VC 的灵魂:MFC(微软基础类库) ;ATL(ActiveX 模板类库) ;其他的 SDK,如 OpenGL,DirectX,ActiveMoive,DrawDib(WinG)。 VC 是许许多多技术的综合,就好像少林 72 般绝技,一般在应用中学会其中很少一部分就够了。我们的现在目的,其实不过是学一套少林长拳。这套长拳应包括:(1)养成一种严谨的软件开发习惯,熟悉软件工程的基本原则 。(2)C 语言基础。(3)C+最基本内容:类、继承性、封装性、多态性的概念 。 网络五子棋对战系统共 48 页 第 7 页装订线(4)如何用向导建立一个程序框架 。(6)设计工具条。(7)设计和使用对话框,熟悉最常用的对话框控件:按钮、静态文本、编辑框等。(8)知道怎样新建类、成员函数、成员变量、消息处理函数。(9)了解最常用的 Windows 消息:如 WM_PAINT(重绘窗口),鼠标按下、弹起、移动,初始化对话框 等。(10)了解最简单的 GDI(图形设备接口 ):写文字、画框、画点、画线、画圆,设置画笔、画刷。(11)熟悉最常用的 MFC 类:CWnd CDocument CView CDC CDialog CWinApp CGdiObject 及子类 CString、CPoint、CRect、CSize 等简单数据类型 CFile 以上提到的这些内容,是每个人都会用到的内容。 2、MFC 简介 上述主要内容都是与实际操作关系非常密切的,在此不可能讲清楚;而且,这些在一般的书里都会讲到。我主要将最重要的MFC 介绍一下。MFC 是对 WindowsAPI 的封装,大大简化了我们的工作;学 VC 主要就是要学MFC,大约有 100 多个类,但常用的也就二三十个。应该象背4 级单词一样将这些常用类搞懂;当然不要死记,要通过看帮助、看例子、动手练习来学会它们;而且,并非每个类的内部的所有函数都要学会,要日积月累。如果真的想成为高手,做个笔记本把自己认为重要的类、函数记下来,随时学习,也是很好的突击方法。 下面介绍最重要的 MFC。 CWnd:窗口,它是大多数 “看得见的东西 ”的父类(Windows 里几乎所有看得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图 CView、框架窗口 CFrameWnd、工具条 CToolBar、对话框 CDialog、按钮 CButton,etc;一个例外是菜单(CMenu)不是从窗口派生的。该类很大,一开始也不必学,知道就行了。 CDocument 文档,负责内存数据与磁盘的交互。最重要的是OnOpenDocument(读入),OnSaveDocument(写盘),Serialize(读写) 。CView 视图,负责内存数据与用户的交互。包括数据的显示、用户操作的响 网络五子棋对战系统共 48 页 第 8 页装订线应(如菜单的选取、鼠标的响应)。最重要的是 OnDraw(重画窗口),通常用CWnd:Invalidate()来启动它。另外,它通过消息映射表处理菜单、工具条、快捷键和其他用户消息。你自己的许多功能都要加在里面,你打交道最多的就是它。 CDC 设备文本。无论是显示器还是打印机,都是画图给用户看。这图就抽象为 CDC。CDC 与其他 GDI(图形设备接口)一起,完成文字和图形、图像的显示工作。把 CDC 想象成一张纸,每个窗口都有一个 CDC 相联系,负责画窗口。 CDC有个常用子类 CClientDC(窗口客户区) ,画图通常通过 CClientDC 完成。 CDialog 对话框 CWinApp 应用程序类。似于 C 中的 main 函数,是程序执行的入口和管理者,负责程序建立、消灭,主窗口和文档模板的建立。最常用函数InitInstance():初始化。 CGdiObject 及子类,用于向设备文本画图。它们都需要在使用前选进DC。 CPen 笔,画线;CBrush 刷子,填充;CFont 字体,控制文字输出的字体 ;CBitmap 位图;CPalette 调色板;CRgn 区域,指定一块区域可以用于做特殊处理 ;CFile 文件。最重要的不外是 Open(打开),Read(读入),Write(写) ;CString 字符串。封装了 C 中的字符数组,非常实用 ;CPoint 点,就是(x,y)对;CRect 矩形,就是( left,top,right,bottom) ;CSize 大小,就是( cx,cy)对(宽、高) 。3、用好 MSDN 和例子 作为提高,推荐看的例子有: nHello 最简单的程序框架 ;nScribble 鼠标绘图。教程:编程基础, GDI;nDiblook 图像处理最简单范例 ;nMFCIE 因特网浏览器 ;nEnroll 数据库;nDaoviewDao(数据访问对象)范例。树型和列视控件 ;nCubeOpenGL 范例,画一个不断旋转的方块 ;nHierSvrOLE 服务器;nOclientOLE 包容器;nDrawcli 鼠标绘图。也包括 OLE;nWordPad 写字板。4、几点经验 网络五子棋对战系统共 48 页 第 9 页装订线(1)为什么要用 Windows 而不是 DOS 编程。 Windows 编程并不比 DOS 编程难很多,只是在刚刚接触的时候感到头绪繁多,不知从何下手。实际上,如果你会 C 语言,你会发现 Windows 编程的难度并不比当年学 C 语言时大。DOS 编程要想成为高手,也需要学习几百个函数(无论是TC、BC、MicrosoftC) ,并要深入了解汇编语言级的 DOS 功能调用。而现在在Windows 下,付出相同的工作量,你却可以获得几倍的收益。如果你以前熟悉DOS 编程,现在再搞 Windows 编程,只要两个星期肯定会感到巨大的优越性:在DOS 下,每一件事都要自己干,而且还有 64K 内存、显示精度等的限制,实在是事倍功半了。 (2)为什么要用 VC 而不是其他 Windows 编程语言。n 大多数大型软件(包括 Windows 自己)都是用 C、C+编的,所以可以利用的源代码特别多。例如 Photoshop,就有 VC 的编程接口。的其他的语言都不如 VC 有历史优势。而且 VC 的开发工具特别多,从控件公司到硬件开发商,其产品很少敢不提供 VC 接口的。 nVC 适合组织大工程( VB 就不行) 。nBorlandC+或 C+Builder 也很不错,并不比 VC 差。但 BC 的版本兼容性不好,从 3.1 到 4.0 就出现“代沟” ,而且 VC 提供了极为丰富的文档和范例 ,VC的参考资料也远比 BC 多。并且 VC 与其他的 VisualStudio 成员可以协调工作,对软件工程有利。 (3)开始不要学 WinAPI 编程,但以后最好学学 WinAPI。特别要注意,开始不要买讲 WindowsSDK 编程的书。一个臭名昭著的例子就是“HelloWorld” 。各种计算机语言在入门课中往往都给出一个例子,显示一行文字“HelloWorld” ,无论是在 Basic、C、Pascal,甚至汇编中,这个最简单的小程序都几行就可以写完。但在早期的 Windows 编程中,刚才讲到的“HelloWin”这个有名的例子就要组织一个工程、写上几百行代码才能实现。这就吓跑了很多想学 Windows 编程的人。实际上,在 Windows 下显示“Helloworld”,最简单的方法只要 5 行就够了: #include“windows.h” voidWinMain() MessageBox(NULL,”HelloWorld!”,”MyFirstWindowsApplication”,MB_OK); 当然这个程序只建立了一个最简单的对话框,但这已经够了。 如果你没有 SDK 编程的经验,学 VC 就是要利用 MFC 绕过 Windows 编程的许多细节。有好的工具为什么不用呢?现在你在VC 写一个”HelloWorld” ,只要写一行代码就可以了。 voidCYourView:OnDraw(CDC*pDC) 网络五子棋对战系统共 48 页 第 10 页装订线 /.其他的代码 pDC-TextOut(100,100,”HelloWorld!”); 但 MFC 不是万能的, WinAPI 和 VC 中有很多功能在 MFC 中并不能反映出来。在入门后,要想发挥 VC 的完全能力, WindowsAPI 还是非常重要的。而且,这些API 在其他 Windows 语言中也用得到。学语言,与练武道理也差不多。 VC、VB、Delphi、VFP,以及其他的Windows 编程语言,都属于同一个门派: Windows 门,虽然招式不同,但内功都是一样的,这就是 WindowsAPI(应用编程接口 ),大概是两千个函数。任何武功,招式即使再复杂,通常也能在很短时间内记下来;但内功就不是一朝一夕的事。而且,各门派的内功不同, Unix、Linux 门有 Uinx 的内功,Apple(苹果)门有Mac 的内功,Java 更是自成一派。我们这里说的学 VC,只是学招式,学招式一个月差不多就够了,聪明的两个星期就可以掌握。光学招式,吓唬人是够了,但和高手一过招,非出丑不可。要想精通 VC,必须熟悉 WindowsAPI。(4)高级语言与自然语言 一门高级语言与一门自然语言是类似的。关键要素有三:语法:了解 C 和 C+基本语法,这是比较容易的。修辞:编程的艺术和风格。通常,这是与软件工程联系起来的。算法上的小伎俩并非是关键的。严谨,严格按照规范去做,同时又能发挥出极大的创造性,才是语言学家的本色。词汇:如何利用别人的工作?如何利用自己以前的工作?这是一个软件工程师成功的关键。如果词汇量不丰富,就写不出好文章,就会有想法表达不出。一个人的语法在上小学之前就基本上学成了,修辞水平也在年轻时就确定了,惟有词汇量需要根据需要不断学习、不断扩充。 VC 编程中,拥有大的词汇量就意味着要掌握较多的类、函数和其他编程组件。如: WindowsSDK,MFC,以及你所专攻的领域的现成的 SDK,比如 3D 编程中的 OpenGL,多媒体编程中的 DirectX,图像处理中的 Victor 库。另外,ActiveX 控件的掌握往往也是成败的关键。我们这几年的工作也总结成了一个类库,叫 IPX(图像处理框架) ,大大简化了图像处理的工作;不过现在还有很多细节问题要解决,如果有同学感兴趣可以参与这方面的工作。学习 VC,千万不要用我们在学校里学英语的方法,而要用小孩学说话的方法。所谓学英语的方法,就是我们在本科时学C 语言的那种模式:详细搞懂每一个细节,背大量的规则,很少上机实践,没有实际问题供解决,最后由考试来断定学习成果。这种模式的后果大家都清楚:我们学了十几年英语,可有不少人还只会四五千个单词,写百把字的文章,不会说,不能听;尤其要命的是,看不懂VC的帮助文档。我们要象婴儿一样,在使用中学会语法、修辞和词汇;一开始肯定只能编出最糟糕的,就好像小孩开始只会说: “爸爸坐车车” ;但“爸爸” “车 网络五子棋对战系统共 48 页 第 11 页装订线车”这些词对小孩是最需要的,学习的效率反而最高。学VC 的时候,应从我的需要出发,先做一个最简单的东西,然后一点一点复杂起来,象滚雪球一样。学习 VC 尤其要和别人交流,你苦苦思考不明白的,也许别人早就解决了。一定要善于学习:从书店找出有用的书;向身边的高手学习;寻找可以利用的源代码、类库、组件、控件、库;如果能上互连网,那就更加能解决问题了。 网络五子棋对战系统共 48 页 第 12 页装订线2.系统目标五子棋联机游戏系统主要致力于为提供联机双方进行联机游戏联络,以及提供准确可靠用户操作动作的信息。具体目标如下:1. 选择连接到服务器的客户端进行记录;2. 记录客户机的键盘动作;3. 分析是否已经取得胜利。 网络五子棋对战系统共 48 页 第 13 页装订线3.系统需求分析3.1 系统需求(1)满足记录客户机的游戏动作的基本要求。(2)满足连接数据到客户端的基本要求。(3)满足服务器实时获得客户端游戏状态的基本要求。(4)在服务器端分析双方是否胜利。3.2 功能需求基于系统需求分析,该系统需要实现以下基本功能:(1)动作记录:当客户端程序启动的时候,程序自动加载键盘钩子,对客户端的网络的连接和操作进行记录,并提示给游戏双方。(2)对连接到客户端数据的基本要求:能够将要发送的聊天记录发送至对方手上,能够完成数据的连接。 。(3)实时显示:当从游戏一方将数据传入另一方系统中,将五子棋的表格进行重新的刷新,和更改。(4)通过控制鼠标点击五子棋表格:进入控制模式,加载鼠标钩子,截取鼠标的按件动作,并把该动作发送到游戏另一方,并判断是否胜利。3.3 系统运行环境系统运行环境:Windows 2000 及其以上。3.4 MFC 简述MFC(Microsoft Foundation Class)指的是 Microsoft 基础类,是用来为Windows 开发 C+GUI 应用程序。MFC 是一种十分优秀的工具,使得面向对象的软件函数包装技术演变成为一种可以进行代码复用、简化了程序的复杂性并使程序更加有效的软件开发环境.对于使用 Windows API 进行应用程序开发的人员来说, MFC 使程序员大大提高了程序开发效率.你不必创建 GDU 对象,不必编写许多代码行对这些对象进行初始化,并且小心地跟踪其生命周期的运行情况,你只需建立一个MFC 类的实例,使用其默认值,然后让撤消程序来清除系统资源即可。3.5 服务器与客户端 SOCKET 设计本程序都采用 tcpsock 的 DLL 模型,该模型允许应用程序以 Windows 消息的形 网络五子棋对战系统共 48 页 第 14 页装订线式接收网络事件通知。这个模型是为了适应 Windows 的消息驱动环境而设置的,用于对性能要求不高的网络应用程序,最大可连接 64 个客户端。使用该模型基本满足本程序要求。协议设计:(1) move 鼠标移动;(2) leftdown 鼠标左件按下;(3)leftup 鼠标左件弹起;(4) rightdown 鼠标右件按下;(5) rightup 鼠标右件弹起;(6) send 发送数据;(7) stop 停止发送;(8)quick 实时发送。 网络五子棋对战系统共 48 页 第 15 页装订线4.系统设计4.1 概要设计本次毕业设计的内容就是设计出联机五子棋系统,在此基础上实现系统模型各个子系统的基本功能。此系统用建立一个 tcpsock 的 DLL 文件来进行联机的游戏的网络数据。主要是运用了 strListen 类进行联机数据的传输在系统功能需求分析的基础上,结合 Visual C+程序编制的特点,得到下图所示的系统功能模块图。服务器端服务器端监听连接发送棋子命令接受棋子消息截取鼠标动作实时更新棋盘图 4-1 五子棋服务端模块客户端客户端连接远程服务器发送棋子消息接受棋子消息截取鼠标动作实时更新棋盘图 4-2 五子棋客户端主模块4.2 流程图下面用我们用数据流图(DFD, Data Flow Diagram) ,也就是从数据传递和加工 网络五子棋对战系统共 48 页 第 16 页装订线的角度,以图形的方式刻画数据流从输入到输出的移动变换过程。如下图所示:连接服务器直接到服务器接受连接请求开始用户选择角色判断角色类型在服务端口监听直到有连接的请求接受连接请求初始化棋盘数据信息等待轮到自己下棋等待用户点击棋盘区域将点击位置转化为棋盘位置将坐标数据发送给对方机子判断双方有无获胜显示获胜信息有一方获胜无获胜方客户机服务器图 4-3 功能流程图 网络五子棋对战系统共 48 页 第 17 页装订线本图只是画出了系统得一部分的功能流程图,因为本程序是一个 windows 程序,由较多的功能,主要是基于消息驱动的,所以有一些功能不能有流程图表达出来,如,消息的传递,当系统接到客户端传递来的信息后,就调用一个函数,将随机的产生出一些信息。提示在提示框内。让下棋一方了解到,现在该我下子了。当然传递对方下棋的棋子位置等数据的接受处理也是基于消息的,当有传递数据到达的时候,系统会触发一个消息,程序调用函数读取数据并进行相应的处理。如果是对方棋子位置的信息,则在屏幕上找到对应期盼坐标画出对方棋子,同时判断对方是否获胜。4.3 详细设计4.3.1 钩子的使用本程序使用了多个钩子,他们分别是鼠标钩子,客户段使用的是键盘钩子,拦截 WH_KEYBOARD 消息,服务器使用的鼠标钩子,当服务器要获得客户端操作的时候,鼠标钩子将用户的鼠标信息以消息的形式发送到服务器端,服务器再通过socket 发送到客户端进行控制操作。因此我们必须首先了解钩子的使用函数:HHOOK SetWindowsHookEx( int idHook, HOOK_PROC lpfn, HINSTANCE hMod,DWORD dwThreadID);参数说明: idHook :钩子的类型lpfn :钩子处理函数地址hMod :包含钩子函数的模块句柄dwThreadID :钩子的线程函数说明:函数将在系统中挂上一个由 idHook 指定类型的钩子,处理相应的特定消息。BOOL UnhookWindowsHookEx( HHOOK hhk );函数说明:函数将撤销由 hhk 指定的钩子。LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam,LPARAM lParam );函数说明:函数将消息向下传递,下一个钩子处理将截获这一消息。HHOOK SetWindowsHookEx( int idHook, HOOK_PROC lpfn, HINSTANCE hMod,DWORD dwThreadID);参数说明: idHook :钩子的类型lpfn :钩子处理函数地址hMod :包含钩子函数的模块句柄dwThreadID :钩子的线程 网络五子棋对战系统共 48 页 第 18 页装订线函数说明:函数将在系统中挂上一个由 idHook 指定类型的钩子,监控并处理相应的特定消息。BOOL UnhookWindowsHookEx( HHOOK hhk );函数说明:函数将撤销由 hhk 指定的钩子。LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam,LPARAM lParam );函数说明:函数将消息向下传递,下一个钩子处理将截获这一消息。4.4 程序设计4.4.1 程序窗口的设计由于此应用程序采用的是基于对话框的开发,系统应用程序的各个不同功能是通过选择主对话框窗口中的不同按钮来完成的,每个功能模块由一个或多个对话框实现。该应用程序的主对话框(即运行应用程序后出现的对话框)如图所示:图 4-4 主对话框本文系统得棋盘是由本文设定的画笔进行绘画而成的。布尔值对数据进行更新 网络五子棋对战系统共 48 页 第 19 页装订线和计算,将棋盘和棋子很好的合并在一起。这样整个五子棋的程序将很轻易的展现在人们的面前。建立好后,就可以输入代码:void CMyChessDlg1:DrawNowBlack(int x, int y)/画当前的黑子CClientDC dc(this);CDC mdc;mdc.CreateCompatibleDC(&dc);mdc.SelectObject(m_bblack);dc.BitBlt(24+x*36-x-18,25+y*36-y-18,33,33,&mdc,0,0,MERGEPAINT);mdc.SelectObject(m_blastblackchess);dc.BitBlt(24+x*36-x-18,25+y*36-y-18,33,33,&mdc,0,0,SRCAND);void CMyChessDlg1:DrawNowWhite(int x, int y)/画当前的白子.CClientDC dc(this);/CClientDC类负责在构造时调用Windows函数GetDC,在析构时调用ReleaseDCCDC mdc;mdc.CreateCompatibleDC(&dc);/CreateCompatibleDC()函数创建一个与&dc指定的设备兼容的内存设备描述表mdc.SelectObject(m_bblack);/SelectObject()将一个对象引入设备描述表dc.BitBlt(24+x*36-x-18,25+y*36-y-18,33,33,&mdc,0,0,MERGEPAINT);/MERGEPAINT 用布尔OR操作符将反相的源位图与目标位图结合起来mdc.SelectObject(m_blastwhitechess);dc.BitBlt(24+x*36-x-18,25+y*36-y-18,33,33,&mdc,0,0,SRCAND);/SRCAND用布尔AND操作符将目标位图象素与源位图象素结合起来void CMyChessDlg1:GetBoard(int tempboard15, int nowboard15)/获取当前棋盘状态 int i,j;for(i=0;i15;i+)for(j=0;j15;j+)if(i=9)i=9; 网络五子棋对战系统共 48 页 第 20 页装订线tempboardij=nowboardij;void CMyChessDlg1:InitializeBoard()/初始化/初始化函数int i,j,count=0,k;m_pclastpos.x=-1;m_pclastpos.y=-1;m_pplastpos.x=-1;m_pplastpos.y=-1;start=true;/判断哪方先开始if(m_bwfirst)/计算机先player=false;computer=true;else/人先player=true; computer=false;pwin=cwin=false;/初始化计算机和玩家的获胜组合情况for(i=0;i15;i+)for(j=0;j15;j+)for(k=0;k572;k+)ptableijk=false;ctableijk=false;for(i=0;i2;i+)for(j=0;j572;j+)winij=0;for(i=0;i15;i+)for(j=0;j15;j+)boardij=2; for(i=0;i15;i+) 网络五子棋对战系统共 48 页 第 21 页装订线for(j=0;j11;j+)for(k=0;k5;k+)ptablej+kicount=true;ctablej+kicount=true;count+;for(i=0;i15;i+)for(j=0;j11;j+)for(k=0;k5;k+)ptableij+kcount=true;ctableij+kcount=true;count+;for(i=0;i11;i+)for(j=0;j11;j+)for(k=0;k5;k+)ptablej+ki+kcount=true;ctablej+ki+kcount=true;count+;for(i=0;i=4;j-)for(k=0;k5;k+)ptablej-ki+kcount=true;ctablej-ki+kcount=true;count+; 网络五子棋对战系统共 48 页 第 22 页装订线void CMyChessDlg1:OnLButtonDown(UINT nFlags, CPoint point)int x,y,tx,ty;/ TODO: Add your message handler code here and/or call defaultif(player&point.x=535&point.y=36)tx-=36;while(ty=36)ty-=36;tx+=x/36;ty+=y/36;if(tx18)x=x/36+1;elsex=x/36;if(ty18)y=y/36+1;elsey=y/36;/将坐标换算成棋盘上的格子。if(boardxy=2)boardxy=0;/设为玩家的棋子if(m_pplastpos.x!=-1&m_pplastpos.y!=-1)if(!m_bwfirst)DrawWhiteChess(m_pplastpos.x,m_pplastpos.y); else DrawBlackChess(m_pplastpos.x,m_pplastpos.y);if(!m_bwfirst)DrawNowWhite(x,y); 网络五子棋对战系统共 48 页 第 23 页装订线elseDrawNowBlack(x,y);m_pplastpos.x=x;/将当前棋子的信息装入,记录移动棋子的结构中m_pplastpos.y=y;for(int i=0;i572;i+)/修改玩家下子后棋盘状态的变化if(ptablexyi&win0i!=7)win0i+;if(ctablexyi)ctablexyi=false;win1i=7;player=false; computer=true;CDialog:OnLButtonDown(nFlags, point);void CMyChessDlg1:OnPaint()if (IsIconic()/IsIconic()函数指出此CWnd是否最小化CPaintDC dc(this); / CPaintDC 为设备描述表类SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);/SendMessage()函数向此窗口发送指定的消息/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);/GetClientRect(&rect)函数把此CWnd客户区的客户坐标拷贝到rect所指向的结构中int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2; 网络五子棋对战系统共 48 页 第 24 页装订线/ Draw the icondc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();/当Windows或应用程序申请绘制应用程序窗口的某一部分时此函数被调用CClientDC dc(this);/CClientDC类负责在构造时调用Windows函数GetDC,在析构时调用ReleaseDC.CDC mdc;mdc.CreateCompatibleDC(&dc);/CreateCompatibleDC()函数创建一个与pDC指定的设备兼容的内存设备描述表mdc.SelectObject(m_bboard);/SelectObject()函数将一对象选入设备描述表dc.BitBlt(0,0,600,537,&mdc,0,0,SRCCOPY);/BitBlt()函数将一个位图从源设备描述表拷贝到此当前设备描述表中 /SRCCOPY将源位图拷贝到目标位图上for(int i=0;i15;i+)for(int j=0;j 1000#pragma once#endif / _MSC_VER 1000/ MyChessDlg.h : header file/ CMyChessDlg dialogclass CMyChessDlg1 : public CDialog/ Constructionpublic:bool SearchBlank(int &i, int &j, int nowboard15);void IsWin();void InitializeBoard();int GiveScore(int type, int x, int y);void GetBoard(int tempboard15, int nowboard15);void DrawWhiteChess(int x, int y);void DrawNowWhite(int x,int y);void DrawNowBlack(int x,int y);void DrawBlackChess(int x, int y);void ComTurn();int board1515;bool computer;bool ctable1515572;bool cwin;CBitmap m_bblack;CBitmap m_bwhitechess;CBitmap m_bblackchess;CBitmap m_bboard; 网络五子棋对战系统共 48 页 第 31 页装订线CBitmap m_blastwhitechess;CBitmap m_blastblackchess;bool m_binit;/判断游戏是否是处于刚开始阶段bool m_bwfirst;/谁先走,1为电脑先走,0为玩家先走CPoint m_pplastpos;/玩家走的前一步棋CPoint m_pclastpos;/计算机走的前一步棋bool player;bool ptable1515572;bool pwin;bool start;int win2572;CMyChessDlg1(CWnd* pParent = NULL); / standard constructor / Dialog Data/AFX_DATA(CMyChessDlg)enum IDD = IDD_ESTDLG ;/ NOTE: the ClassWizard will add data members here/AFX_DATA/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CMyChessDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:HICON m_hIcon;void OnUpdateSetPerson(CCmdUI* pCmdUI);void OnTimer(UINT nIDEvent);void OnSysCommand(UINT nID, LPARAM lParam);void OnSetPerson();HCURSOR OnQueryDragIcon();void OnPaint();void OnLButtonDown(UINT nFlags, CPoint point); 网络五子棋对战系统共 48 页 第 32 页装订线/ Generated message map functions/AFX_MSG(CMyChessDlg)afx_msg void OnGameStart();/AFX_MSGDECLARE_MESSAGE_MAP()private:public:afx_msg void OnBnClickedEffect();afx_msg void OnBnClickedListen();/ App command to run the dialog/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional declarations immediately before the previous line.#endif / !defined(AFX_MYCHESSDLG_H_327DACFE_0A82_4A9B_A675_C9F2568F5C13_INCLUDED_)MyChessDlg.cpp/ MyChessDlg.cpp : implementation file/#include stdafx.h#include fchess.h#include MyChessDlg.h#include .mychessdlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CMyChessDlg dialogCMyChessDlg1:CMyChessDlg1(CWnd* pParent /*=NULL*/)/gjl: CDialog(CMyChessDlg1:IDD, pParent) 网络五子棋对战系统共 48 页 第 33 页装订线/AFX_DATA_INIT(CMyChessDlg)/ NOTE: the ClassWizard will add member initialization here/AFX_DATA_INITm_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);/AfxGetApp获取一个指向CWinApp对象指针/CMyChessDlg:CMyChessDlg(CWnd* pParent /*=NULL*/)/: CDialog(CMyChessDlg:IDD, pParent)/AFX_DATA_INIT(CMyChessDlg)/ NOTE: the ClassWizard will add member initialization here/AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32/m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);/AfxGetApp获取一个指向CWinApp对象指针/void CMyChessDlg1:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/DoDataExchange()框架调用此函数以交换和有效化对话数据,pDX是指向一个CDataExchange对象的指针/AFX_DATA_MAP(CMyChessDlg)/ NOTE: the ClassWizard will add DDX and DDV calls here/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CMyChessDlg1, CDialog)/AFX_MSG_MAP(CMyChessDlg)ON_COMMAND(ID_GAME_START, OnGameStart)/AFX_MSG_MAPON_BN_CLICKED(IDC_EFFECT, OnBnClickedEffect)ON_BN_CLICKED(IDC_LISTEN, OnBnClickedListen)END_MESSAGE_MAP()/ CMyChessDlg message handlersvoid CMyChessDlg1:OnGameStart() 网络五子棋对战系统共 48 页 第 34 页装订线 InitializeBoard();Invalidate();/此函数使CWnd的整个客户区无效SetTimer(0,200,NULL);/0:为一个非0的定时器标识符。200:为以毫秒数指出限时值;NULL:为WM_TIMER消息将被放到应用程序的队列中并由此CWnd对象来处理void CMyChessDlg1:ComTurn()/寻找下棋的空白位置,并下棋子/bestx,besty为当前最佳位置,i,j是人能下的各种位置;ci,cj是计算机能下的各种位置int bestx,besty,i,j,ci,cj,ptemp,ctemp,pscore=10,cscore=-10000,ctempboard1515,ptempboard1515;int m,n,temp120,temp220;/暂存第一步搜索的信息if(start)if(board77=2)/如果棋盘为空bestx=7;besty=7;elsebestx=8;besty=8;start=false;else/寻找最佳位置 GetBoard(ctempboard,board);while(SearchBlank(i,j,ctempboard)n=0;pscore=10;GetBoard(ptempboard,board);ctempboardij=3;/标记已被查找ctemp=GiveScore(1,i,j); 网络五子棋对战系统共 48 页 第 35 页装订线for(m=0;mptemp)/此时为玩家下子,运用极小极大法时应选取最小值pscore=ptemp;for(m=0;mcscore)/此时为计算机下子,运用极小极大法时应选取最最大值cscore=ctemp+pscore;bestx=ci;besty=cj;boardbestxbesty=1;if(m_pclastpos.x!=-1&m_pclastpos.y!=-1) 网络五子棋对战系统共 48 页 第 36 页装订线/画前一棋子if(!m_bwfirst)DrawBlackChess(m_pclastpos.x,m_pclastpos.y);else DrawWhiteChess(m_pclastpos.x,m_pc
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!