网络五子棋对战系统

时间:2024.4.20

┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 摘 要 五子棋游戏以其优秀的人工智能深受广大玩家的喜爱,而对于初步探究网络编成的编程爱好者来说,编制五子棋程序因其规则简单而大受欢迎,然而它却要求程序员对五子棋规则有相当深入的了解。程序员考虑得越周到,其五子棋程序就越智能。 五子棋游戏软件设计的主要内容是:根据五子棋的基本规则,要让对方客户端知道该在哪一点下子,就要根据盘面的形势,并把棋盘棋子的重新绘制绘制,也就是更新该点的位置,然后再通过监听网络传递的消息,直到新的位置放在棋盘的什么位置上,在进行修改,并通过计算,得出玩家是否获得胜利.,因此玩家就能反复的进行联机游戏。 本文论述了采用联机对战的方式体现出五子棋程序的分析与设计,并采用面向对象的开发工具VC++来具体实现。 关键词:五子棋;VC++;面向对象

共 48 页 第 1 页

┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 Abstract Wuziqi 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 other's 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 页 第 2 页

┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 目 录 1. 引言 ............................................................... 4 1.1课题背景 .......................................................... 4 1.1.1背景知识 ...................................................... 4 1.1.2五子棋游戏的规则 .............................................. 4 2. 系统目标 .......................................................... 12 3. 系统需求分析 ...................................................... 13 3.1系统需求 ......................................................... 13 3.2功能需求 ......................................................... 13 3.3系统运行环境 ..................................................... 13 3.4 MFC简述 ......................................................... 13 3.5 服务器与客户端SOCKET设计 ....................................... 13 4. 系统设计 .......................................................... 15 4.1 概要设计 ........................................................ 15 4.2流程图 ........................................................... 15 4.3详细设计 ......................................................... 17 4.3.1钩子的使用 ................................................... 17 4.4 程序设计 ........................................................ 18 4.4.1 程序窗口的设计 .............................................. 18 5. 结论 .............................................................. 26 5.1 关键技术 ........................................................ 26 5.2总结 ............................................................. 26 设计总结 .............................................................. 27 致谢 .................................................................. 28 参考文献 .............................................................. 29 附 录 ............................................................... 30

