版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、摘 要 五子棋游戏以其优秀的人工智能深受广大玩家的喜爱,而对于初步探究网络编 成的编程爱好者来说,编制五子棋程序因其规则简单而大受欢迎,然而它却要求程 序员对五子棋规则有相当深入的了解。程序员考虑得越周到,其五子棋程序就越智 能。 五子棋游戏软件设计的主要内容是:根据五子棋的基本规则,要让对方客户端 知道该在哪一点下子,就要根据盘面的形势,并把棋盘棋子的重新绘制绘制,也就 是更新该点的位置,然后再通过监听网络传递的消息,直到新的位置放在棋盘的什么 位置上,在进行修改,并通过计算,得出玩家是否获得胜利.,因此玩家就能反复的进 行联机游戏。 本文论述了采用联机对战的方式体现出五子棋程序的分析与设计
2、,并采用面向 对象的开发工具 vc来具体实现。 关键词关键词:五子棋;vc;面向对象 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 prog
3、rammer 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 permi
4、an 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 r
5、epeatedly. 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 目目 录录 1. 引言 .4 1.1 课题背景 .4 1.1.1 背景知识.4 1.1.2 五子棋游戏的规则.4 2. 系统目标 .12 3.
6、 系统需求分析 .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 1.引言 1.1 课题背景 1.1.1 背景知识 五子棋是起源于中国古代的传统黑白棋种之一。现代
7、五子棋日文称之为“连珠”, 英译为“renju”,英文称之为“gobang”或“fir”(five in a row 的缩写),亦有“连五子”、 “五子连”、 “串珠”、 “五目”、 “五目碰”、 “五格”等多种称谓。 五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五 子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”; 它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际 性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念, 亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。 五子棋起源于古代中国
8、,发展于日本,风靡于欧洲。对于它与围棋的关系有两 种说法,一说早于围棋,早在“尧造围棋”之前,民间就已有五子棋游戏;一说源于 围棋,是围棋发展的一个分支。在中国的文化里,倍受人们的青睐。古代的五子棋 的棋具与围棋相同,纵横各十七道。五子棋大约随围棋一起在我国南北朝时先后传 入朝鲜、日本等地。据日本史料文献介绍,中国古代的五子棋是经由高丽(朝鲜), 于 1688 年至 1704 年的日本元禄时代传到日本的。到日本明治 32 年(公元 1899 年), 经过公开征名, “连珠”这一名称才被正式确定下来,取意于“日月如合壁,五星如连 珠”。从此,连珠活动经过了不断的改良,主要是规则的变化(即对执黑棋
9、一方的限 制),例如,1899 年规定,禁止黑白双方走“双三”;1903 年规定,只禁止黑方走“双 三”;1912 年规定,黑方被迫走“双三”亦算输;1916 年规定,黑方不许走“长连”; 1918 年规定,黑方不许走“四、三、三”;1931 年规定,黑方不许走“双四”,并规定 将 1919 的围棋盘改为 1515 的连珠专用棋盘。本世纪初五子棋传入欧洲并迅速风 靡全欧。通过一系列的变化,使五子棋这一简单的游戏复杂化、规范化,而最终成 为今天的职业连珠五子棋,同时也成为一种国际比赛棋。 1.1.2 五子棋游戏的规则 (1)棋盘,棋子: 1、棋盘为十五路,正中一点为“天元”,周围四点为小星。 2
10、、棋子分黑白两色,黑子 113 枚,白子 112 枚,共 225 枚。 (2)比赛规则: 1、黑先白后,从天元开始落子。然后执白棋的一方在黑棋周围的交叉点上落子, 白第二着棋应布在自己河界的一侧。此后,执黑方在以天元为中心的 25 个交叉点的 范围内布盘面的第三着棋。 2、最先在横向,竖向,斜向形成连续的相同色五个棋子的一方为胜。 3、黑棋禁手判负,白棋无禁手。黑棋禁手包括“三三”, “四四”,“长连”。黑方只 能“四三”胜。所谓禁手,是指黑方一子落下同时形成两个或两个以上的活三,冲四 及长连禁手。长连禁手是指黑方形成六个或六个以上的连续棋子。 4、双方均不能形成五连为和棋。 5、对局中拔子,
11、中途退场均判为负。 6、五连与禁手同时形成,先五为胜。因黑方已形成五连,故禁手失效,黑方胜。 7、黑方禁手形成时,白方应立即指出禁手点,黑方即负。若白方继续应子,则 黑方禁手不成立。 8、高段位职业比赛的特殊规定:“三手可交换”:黑下完第手,执白者可提出 交换。即执白方变为执黑方。 “五手两打法”:执黑下第五手时,必须下两手棋,执白 者从这两手棋中任选一步。 本文所论述的联机五子棋系统就是依照这种方式进行的。 1.1.3 开发系统的几点建议 (1)开发系统不必贪大求全,力争简单实用。应从大处着眼,小处着手,循序渐 进,逐步完善。 (2)对开发过程中的各种文档应当注意保存。这是系统开发所要求的必
12、要条件。 (3)尽可能取得对程序设计重视,使用简化的程序代码保证整个系统开发的清晰。 1.2 相关技术介绍 1.2.1 结构化生命周期法简介 结构化生命周期法是一种传统的系统开发方法,其基本思想是把整个系统开发 过程分成若干个阶段,每个阶段进行若干活动,每项活动应用一系列标准、规范、 方法和技术,完成一个或多个任务,形成符合给定规范的产品。 采用结构化生命周期法来开发系统时,应遵循的主要原则: (1)用户参与的原则。 (2)“先逻辑后物理”的原则。 (3)“自顶向下”的原则。 (4)工作成果描述(主要指文档)标准化的原则。 其具体开发步骤可分为以下四步: (1)系统规划。 (2)系统开发。 (
13、3)系统的运行及维护。 (4)系统评价 。 其中系统开发又分为以下四个步骤: (1)系统分析:系统初步调查、系统可行性研究、行系统的详细调查、系统逻辑 方案的提出。 (2)系统设计:系统总体结构设计、系统总体功能设计、系统总体物理结构设计、 系统详细设计、代码设计、输入输出设计。 (3)系统实施:程序设计、系统测试。 1.2.2 开发技术快速原型法简介 快速原型法是 80 年代发展起来的,旨在缩短开发周期,提高开发效率和用户对 系统的满意程度。其基本思想是在系统开发的初期,尽快构造出系统的原型,使用 户能及早地运行这个系统原型,通过使用它、熟悉它,受到启发并取得经验,然后 对系统的目标和功能提
14、出更精确、具体的要求,研制人员据此逐渐修改和完善原型, 使它满足用户的需求,最后完成系统的开发。该方法大大提高了系统开发效率,弥 补了结构化生命周期法来开发的时间长的缺陷。 通常采用原型法需要以下四个阶段: (1)明确用户的基本要求。 (2)研制系统的原型。 (3)使用、评价系统原型。 (4)修改和完善原型。 1.2.3 本系统开发方法的选择 基于以上开发方法的优劣和本系统的实际情况,本系统总体上采用结构化生命 周期法进行系统规则、系统分析和系统设计,但在系统实施阶段采用原型法。在开 发程序的方法上,本系统将采用 visual c+棋联机游戏的软件,用以实现客户端 与服务端管理。 1.2.4
15、visual c+ 1、vc 是什么?学 vc 是学什么? 首先 vc 是一个软件( ide 集成开发环境) (编译、编辑、调试); c 和 c+; windowssdk(软件开发工具) ; vc 的灵魂:mfc(微软基础类库) ; atl(activex 模板类库) ; 其他的 sdk,如 opengl,directx,activemoive,drawdib(wing)。 vc 是许许多多技术的综合,就好像少林 72 般绝技,一般在应用中学会其中 很少一部分就够了。我们的现在目的,其实不过是学一套少林长拳。这套长拳应 包括: (1)养成一种严谨的软件开发习惯,熟悉软件工程的基本原则 。 (2
16、)c 语言基础。 (3)c+最基本内容:类、继承性、封装性、多态性的概念 。 (4)如何用向导建立一个程序框架 。 (6)设计工具条。 (7)设计和使用对话框,熟悉最常用的对话框控件:按钮、静态文本、编辑框 等。 (8)知道怎样新建类、成员函数、成员变量、消息处理函数。 (9)了解最常用的 windows 消息:如 wm_paint(重绘窗口),鼠标按下、弹起 、移动,初始化对话框 等。 (10)了解最简单的 gdi(图形设备接口 ):写文字、画框、画点、画线、画圆 ,设置画笔、画刷。 (11)熟悉最常用的 mfc 类: cwnd cdocument cview cdc cdialog cwi
17、napp cgdiobject 及子类 cstring、cpoint、crect、csize 等简单数据类型 cfile 以上提到的这些内容,是每个人都会用到的内容。 2、mfc 简介 上述主要内容都是与实际操作关系非常密切的,在此不可能讲清楚;而且, 这些在一般的书里都会讲到。我主要将最重要的mfc 介绍一下。 mfc 是对 windowsapi 的封装,大大简化了我们的工作;学 vc 主要就是要学 mfc,大约有 100 多个类,但常用的也就二三十个。应该象背4 级单词一样将这 些常用类搞懂;当然不要死记,要通过看帮助、看例子、动手练习来学会它们; 而且,并非每个类的内部的所有函数都要学会
18、,要日积月累。如果真的想成为高 手,做个笔记本把自己认为重要的类、函数记下来,随时学习,也是很好的突击 方法。 下面介绍最重要的 mfc。 cwnd:窗口,它是大多数 “看得见的东西 ”的父类(windows 里几乎所有看 得见的东西都是一个窗口,大窗口里有许多小窗口),比如视图 cview、框架窗 口 cframewnd、工具条 ctoolbar、对话框 cdialog、按钮 cbutton,etc;一个例 外是菜单(cmenu)不是从窗口派生的。该类很大,一开始也不必学,知道就行 了。 cdocument 文档,负责内存数据与磁盘的交互。最重要的是 onopendocument(读入),o
19、nsavedocument(写盘),serialize(读写) 。 cview 视图,负责内存数据与用户的交互。包括数据的显示、用户操作的响 应(如菜单的选取、鼠标的响应)。最重要的是 ondraw(重画窗口),通常用 cwnd:invalidate()来启动它。另外,它通过消息映射表处理菜单、工具条、快 捷键和其他用户消息。你自己的许多功能都要加在里面,你打交道最多的就是它。 cdc 设备文本。无论是显示器还是打印机,都是画图给用户看。这图就抽象 为 cdc。cdc 与其他 gdi(图形设备接口)一起,完成文字和图形、图像的显示工 作。把 cdc 想象成一张纸,每个窗口都有一个 cdc 相联
20、系,负责画窗口。 cdc 有个常用子类 cclientdc(窗口客户区) ,画图通常通过 cclientdc 完成。 cdialog 对话框 cwinapp 应用程序类。似于 c 中的 main 函数,是程序执行的入口和管理者, 负责程序建立、消灭,主窗口和文档模板的建立。最常用函数 initinstance():初始化。 cgdiobject 及子类,用于向设备文本画图。它们都需要在使用前选进dc。 cpen 笔,画线; cbrush 刷子,填充; cfont 字体,控制文字输出的字体 ; cbitmap 位图; cpalette 调色板; crgn 区域,指定一块区域可以用于做特殊处理 ;
21、 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
22、(数据访问对象)范例。树型和列视控件 ; ncubeopengl 范例,画一个不断旋转的方块 ; nhiersvrole 服务器; noclientole 包容器; ndrawcli 鼠标绘图。也包括 ole; nwordpad 写字板。 4、几点经验 (1)为什么要用 windows 而不是 dos 编程。 windows 编程并不比 dos 编程难很多,只是在刚刚接触的时候感到头绪繁多, 不知从何下手。实际上,如果你会 c 语言,你会发现 windows 编程的难度并不 比当年学 c 语言时大。dos 编程要想成为高手,也需要学习几百个函数(无论是 tc、bc、microsoftc) ,并
23、要深入了解汇编语言级的 dos 功能调用。而现在在 windows 下,付出相同的工作量,你却可以获得几倍的收益。如果你以前熟悉 dos 编程,现在再搞 windows 编程,只要两个星期肯定会感到巨大的优越性:在 dos 下,每一件事都要自己干,而且还有 64k 内存、显示精度等的限制,实在是 事倍功半了。 (2)为什么要用 vc 而不是其他 windows 编程语言。 n 大多数大型软件(包括 windows 自己)都是用 c、c+编的,所以可以利 用的源代码特别多。例如 photoshop,就有 vc 的编程接口。的其他的语言都不 如 vc 有历史优势。而且 vc 的开发工具特别多,从控
24、件公司到硬件开发商,其产 品很少敢不提供 vc 接口的。 nvc 适合组织大工程( vb 就不行) 。 nborlandc+或 c+builder 也很不错,并不比 vc 差。但 bc 的版本兼容性 不好,从 3.1 到 4.0 就出现“代沟” ,而且 vc 提供了极为丰富的文档和范例 ,vc 的参考资料也远比 bc 多。并且 vc 与其他的 visualstudio 成员可以协调工作, 对软件工程有利。 (3)开始不要学 winapi 编程,但以后最好学学 winapi。 特别要注意,开始不要买讲 windowssdk 编程的书。一个臭名昭著的例子就 是“helloworld” 。各种计算机
25、语言在入门课中往往都给出一个例子,显示一行 文字“helloworld” ,无论是在 basic、c、pascal,甚至汇编中,这个最简单的 小程序都几行就可以写完。但在早期的 windows 编程中,刚才讲到的 “hellowin”这个有名的例子就要组织一个工程、写上几百行代码才能实现。这 就吓跑了很多想学 windows 编程的人。实际上,在 windows 下显示 “helloworld”,最简单的方法只要 5 行就够了: #include“windows.h” voidwinmain() messagebox(null,”helloworld!”,”myfirstwindowsappl
26、ication”,mb_ok); 当然这个程序只建立了一个最简单的对话框,但这已经够了。 如果你没有 sdk 编程的经验,学 vc 就是要利用 mfc 绕过 windows 编程的许 多细节。有好的工具为什么不用呢?现在你在vc 写一个”helloworld” ,只要 写一行代码就可以了。 voidcyourview:ondraw(cdc*pdc) /.其他的代码 pdc-textout(100,100,”helloworld!”); 但 mfc 不是万能的, winapi 和 vc 中有很多功能在 mfc 中并不能反映出来。 在入门后,要想发挥 vc 的完全能力, windowsapi 还是
27、非常重要的。而且,这些 api 在其他 windows 语言中也用得到。 学语言,与练武道理也差不多。 vc、vb、delphi、vfp,以及其他的 windows 编程语言,都属于同一个门派: windows 门,虽然招式不同,但内功都 是一样的,这就是 windowsapi(应用编程接口 ),大概是两千个函数。任何武功, 招式即使再复杂,通常也能在很短时间内记下来;但内功就不是一朝一夕的事。 而且,各门派的内功不同, unix、linux 门有 uinx 的内功,apple(苹果)门有 mac 的内功,java 更是自成一派。我们这里说的学 vc,只是学招式,学招式一 个月差不多就够了,聪
28、明的两个星期就可以掌握。光学招式,吓唬人是够了,但 和高手一过招,非出丑不可。要想精通 vc,必须熟悉 windowsapi。 (4)高级语言与自然语言 一门高级语言与一门自然语言是类似的。关键要素有三: 语法:了解 c 和 c+基本语法,这是比较容易的。 修辞:编程的艺术和风格。通常,这是与软件工程联系起来的。算法上的小 伎俩并非是关键的。严谨,严格按照规范去做,同时又能发挥出极大的创造性, 才是语言学家的本色。 词汇:如何利用别人的工作?如何利用自己以前的工作?这是一个软件工程 师成功的关键。如果词汇量不丰富,就写不出好文章,就会有想法表达不出。一 个人的语法在上小学之前就基本上学成了,修
29、辞水平也在年轻时就确定了,惟有 词汇量需要根据需要不断学习、不断扩充。 vc 编程中,拥有大的词汇量就意味 着要掌握较多的类、函数和其他编程组件。如: windowssdk,mfc,以及你所专攻 的领域的现成的 sdk,比如 3d 编程中的 opengl,多媒体编程中的 directx,图 像处理中的 victor 库。另外,activex 控件的掌握往往也是成败的关键。我们 这几年的工作也总结成了一个类库,叫 ipx(图像处理框架) ,大大简化了图像 处理的工作;不过现在还有很多细节问题要解决,如果有同学感兴趣可以参与这 方面的工作。 学习 vc,千万不要用我们在学校里学英语的方法,而要用小
30、孩学说话的方法。 所谓学英语的方法,就是我们在本科时学c 语言的那种模式:详细搞懂每一个细 节,背大量的规则,很少上机实践,没有实际问题供解决,最后由考试来断定学 习成果。这种模式的后果大家都清楚:我们学了十几年英语,可有不少人还只会 四五千个单词,写百把字的文章,不会说,不能听;尤其要命的是,看不懂vc 的帮助文档。我们要象婴儿一样,在使用中学会语法、修辞和词汇;一开始肯定 只能编出最糟糕的,就好像小孩开始只会说: “爸爸坐车车” ;但“爸爸” “车 车”这些词对小孩是最需要的,学习的效率反而最高。学vc 的时候,应从我的 需要出发,先做一个最简单的东西,然后一点一点复杂起来,象滚雪球一样。
31、 学习 vc 尤其要和别人交流,你苦苦思考不明白的,也许别人早就解决了。一定 要善于学习:从书店找出有用的书;向身边的高手学习;寻找可以利用的源代码、 类库、组件、控件、库;如果能上互连网,那就更加能解决问题了。 2.系统目标 五子棋联机游戏系统主要致力于为提供联机双方进行联机游戏联络,以及提供 准确可靠用户操作动作的信息。具体目标如下: 1. 选择连接到服务器的客户端进行记录; 2. 记录客户机的键盘动作; 3. 分析是否已经取得胜利。 3.系统需求分析 3.1 系统需求 (1)满足记录客户机的游戏动作的基本要求。 (2)满足连接数据到客户端的基本要求。 (3)满足服务器实时获得客户端游戏状
32、态的基本要求。 (4)在服务器端分析双方是否胜利。 3.2 功能需求 基于系统需求分析,该系统需要实现以下基本功能: (1)动作记录:当客户端程序启动的时候,程序自动加载键盘钩子,对客户端 的网络的连接和操作进行记录,并提示给游戏双方。 (2)对连接到客户端数据的基本要求:能够将要发送的聊天记录发送至对方手 上,能够完成数据的连接。 。 (3)实时显示:当从游戏一方将数据传入另一方系统中,将五子棋的表格进行 重新的刷新,和更改。 (4)通过控制鼠标点击五子棋表格:进入控制模式,加载鼠标钩子,截取鼠标 的按件动作,并把该动作发送到游戏另一方,并判断是否胜利。 3.3 系统运行环境 系统运行环境:
33、windows 2000 及其以上。 3.4 mfc 简述 mfc(microsoft foundation class)指的是 microsoft 基础类,是用来为 windows 开发 c+gui 应用程序。mfc 是一种十分优秀的工具,使得面向对象的软 件函数包装技术演变成为一种可以进行代码复用、简化了程序的复杂性并使程序更 加有效的软件开发环境.对于使用 windows api 进行应用程序开发的人员来说, mfc 使程序员大大提高了程序开发效率.你不必创建 gdu 对象,不必编写许多代码行 对这些对象进行初始化,并且小心地跟踪其生命周期的运行情况,你只需建立一个 mfc 类的实例,使
34、用其默认值,然后让撤消程序来清除系统资源即可。 3.5 服务器与客户端 socket 设计 本程序都采用 tcpsock 的 dll 模型,该模型允许应用程序以 windows 消息的形 式接收网络事件通知。这个模型是为了适应 windows 的消息驱动环境而设置的,用 于对性能要求不高的网络应用程序,最大可连接 64 个客户端。使用该模型基本满足 本程序要求。 协议设计: (1) move 鼠标移动; (2) leftdown 鼠标左件按下; (3)leftup 鼠标左件弹起; (4) rightdown 鼠标右件按下; (5) rightup 鼠标右件弹起; (6) send 发送数据;
35、(7) stop 停止发送; (8)quick 实时发送。 4.系统设计 4.1 概要设计 本次毕业设计的内容就是设计出联机五子棋系统,在此基础上实现系统模型各 个子系统的基本功能。此系统用建立一个 tcpsock 的 dll 文件来进行联机的游戏的 网络数据。主要是运用了 strlisten 类进行联机数据的传输 在系统功能需求分析的基础上,结合 visual c+程序编制的特点,得到下图所 示的系统功能模块图。 服务器端服务器端 监听连接 发送棋子命令 接受棋子消息 截取鼠标动作 实时更新棋盘 图 4-1 五子棋服务端模块 客户端客户端 连接远程服务器 发送棋子消息 接受棋子消息 截取鼠标
36、动作 实时更新棋盘 图 4-2 五子棋客户端主模块 4.2 流程图 下面用我们用数据流图(dfd, data flow diagram) ,也就是从数据传递和加工 的角度,以图形的方式刻画数据流从输入到输出的移动变换过程。如下图所示: 连接服务器直接 到服务器接受连 接请求 开始 用户选择角色 判断角色类型 在服务端口监 听直到有连接 的请求 接受连接请求 初始化棋盘数据信息 等待轮到自己下棋 等待用户点击棋盘区域 将点击位置转化为棋盘位置 将坐标数据发送给对方机子 判断双方有无获胜 显示获胜信息 有一方获胜 无 获 胜 方 客户机服务器 图 4-3 功能流程图 本图只是画出了系统得一部分的功
37、能流程图,因为本程序是一个 windows 程序, 由较多的功能,主要是基于消息驱动的,所以有一些功能不能有流程图表达出来, 如,消息的传递,当系统接到客户端传递来的信息后,就调用一个函数,将随机的 产生出一些信息。提示在提示框内。让下棋一方了解到,现在该我下子了。 当然传递对方下棋的棋子位置等数据的接受处理也是基于消息的,当有传递数 据到达的时候,系统会触发一个消息,程序调用函数读取数据并进行相应的处理。 如果是对方棋子位置的信息,则在屏幕上找到对应期盼坐标画出对方棋子,同时判 断对方是否获胜。 4.3 详细设计 4.3.1 钩子的使用 本程序使用了多个钩子,他们分别是鼠标钩子,客户段使用的
38、是键盘钩子,拦 截 wh_keyboard 消息,服务器使用的鼠标钩子,当服务器要获得客户端操作的 时候,鼠标钩子将用户的鼠标信息以消息的形式发送到服务器端,服务器再通过 socket 发送到客户端进行控制操作。 因此我们必须首先了解钩子的使用函数: hhook setwindowshookex( int idhook, hook_proc lpfn, hinstance hmod,dword dwthreadid); 参数说明: idhook :钩子的类型 lpfn :钩子处理函数地址 hmod :包含钩子函数的模块句柄 dwthreadid :钩子的线程 函数说明:函数将在系统中挂上一个由
39、 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 :钩子
40、的类型 lpfn :钩子处理函数地址 hmod :包含钩子函数的模块句柄 dwthreadid :钩子的线程 函数说明:函数将在系统中挂上一个由 idhook 指定类型的钩子,监控并处理相 应的特定消息。 bool unhookwindowshookex( hhook hhk ); 函数说明:函数将撤销由 hhk 指定的钩子。 lresult callnexthookex( hhook hhk, int ncode, wparam wparam,lparam lparam ); 函数说明:函数将消息向下传递,下一个钩子处理将截获这一消息。 4.4 程序设计 4.4.1 程序窗口的设计 由于此应
41、用程序采用的是基于对话框的开发,系统应用程序的各个不同功能是 通过选择主对话框窗口中的不同按钮来完成的,每个功能模块由一个或多个对话框 实现。该应用程序的主对话框(即运行应用程序后出现的对话框)如图所示: 图 4-4 主对话框 本文系统得棋盘是由本文设定的画笔进行绘画而成的。布尔值对数据进行更新 和计算,将棋盘和棋子很好的合并在一起。这样整个五子棋的程序将很轻易的展现 在人们的面前。 建立好后,就可以输入代码: void cmychessdlg1:drawnowblack(int x, int y) /画当前的黑子 cclientdc dc(this); cdc mdc; mdc.create
42、compatibledc( mdc.selectobject(m_bblack); dc.bitblt(24+x*36-x-18,25+y*36-y-18,33,33, mdc.selectobject(m_blastblackchess); dc.bitblt(24+x*36-x-18,25+y*36-y-18,33,33, void cmychessdlg1:drawnowwhite(int x, int y) /画当前的白子. cclientdc dc(this);/cclientdc类负责在构造时调用windows函数getdc,在析构时调用releasedc cdc mdc; mdc
43、.createcompatibledc(/createcompatibledc()函数创建一个与/selectobject()将一个对象引入设备描述表 dc.bitblt(24+x*36-x-18,25+y*36-y-18,33,33,/mergepaint 用布尔or操作符将 反相的源位图与目标位图结合起来 mdc.selectobject(m_blastwhitechess); dc.bitblt(24+x*36-x-18,25+y*36-y-18,33,33,/srcand用布尔and操作符将目标位图 象素与源位图象素结合起来 void cmychessdlg1:getboard(int
44、 tempboard15, int nowboard15)/获取当前棋盘状态 int i,j; for(i=0;i15;i+) for(j=0;j15;j+) if(i=9) i=9; 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)/计算机先 playe
45、r=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+) for(j=0;j11;j+) for(k=
46、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+) ptable
47、j-ki+kcount=true; ctablej-ki+kcount=true; count+; 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 while(ty=36) ty-=36; tx+=x/36; ty+=y/36; if(tx18) x=x/36+1; else x=x/36; if(ty18) y=y/36+1; else y=y/36
48、;/将坐标换算成棋盘上的格子。 if(boardxy=2) boardxy=0;/设为玩家的棋子 if(m_pplastpos.x!=-1 else drawblackchess(m_pplastpos.x,m_pplastpos.y); if(!m_bwfirst) drawnowwhite(x,y); else drawnowblack(x,y); m_pplastpos.x=x;/将当前棋子的信息装入,记录移动棋子的结构中 m_pplastpos.y=y; for(int i=0;i572;i+) /修改玩家下子后棋盘状态的变化 if(ptablexyi if(ctablexyi) ct
49、ablexyi=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
50、in client rectangle int cxicon = getsystemmetrics(sm_cxicon); int cyicon = getsystemmetrics(sm_cyicon); crect rect; getclientrect(/getclientrect( int y = (rect.height() - cyicon + 1) / 2; / draw the icon dc.drawicon(x, y, m_hicon); else cdialog:onpaint();/当windows或应用程序申请绘制应用程序窗口的某一部分时此函数被调用 cclientd
51、c dc(this);/cclientdc类负责在构造时调用windows函数getdc,在析构时调用releasedc. cdc mdc; mdc.createcompatibledc(/createcompatibledc()函数创建一个与pdc指定的设备兼容的内存设备 描述表 mdc.selectobject(m_bboard);/selectobject()函数将一对象选入设备描述表 dc.bitblt(0,0,600,537,/bitblt()函数将一个位图从源设备描述表拷贝到此当前设 备描述表中 /srccopy将源位图拷贝到目标位图上 for(int i=0;i15;i+) fo
52、r(int j=0;j 1000 #pragma once #endif / _msc_ver 1000 / mychessdlg.h : header file / / / cmychessdlg dialog class cmychessdlg1 : public cdialog / construction public: bool searchblank(int void iswin(); void initializeboard(); int givescore(int type, int x, int y); void getboard(int tempboard15, int n
53、owboard15); 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_bbo
54、ard; 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 con
55、structor / 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 /a
56、fx_virtual / 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); / generated message map
57、 functions /afx_msg(cmychessdlg) afx_msg void ongamestart(); /afx_msg declare_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 immediatel
58、y 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_file
59、 static char this_file = _file_; #endif / / cmychessdlg dialog cmychessdlg1:cmychessdlg1(cwnd* pparent /*=null*/)/gjl : cdialog(cmychessdlg1:idd, pparent) /afx_data_init(cmychessdlg) / note: the classwizard will add member initialization here /afx_data_init m_hicon = afxgetapp()-loadicon(idr_mainfra
60、me);/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_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 文员个人总结简短500字
- 指定监护人决定书(5篇)
- 科技读书节开幕词(3篇)
- 灭火应急预案大全15篇
- 建筑项目施工合同范本(34篇)
- 北京市海淀区2024−2025学年高二上学期阶段性针对训练(10月) 数学试卷含答案
- 风险整改报告5篇
- DB11T 1500-2017 自然保护区建设和管理规范
- 2023年冷弯型钢资金需求报告
- 2023年建材级纤维素醚资金申请报告
- 中华人民共和国建筑法(2019年版)知识培训
- 12 光的传播 (教学设计)-2023-2024学年五年级上册科学人教鄂教版
- 水电站生态风险评估与预警
- 3.9 秦统一中国 课件 2024~2025学年统编版七年级历史上册
- 广东省2024年中考历史真题试卷【附真题答案】
- 个人胜任项目经理岗位的认识
- 2024至2030年中国大型铸锻件行业市场深度研究及投资规划建议报告
- DB11-T 2291-2024 建设工程电子文件与电子档案管理规程
- 07J901-1实验室建筑设备(一)
- 异地就医备案的个人承诺书
- 《出口退税培训》课件
评论
0/150
提交评论