共 48 页 第 3 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 1. 引言 1.1课题背景 1.1.1背景知识 五子棋是起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为“连珠”,英译为“Renju”,英文称之为“Gobang”或“FIR”(Five in a Row的缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。 五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。 五子棋起源于古代中国,发展于日本,风靡于欧洲。对于它与围棋的关系有两种说法,一说早于围棋,早在“尧造围棋”之前,民间就已有五子棋游戏;一说源于围棋,是围棋发展的一个分支。在中国的文化里,倍受人们的青睐。古代的五子棋的棋具与围棋相同,纵横各十七道。五子棋大约随围棋一起在我国南北朝时先后传入朝鲜、日本等地。据日本史料文献介绍,中国古代的五子棋是经由高丽(朝鲜),于1688年至1704年的日本元禄时代传到日本的。到日本明治32年(公元1899年),经过公开征名,“连珠”这一名称才被正式确定下来,取意于“日月如合壁,五星如连珠”。从此,连珠活动经过了不断的改良,主要是规则的变化(即对执黑棋一方的限制),例如,1899年规定,禁止黑白双方走“双三”;19xx年规定,只禁止黑方走“双三”;19xx年规定,黑方被迫走“双三”亦算输;19xx年规定,黑方不许走“长连”;19xx年规定,黑方不许走“四、三、三”;19xx年规定,黑方不许走“双四”,并规定将19×19的围棋盘改为15×15的连珠专用棋盘。本世纪初五子棋传入欧洲并迅速风靡全欧。通过一系列的变化,使五子棋这一简单的游戏复杂化、规范化,而最终成为今天的职业连珠五子棋,同时也成为一种国际比赛棋。 1.1.2五子棋游戏的规则 (1)棋盘,棋子: 1、棋盘为十五路,正中一点为“天元”,周围四点为小星。 2、棋子分黑白两色,黑子113枚,白子112枚,共225枚。 (2)比赛规则:

1、黑先白后,从天元开始落子。然后执白棋的一方在黑棋周围的交叉点上落子,白第二着棋应布在自己河界的一侧。此后,执黑方在以天元为中心的25个交叉点的范围内布盘面的第三着棋。

2、最先在横向,竖向,斜向形成连续的相同色五个棋子的一方为胜。

共 48 页 第 4 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 3、黑棋禁手判负,白棋无禁手。黑棋禁手包括“三三”,“四四”,“长连”。黑方只能“四三”胜。所谓禁手,是指黑方一子落下同时形成两个或两个以上的活三,冲四及长连禁手。长连禁手是指黑方形成六个或六个以上的连续棋子。 4、双方均不能形成五连为和棋。 5、对局中拔子,中途退场均判为负。 6、五连与禁手同时形成,先五为胜。因黑方已形成五连,故禁手失效,黑方胜。 7、黑方禁手形成时,白方应立即指出禁手点,黑方即负。若白方继续应子,则黑方禁手不成立。 8、高段位职业比赛的特殊规定:“三手可交换”:黑下完第2手,执白者可提出交换。即执白方变为执黑方。“五手两打法”:执黑下第五手时,必须下两手棋,执白者从这两手棋中任选一步。 本文所论述的联机五子棋系统就是依照这种方式进行的。 1.1.3开发系统的几点建议 (1)开发系统不必贪大求全,力争简单实用。应从大处着眼,小处着手,循序渐进,逐步完善。 (2)对开发过程中的各种文档应当注意保存。这是系统开发所要求的必要条件。 (3)尽可能取得对程序设计重视,使用简化的程序代码保证整个系统开发的清晰。 1.2相关技术介绍 1.2.1结构化生命周期法简介 结构化生命周期法是一种传统的系统开发方法,其基本思想是把整个系统开发过程分成若干个阶段,每个阶段进行若干活动,每项活动应用一系列标准、规范、方法和技术,完成一个或多个任务,形成符合给定规范的产品。 采用结构化生命周期法来开发系统时,应遵循的主要原则: (1)用户参与的原则。 (2)“先逻辑后物理”的原则。 (3)“自顶向下”的原则。 (4)工作成果描述(主要指文档)标准化的原则。 其具体开发步骤可分为以下四步: (1)系统规划。 (2)系统开发。 (3)系统的运行及维护。

(4)系统评价 。

其中系统开发又分为以下四个步骤:

(1)系统分析:系统初步调查、系统可行性研究、行系统的详细调查、系统逻辑方案的提出。

共 48 页 第 5 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 (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++最基本内容:类、继承性、封装性、多态性的概念。

(4)如何用向导建立一个程序框架。

(6)设计工具条。

共 48 页 第 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视图,负责内存数据与用户的交互。包括数据的显示、用户操作的响应(如菜单的选取、鼠标的响应)。最重要的是OnDraw(重画窗口),通常用CWnd::Invalidate()来启动它。另外,它通过消息映射表处理菜单、工具条、快

共 48 页 第 7 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 捷键和其他用户消息。你自己的许多功能都要加在里面,你打交道最多的就是它。 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、几点经验

(1)为什么要用Windows而不是DOS编程。

Windows编程并不比DOS编程难很多,只是在刚刚接触的时候感到头绪繁多,不知从何下手。实际上,如果你会C语言,你会发现Windows编程的难度并不比

共 48 页 第 8 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 当年学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) {

//??.其他的代码

pDC->TextOut(100,100,”HelloWorld!”); }

共 48 页 第 9 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 但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的帮助文档。我们要象婴儿一样,在使用中学会语法、修辞和词汇;一开始肯定只能编出最糟糕的,就好像小孩开始只会说:“爸爸坐车车”;但“爸爸”“车车”这些词对小孩是最需要的,学习的效率反而最高。学VC的时候,

应从我的需要出发,先做一个最简单的东西,然后一点一点复杂起来,象滚雪球一样。

学习VC尤其要和别人交流,你苦苦思考不明白的,也许别人早就解决了。一定

共 48 页 第 10 页

┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 要善于学习:从书店找出有用的书;向身边的高手学习;寻找可以利用的源代码、类库、组件、控件、库;如果能上互连网,那就更加能解决问题了。

共 48 页 第 11 页

┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 2. 系统目标 五子棋联机游戏系统主要致力于为提供联机双方进行联机游戏联络,以及提供准确可靠用户操作动作的信息。具体目标如下: 1. 选择连接到服务器的客户端进行记录; 2. 记录客户机的键盘动作; 3. 分析是否已经取得胜利。

共 48 页 第 12 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 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 页 第 13 页

┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 式接收网络事件通知。这个模型是为了适应Windows的消息驱动环境而设置的,用于对性能要求不高的网络应用程序,最大可连接64个客户端。使用该模型基本满足本程序要求。 协议设计: (1) move 鼠标移动; (2) leftdown 鼠标左件按下; (3)leftup 鼠标左件弹起; (4) rightdown 鼠标右件按下; (5) rightup 鼠标右件弹起; (6) send 发送数据; (7) stop 停止发送; (8)quick 实时发送。

共 48 页 第 14 页

┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊

安徽工业大学管理科学与工程学院 网络五子棋对战系统

4. 系统设计

4.1 概要设计

本次毕业设计的内容就是设计出联机五子棋系统,在此基础上实现系统模型各个子系统的基本功能。此系统用建立一个tcpsock的DLL文件来进行联机的游戏的网络数据。主要是运用了strListen类进行联机数据的传输

在系统功能需求分析的基础上,结合Visual C++程序编制的特点,得到下图所示的系统功能模块图。

图4-1五子棋服务端模块

网络五子棋对战系统

图4-2 五子棋客户端主模块

4.2流程图

下面用我们用数据流图(DFD, Data Flow Diagram),也就是从数据传递和加工的

网络五子棋对战系统

共 48 页 第 15 页

┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊

安徽工业大学管理科学与工程学院 网络五子棋对战系统

角度,以图形的方式刻画数据流从输入到输出的移动变换过程。如下图所示:

图4-3 功能流程图

网络五子棋对战系统

共 48 页 第 16 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 本图只是画出了系统得一部分的功能流程图,因为本程序是一个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 页 第 17 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 函数说明:函数将在系统中挂上一个由idHook指定类型的钩子,监控并处理相应的特定消息。 BOOL UnhookWindowsHookEx( HHOOK hhk ); 函数说明:函数将撤销由hhk指定的钩子。 LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam,LPARAM lParam ); 函数说明:函数将消息向下传递,下一个钩子处理将截获这一消息。 4.4 程序设计 4.4.1 程序窗口的设计 由于此应用程序采用的是基于对话框的开发,系统应用程序的各个不同功能是通过选择主对话框窗口中的不同按钮来完成的,每个功能模块由一个或多个对话框实现。该应用程序的主对话框(即运行应用程序后出现的对话框)如图所示:

网络五子棋对战系统

图4-4 主对话框

本文系统得棋盘是由本文设定的画笔进行绘画而成的。布尔值对数据进行更新和

共 48 页 第 18 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 计算,将棋盘和棋子很好的合并在一起。这样整个五子棋的程序将很轻易的展现在人们的面前。 建立好后,就可以输入代码: void CMyChessDlg1::DrawNowBlack(int x, int y) { //画当前的黑子 } void CMyChessDlg1::DrawNowWhite(int x, int y) { //画当前的白子. CClientDC dc(this);//CClientDC类负责在构造时调用Windows函数GetDC,在析构时调用ReleaseDC CDC mdc; mdc.CreateCompatibleDC(&dc);//CreateCompatibleDC()函数创建一个与&dc指定的设备兼容的内存设备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); 描述表 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 tempboard[][15], int nowboard[][15])//获取当前棋盘状态 { int i,j;

for(i=0;i<15;i++) for(j=0;j<15;j++) { if(i==9) i=9;

共 48 页 第 19 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 } 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)//计算机先 { } else//人先 { player=true; player=false; computer=true; } tempboard[i][j]=nowboard[i][j]; computer=false; } pwin=cwin=false;//初始化计算机和玩家的获胜组合情况 for(i=0;i<15;i++) for(j=0;j<15;j++) for(k=0;k<572;k++) { } ptable[i][j][k]=false; ctable[i][j][k]=false; for(i=0;i<2;i++) for(j=0;j<572;j++) win[i][j]=0; for(i=0;i<15;i++) for(j=0;j<15;j++) board[i][j]=2; for(i=0;i<15;i++)

共 48 页 第 20 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统

for(j=0;j<11;j++) { } for(k=0;k<5;k++) { } count++; ptable[j+k][i][count]=true; ctable[j+k][i][count]=true; for(i=0;i<15;i++) for(j=0;j<11;j++) { } for(k=0;k<5;k++) { } count++; ptable[i][j+k][count]=true; ctable[i][j+k][count]=true; for(i=0;i<11;i++) for(j=0;j<11;j++) { } for(k=0;k<5;k++) { } count++; ptable[j+k][i+k][count]=true; ctable[j+k][i+k][count]=true; for(i=0;i<11;i++) for(j=14;j>=4;j--) { for(k=0;k<5;k++) { } count++; ptable[j-k][i+k][count]=true; ctable[j-k][i+k][count]=true;

共 48 页 第 21 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 } void CMyChessDlg1::OnLButtonDown(UINT nFlags, CPoint point) {

if(!m_bwfirst) DrawNowWhite(x,y); int x,y,tx,ty; // TODO: Add your message handler code here and/or call default if(player&&point.x<=535&&point.y<=535)//判断是否在有效区域 { tx=x=point.x-24; ty=y=point.y-25; while(tx>=36) tx-=36; } while(ty>=36) ty-=36; tx+=x/36; ty+=y/36; if(tx>18) x=x/36+1; else x=x/36; if(ty>18) y=y/36+1; else y=y/36;//将坐标换算成棋盘上的格子。 if(board[x][y]==2) { board[x][y]=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);

共 48 页 第 22 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 } void CMyChessDlg1::OnPaint() { if (IsIconic())//IsIconic()函数指出此CWnd是否最小化 SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);//SendMessage()函数向此窗口{ CPaintDC dc(this); // CPaintDC 为设备描述表类 } CDialog::OnLButtonDown(nFlags, point); else DrawNowBlack(x,y); m_pplastpos.x=x;//将当前棋子的信息装入,记录移动棋子的结构中 m_pplastpos.y=y; for(int i=0;i<572;i++) {//修改玩家下子后棋盘状态的变化 } player=false; if(ptable[x][y][i]&&win[0][i]!=7) win[0][i]++; if(ctable[x][y][i]) { } ctable[x][y][i]=false; win[1][i]=7; computer=true; } 发送指定的消息 // Center icon in client rectangle int 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 页 第 23 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 CClientDC dc(this);//CClientDC类负责在构造时调用Windows函数GetDC,在析构时调用ReleaseDC. CDC mdc; mdc.CreateCompatibleDC(&dc);//CreateCompatibleDC()函数创建一个与pDC指定的设备兼容的内存设备 } else { } // Draw the icon dc.DrawIcon(x, y, m_hIcon); CDialog::OnPaint();//当Windows或应用程序申请绘制应用程序窗口的某一部分时此函数被调用 描述表 mdc.SelectObject(m_bboard);//SelectObject()函数将一对象选入设备描述表 dc.BitBlt(0,0,600,537,&mdc,0,0,SRCCOPY);//BitBlt()函数将一个位图从源设备描述表拷贝到此当前设备描述表中 //SRCCOPY将源位图拷贝到目标位图上 for(int i=0;i<15;i++) for(int j=0;j<15;j++) { //玩家的棋子 if(board[i][j]==0) { if(m_pplastpos.x==i&&m_pplastpos.y==j) { if(!m_bwfirst) DrawNowWhite(m_pplastpos.x,m_pplastpos.y); else DrawNowBlack(m_pplastpos.x,m_pplastpos.y); } continue; if(!m_bwfirst)

DrawWhiteChess(i,j); else DrawBlackChess(i,j); }

共 48 页 第 24 页

┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 //计算机的棋子 if(board[i][j]==1) { if(m_pclastpos.x==i&&m_pclastpos.y==j) { if(!m_bwfirst) DrawNowBlack(m_pclastpos.x,m_pclastpos.y); else DrawNowWhite(m_pclastpos.x,m_pclastpos.y); } continue; if(!m_bwfirst) DrawBlackChess(i,j); else DrawWhiteChess(i,j); } } } dc.Draw3dRect(0,0,537,537,RGB(255,255,255),RGB(0,0,0));//画15*15的棋盘 先查看客户端的状态,然后依照客户端的变化在更新五子棋的程序。

共 48 页 第 25 页

┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 5. 结论 5.1 关键技术 本系统开发过程中用到的关键技术主要有: (1)钩子程序的使用; (2)对网络联机的知识。 5.2总结 在设计过程中,出现过不同的问题,开始的时候解决起来有一些困难,经过两个月的不断学习和实践,基本上都已经解决,而且通过解决问题的过程,总结出一些需要注意的事项。 网络知识相对来说,并不是很容易理解,在网络的开发中,我们必须要注意到消息的获得和判断,例如winsock的开发机制和传输数据的内容,我们必须要注意。 在系统开发的时候,我们使用的是MFC进行数据的封装,其代码量使用比Winsock要小,而编写windows应用程序,大多基于事件机制,对windows系统的事件机制需要能够透彻的理解,我们才能进行完善的系统设计和开发。

共 48 页 第 26 页

┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 设计总结 由于以前对Visual C++ 6.0的接触并不是很多,对它的开发环境不是非常了解,所以在程序的开发过程中遇到了很多的困难,但经过同学和指导老师的帮助,一一化解了困难,并从中学到了很多编程方面的知识。但是由于经验方面的原因,以及对库存方面的操作流程了解不足,该系统还有许多不尽如人意的地方和功能上的缺陷,这些都有待于进一步改善。

共 48 页 第 27 页

┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 致 谢 此毕业设计为时两个月,由于时间和能力的限制,难免出现许多不足之处,敬请各位老师批评指正。但是这一段的实践和学习,大大提高了我解决实际问题的能力,确实使我收获很多,提高很大,想信对我以后的学习生活都会大有裨益。 在此,首先要感谢我的指导老师夏明长老师不辞劳苦地指导,使我们得以顺利完成毕业设计;其次,系里的其他的一些老师和机房的老师在毕业设计的过程中给予我的大力支持,我从这些老师那里获益很多,在此表示衷心的感谢。最后,要感谢和我同组做毕业设计的同学,这份毕业设计的成果是大家共同努力的结果。谢谢大家。

共 48 页 第 28 页

┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 参考文献 [1] 伍俊良.《Visual C++ 课程设计与系统开发案例》[M].清华大学出版社.2004 [2] 杨小平.《Visual C++ 项目案例导航》[M].科学出版社.2007 [3] 邓宗明,张晓竞.《Visual C++ 编程实用技术与案例》[M].清华大学出版社.2003 [4] 郑阿奇.《Visual C++ 实用教程》[M].电子工业出版社.2006 [5] 王艳平, 《WINDOWS网络与通信程序设计》[M].人民邮电出版社.2005 [6] 郑人杰,殷人昆,陶永雷.实用软件工程[M].清华大学出版社.2006 [7]侯晓强;徐春荣;勾海波.Java服务器编程实例[M].中国青年出版社.2004 [8]江雨燕;周传华.管理信息系统[M].南京大学出版社.2007 [9]王珊;萨师煊. 数据库系统概论[M].高等教育出版社.2005 [10]郑阿奇.SQL Server教程[M].清华大学出版社.2005

共 48 页 第 29 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 附 录 1、棋盘程序 MyChessDlg.h #if !defined(AFX_MYCHESSDLG_H__327DACFE_0A82_4A9B_A675_C9F2568F5C13__INCLUDED_) #define AFX_MYCHESSDLG_H__327DACFE_0A82_4A9B_A675_C9F2568F5C13__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // MyChessDlg.h : header file // ///////////////////////////////////////////////////////////////////////////// // CMyChessDlg dialog class CMyChessDlg1 : public CDialog { // Construction public:

bool SearchBlank(int &i, int &j, int nowboard[][15]); void IsWin(); void InitializeBoard(); int GiveScore(int type, int x, int y); void GetBoard(int tempboard[][15], int nowboard[][15]); 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 board[15][15]; bool computer; bool ctable[15][15][572]; bool cwin; CBitmap m_bblack; CBitmap m_bwhitechess; CBitmap m_bblackchess; CBitmap m_bboard;

共 48 页 第 30 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 CBitmap m_blastwhitechess; CBitmap m_blastblackchess; bool m_binit;//判断游戏是否是处于刚开始阶段 bool m_bwfirst;//谁先走,1为电脑先走,0为玩家先走 CPoint m_pplastpos;//玩家走的前一步棋 CPoint m_pclastpos;//计算机走的前一步棋 bool player; bool ptable[15][15][572]; bool pwin; bool start; int win[2][572]; CMyChessDlg1(CWnd* pParent = NULL); // standard constructor // Dialog Data // Overrides // Implementation protected:

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); // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMyChessDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL //{{AFX_DATA(CMyChessDlg) enum { IDD = IDD_ESTDLG }; // NOTE: the ClassWizard will add data members here //}}AFX_DATA

共 48 页 第 31 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 // Generated message map functions //{{AFX_MSG(CMyChessDlg) afx_msg void OnGameStart(); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: public: }; // 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_) afx_msg void OnBnClickedEffect(); afx_msg void OnBnClickedListen(); 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_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMyChessDlg dialog

CMyChessDlg1::CMyChessDlg1(CWnd* pParent /*=NULL*/)//gjl : CDialog(CMyChessDlg1::IDD, pParent)

共 48 页 第 32 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 { } //CMyChessDlg::CMyChessDlg(CWnd* pParent /*=NULL*/)/ // : CDialog(CMyChessDlg::IDD, pParent) //{ //{{AFX_DATA_INIT(CMyChessDlg) // // NOTE: the ClassWizard will add member initialization here //{{AFX_DATA_INIT(CMyChessDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);//AfxGetApp获取一个指向CWinApp对象指针 //}}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对象的指针 } BEGIN_MESSAGE_MAP(CMyChessDlg1, CDialog) //{{AFX_MSG_MAP(CMyChessDlg) ON_COMMAND(ID_GAME_START, OnGameStart) //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_EFFECT, OnBnClickedEffect) ON_BN_CLICKED(IDC_LISTEN, OnBnClickedListen) //{{AFX_DATA_MAP(CMyChessDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP END_MESSAGE_MAP() /////////////////////////////////////////////////////////////////////////////

// CMyChessDlg message handlers

void CMyChessDlg1::OnGameStart()

共 48 页 第 33 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 { 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,ctempboard[15][15],ptempboard[15][15]; int m,n,temp1[20],temp2[20];//暂存第一步搜索的信息 if(start) { } else {//寻找最佳位置 if(board[7][7]==2)//如果棋盘为空 { } else { } start=false; bestx=8; besty=8; bestx=7; besty=7; GetBoard(ctempboard,board);

while(SearchBlank(i,j,ctempboard)) { n=0; pscore=10; GetBoard(ptempboard,board); ctempboard[i][j]=3;//标记已被查找 ctemp=GiveScore(1,i,j);

共 48 页 第 34 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统

} } board[bestx][besty]=1; if(m_pclastpos.x!=-1&&m_pclastpos.y!=-1) ci=i; cj=j; while(SearchBlank(i,j,ptempboard)) { } for(m=0;m<n;m++) {//恢复玩家信息 } if(ctemp+pscore>cscore)//此时为计算机下子,运用极小极大法时应选取最最大值 { } cscore=ctemp+pscore; bestx=ci; besty=cj; ptable[ci][cj][temp1[m]]=true; win[0][temp1[m]]=temp2[m]; ptempboard[i][j]=3;//标记已被查找 ptemp=GiveScore(0,i,j); if(pscore>ptemp)//此时为玩家下子,运用极小极大法时应选取最小值 pscore=ptemp; for(m=0;m<572;m++) {//暂时更改玩家信息 } ptempboard[i][j]=1; if(ptable[i][j][m]) { } temp1[n]=m; ptable[i][j][m]=false; temp2[n]=win[0][m]; win[0][m]=7; n++;

共 48 页 第 35 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 if(!m_bwfirst) DrawNowBlack(bestx,besty); {//画前一棋子 if(!m_bwfirst) DrawBlackChess(m_pclastpos.x,m_pclastpos.y); else DrawWhiteChess(m_pclastpos.x,m_pclastpos.y); } else DrawNowWhite(bestx,besty); } void CMyChessDlg1::DrawBlackChess(int x, int y) { CClientDC dc(this);//CClientDC类负责在构造时调用Windows函数GetDC,在析构时调用ReleaseDC. CDC mdc;//定义设备描述表对象 mdc.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操作将反m_pclastpos.x=bestx; m_pclastpos.y=besty; for(i=0;i<572;i++) {//修改计算机下子后,棋盘的变化状况 } computer=false; player=true; if(ctable[bestx][besty][i]&&win[1][i]!=7) win[1][i]++; if(ptable[bestx][besty][i]) { } ptable[bestx][besty][i]=false; win[0][i]=7; 相的源位图和和目标位图结合起来

mdc.SelectObject(m_bblackchess); dc.BitBlt(24+x*36-x-18,25+y*36-y-18,33,33,&mdc,0,0,SRCAND);//SRCAND用布尔AND操作将目标位图

共 48 页 第 36 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 象素和源位图象素结合起来 } void CMyChessDlg1::DrawNowBlack(int x, int y) { //画当前的黑子 } void CMyChessDlg1::DrawNowWhite(int x, int y) { //画当前的白子. CClientDC dc(this);//CClientDC类负责在构造时调用Windows函数GetDC,在析构时调用ReleaseDC CDC mdc; mdc.CreateCompatibleDC(&dc);//CreateCompatibleDC()函数创建一个与&dc指定的设备兼容的内存设备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); 描述表 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::DrawWhiteChess(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_bwhitechess);

共 48 页 第 37 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 } void CMyChessDlg1::GetBoard(int tempboard[][15], int nowboard[][15])//获取当前棋盘状态 { int i,j; } int CMyChessDlg1::GiveScore(int type, int x, int y) {

int i,score=0; for(i=0;i<572;i++) { //计算机下 if(type==1) { if(ctable[x][y][i]) { switch(win[1][i]) { case 1: score+=5; break; for(i=0;i<15;i++) for(j=0;j<15;j++) { } if(i==9) i=9; dc.BitBlt(24+x*36-x-18,25+y*36-y-18,33,33,&mdc,0,0,SRCAND); tempboard[i][j]=nowboard[i][j]; case 2: score+=50; break; case 3: score+=100; break; case 4: score+=10000;

共 48 页 第 38 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 break; default: } void CMyChessDlg1::InitializeBoard()//初始化

{

//初始化函数

int i,j,count=0,k; } return score; } //人下 else { } if(ptable[x][y][i]) { switch(win[0][i]) { case 1: score-=5; break; } } break; case 2: score-=50; break; case 3: score-=500; break; case 4: score-=5000; break; default: } } break;

共 48 页 第 39 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 m_pclastpos.x=-1; m_pclastpos.y=-1; m_pplastpos.x=-1; m_pplastpos.y=-1; start=true; //判断哪方先开始 if(m_bwfirst)//计算机先 { } else//人先 { player=true; player=false; computer=true; computer=false; } pwin=cwin=false;//初始化计算机和玩家的获胜组合情况 for(i=0;i<15;i++) for(j=0;j<15;j++) for(k=0;k<572;k++) { } ptable[i][j][k]=false; ctable[i][j][k]=false; for(i=0;i<2;i++) for(j=0;j<572;j++) win[i][j]=0; for(i=0;i<15;i++) for(j=0;j<15;j++) board[i][j]=2; for(i=0;i<15;i++)

for(j=0;j<11;j++) { for(k=0;k<5;k++) { } ptable[j+k][i][count]=true; ctable[j+k][i][count]=true;

共 48 页 第 40 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 } void CMyChessDlg1::IsWin()

{

int i;

for(i=0;i<572;i++) } count++; for(i=0;i<15;i++) for(j=0;j<11;j++) { } for(k=0;k<5;k++) { } count++; ptable[i][j+k][count]=true; ctable[i][j+k][count]=true; for(i=0;i<11;i++) for(j=0;j<11;j++) { } for(k=0;k<5;k++) { } count++; ptable[j+k][i+k][count]=true; ctable[j+k][i+k][count]=true; for(i=0;i<11;i++) for(j=14;j>=4;j--) { } for(k=0;k<5;k++) { } count++; ptable[j-k][i+k][count]=true; ctable[j-k][i+k][count]=true;

共 48 页 第 41 页

┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 } void CMyChessDlg1::OnLButtonDown(UINT nFlags, CPoint point) {

int x,y,tx,ty; // TODO: Add your message handler code here and/or call default if(player&&point.x<=535&&point.y<=535)//判断是否在有效区域 { tx=x=point.x-24; ty=y=point.y-25; while(tx>=36) tx-=36; { } if(win[0][i]==5)//玩家赢 { } if(win[1][i]==5) { } cwin=true;//电脑赢 break; pwin=true; break; while(ty>=36) ty-=36; tx+=x/36; ty+=y/36; if(tx>18) x=x/36+1; else x=x/36; if(ty>18) y=y/36+1; else y=y/36;//将坐标换算成棋盘上的格子。 if(board[x][y]==2) {

共 48 页 第 42 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 } void CMyChessDlg1::OnPaint() { if (IsIconic())//IsIconic()函数指出此CWnd是否最小化

{ CPaintDC dc(this); // CPaintDC 为设备描述表类 } CDialog::OnLButtonDown(nFlags, point); if(!m_bwfirst) DrawNowWhite(x,y); board[x][y]=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); else DrawNowBlack(x,y); m_pplastpos.x=x;//将当前棋子的信息装入,记录移动棋子的结构中 m_pplastpos.y=y; for(int i=0;i<572;i++) {//修改玩家下子后棋盘状态的变化 } player=false; if(ptable[x][y][i]&&win[0][i]!=7) win[0][i]++; if(ctable[x][y][i]) { } ctable[x][y][i]=false; win[1][i]=7; computer=true; }

共 48 页 第 43 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);//SendMessage()函数向此窗口发送指定的消息 // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect);//GetClientRect(&rect)函数把此CWnd客户区的客户坐标拷贝到rect所指向的结构中 CClientDC dc(this);//CClientDC类负责在构造时调用Windows函数GetDC,在析构时调用ReleaseDC. CDC mdc; mdc.CreateCompatibleDC(&dc);//CreateCompatibleDC()函数创建一个与pDC指定的设备兼容的内存设备 } else { } // Draw the icon dc.DrawIcon(x, y, m_hIcon); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; CDialog::OnPaint();//当Windows或应用程序申请绘制应用程序窗口的某一部分时此函数被调用 描述表 mdc.SelectObject(m_bboard);//SelectObject()函数将一对象选入设备描述表 dc.BitBlt(0,0,600,537,&mdc,0,0,SRCCOPY);//BitBlt()函数将一个位图从源设备描述表拷贝到此当前设备描述表中

//SRCCOPY将源位图拷贝到目标位图上 for(int i=0;i<15;i++) for(int j=0;j<15;j++) { //玩家的棋子 if(board[i][j]==0) { if(m_pplastpos.x==i&&m_pplastpos.y==j) {

if(!m_bwfirst)

共 48 页 第 44 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 if(!m_bwfirst) DrawWhiteChess(i,j); DrawNowWhite(m_pplastpos.x,m_pplastpos.y); else DrawNowBlack(m_pplastpos.x,m_pplastpos.y); } continue; else DrawBlackChess(i,j); } //计算机的棋子 if(board[i][j]==1) { if(m_pclastpos.x==i&&m_pclastpos.y==j) { if(!m_bwfirst) DrawNowBlack(m_pclastpos.x,m_pclastpos.y); else DrawNowWhite(m_pclastpos.x,m_pclastpos.y); } continue; if(!m_bwfirst) DrawBlackChess(i,j); else DrawWhiteChess(i,j); } } } // The system calls this to obtain the cursor to display while the user drags

// the minimized window.

HCURSOR CMyChessDlg1::OnQueryDragIcon()//没有定义类图标的最小化窗口调用此函数 { dc.Draw3dRect(0,0,537,537,RGB(255,255,255),RGB(0,0,0));//画15*15的棋盘

共 48 页 第 45 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 } void CMyChessDlg1::OnSetPerson() { // TODO: Add your command handler code here m_bwfirst=!m_bwfirst; CMenu *pMenu=GetMenu(); CMenu *pSubMenu=pMenu->GetSubMenu (1);//检取(此菜单中)一个弹出式菜单的CMenu对象 (!m_bwfirst)?pSubMenu->CheckMenuItem(ID_SET_PERSON,MF_CHECKED):pSubMenu->CheckMenuItem return (HCURSOR) m_hIcon; (ID_SET_PERSON,MF_UNCHECKED);//CheckMenuItem()函数将检取标志放在此弹出式菜单中菜单项的旁边,或去掉菜单菜单旁边的检取标志 } void CMyChessDlg1::OnSysCommand(UINT nID, LPARAM lParam)//当用户从Control菜单中选择了一项命令时或用户选择了最大或最小化按钮时OnSysCommand()被调用 { } void CMyChessDlg1::OnTimer(UINT nIDEvent)

{

// TODO: Add your message handler code here and/or call default IsWin(); if ((nID & 0xFFF0) == IDD_ABOUTBOX) { } else { } CDialog::OnSysCommand(nID, lParam); //CAboutDlg dlgAbout; //dlgAbout.DoModal();//DoModal()函数激活模式对话框,完成后返回对话框结果 InitializeBoard(); Invalidate(); SetTimer(0,200,NULL);

共 48 页 第 46 页

线

┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 if(pwin) { } else if(cwin) { } else { } CDialog::OnTimer(nIDEvent);//OnTimer():安装定时器时SetTimer成员函数中指定的时间逝去后此函数if(computer) ComTurn(); KillTimer(0);// 返回值0标识消除了该事件 MessageBox("小样,就这点水平还想赢我!!!"); player=false; computer=false; m_binit=true; KillTimer(0);//KillTimer()函数消除原先调用SetTimer()设置的nIDEvent 标识的定时器事件 MessageBox("您真厉害,我们再来,决战到天亮!"); player=false; computer=false; m_binit=true; 被调用 } void CMyChessDlg1::OnUpdateSetPerson(CCmdUI *pCmdUI)//CCmdUI类只用于CCmdTarget派生类的ON_UPDATE_COMMAND_UI 处理函数内 //当菜单被拉下时,框架查找并调用各ON_UPDATE_COMMAND_UI 处理函数 { // TODO: Add your command update UI handler code here // if(player) pCmdUI->SetCheck(true);//调用SetCheck()成员函数将命令的拥护截面设置成恰当的检取状态。这个成员函数用于菜单项和工具条按扭 }

bool CMyChessDlg1::SearchBlank(int &i, int &j, int nowboard[][15])//寻找空白可以下棋处 {

共 48 页 第 47 页

┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 装 ┊ ┊ ┊ ┊ ┊ 订 ┊ ┊ ┊ ┊ ┊ 线 ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ ┊ 安徽工业大学管理科学与工程学院 网络五子棋对战系统 int x,y; for(x=0;x<15;x++) for(y=0;y<15;y++) { } if(nowboard[x][y]==2&&nowboard[x][y]!=3) { } i=x; j=y; return true; return false; } void CMyChessDlg1::OnBnClickedEffect() { } void CMyChessDlg1::OnBnClickedListen() { } // TODO: 在此添加控件通知处理程序代码 // TODO: 在此添加控件通知处理程序代码

共 48 页 第 48 页

更多相关推荐:
五子棋总结t Word 文档

二(1)班五子棋兴趣小组活动总结在这个学期里,我们班开展五子棋兴趣小组活动,提高了学生活动兴趣,增长学生棋艺水平,陶冶学生的性情。现将本小组的活动情况总结如下:一、基本情况参加本学期五子棋兴趣小组活动的同学是二…

五子棋总结

小浣熊五子棋活动总结五子棋可以培养学生的爱国情感推广体育文化知识开发逻辑思维能力提升心理素质通过学习必将对学生拥有自信的人生起到积极的积淀作用五子棋能促进学生的品行智力审美及身心等综合素质的和谐发展五子棋起源于...

五子棋兴趣小组活动总结

五子棋兴趣小组活动总结在这个学期里,我们五子棋兴趣小组的活动提高了学生活动兴趣,增长学生棋艺水平,陶冶学生的性情。现将本小组的活动情况总结如下:一、基本情况参加本学期五子棋兴趣小组活动的同学分别来自四年级一、二…

6、五子棋比赛总结

五子棋比赛总结为了丰富我校课余文化和学生们的课余生活,宣传中华传统文化和棋类文化,促进棋类爱好者之间的交流,提高我系学生的综合素质,我们女生部特此举办了五子棋比赛,于20xx年x月x日圆满落下帷幕。这次比赛经过…

五子棋兴趣小组活动年度总结

五子棋兴趣小组活动半年总结时光如梭,转眼一个学期已结束。这是我校组建五子棋兴趣小组的第一个年头。在这个学期里,我们五子棋兴趣小组的活动提高学生活动兴趣,增长学生棋艺水平,陶冶学生的性情。现将本小组的活动情况总结…

五子棋比赛总结

五子棋比赛总结五子棋在校园和社会比较普及,但却始终得不到推广,因为在大多数人心中,五子棋只是简简单单的五颗棋子连在一起,没有太大的技术和挑战而言。但是五子棋的阵法,技巧性,逻辑性绝不比象棋和围棋要少,甚至,五子…

五子棋棋展活动总结

湖北科技职业学院五子棋棋展活动总结20xx年12月3日湖北科技职业学院子间风云棋牌社举行的学院大型五子棋展示活动顺利结束了本次活动以向全院师生展示五子棋的开局布局为目的传承五子棋文化这次活动吸引了大量师生前来参...

院校五子棋比赛工作总结

院校棋牌协会五子棋比赛工作总结春去春来花谢花开伴随着阳春三月的脚步声新的学年开始了我院校棋牌协会在此期间积极开展了五子棋比赛为同学们的课余生活学习提供了一个展示自我的平台是同学们在此活动中陶冶情操增进友谊同时思...

五子棋游戏开发总结(C语言版)

五子棋游戏开发总结一五子棋游戏概述略二游戏功能对弈游戏自动判断游戏胜负采用人机对话模式界面设计美观友好具体玩法采用任意键开始游戏此处采用键盘值WASD控制棋子移动方向空格键SPACE落子ESC退出游戏三系统开发...

朱世鹏五子棋选修课教学总结

20xx至20xx学年第一学期五子棋选修课教学工作总结时光如梭转眼20xx年至20xx年学年度第一学期已过去了在这个学期里我担任五子棋选修课的教学工作五子棋选修课可以提高学生活动兴趣增长学生棋艺水平陶冶学生的性...

五子棋兴趣小组活动小结

五子棋兴趣小组活动总结五子棋兴趣小组开展有一段时间了我们的这个兴趣小组共有七至八年级的12人参加人数不多这得益于五子棋的简单易学这些人中其中有两名是参加过五子棋比赛并获奖的但更多的是对五子棋一知半解却自信得不得...

五子棋比赛总结

航空与旅游学院五子棋比赛总结航空与旅游学院五子棋比赛游戏规则一裁判安排1总裁判长齐广立2裁判长陈雪浩秦娜3裁判员梅志伟张思悦王亚婷刘婷婷李静张敏金晶玉崔心怡4总协调孟帅魏培森张凤棋5计分统计秘书处二比赛规则1分...

五子棋总结(14篇)