毕业设计(论文)网络五子棋游戏设计_第1页
毕业设计(论文)网络五子棋游戏设计_第2页
毕业设计(论文)网络五子棋游戏设计_第3页
毕业设计(论文)网络五子棋游戏设计_第4页
毕业设计(论文)网络五子棋游戏设计_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目 录 摘要.1 前言.1 1 程序概况.3 1.1 功能 .3 1.2 开发环境和运行环境.4 2 实现技术.4 2.1 通信技术.4 2.2 软件界面设计.7 2.3 mfc.8 3.可行性分析和需求分析.9 3.1 可行性分析 .9 3.2 需求分析 .10 4 五子棋的设计.11 4.1 系统设计思想.11 4.2 系统总体设计.11 4.3 工作流程.12 4.4 流程图 .13 4.5 通信协议.14 5.客户端的实现.15 5.1 主要的成员变量.15 5.2 主要类的功能以及成员函数介绍.16 6.服务器的实现.19 6.1 主要的成员变量.19 6.2 重要数据结构.20 6

2、.3 主要类的功能以及成员函数介绍.21 7 主要算法.22 7.1 判断胜负.22 7.2 人机对弈算法.23 致 谢.29 参考文献.30 网络五子棋网络五子棋 学生: 指导教师: (三峡大学 计算机与信息学院) 摘要摘要:目前,以计算机技术和网络技术为核心的现代网络技术已在现实生活和 生产中得以广泛的使用,休闲类网络游戏集趣味性,娱乐性,互动性和益智性 于一体,已经成为多数人群的休闲方式。本程序是 vc 平台下的一个小程序,使 用 c+语言,基于 mfc 类库,所有的类均继承于 mfc 类库,通过对 socket 技术 理解,实现在局域网内客户端和服务器之间的连接,通信,以及处理信息字段

3、 来获取具体的信息类型和和内容,以实现程序的聊天内容,图形加载,主机连 接,以及五子棋核心进程之间的通信。 关键词:关键词:mfc,socket,客户端,服务器 abstract:at present, in computer technology, and network technology at the core of modern network technology has been in real life and production have been widely used, the type of network set of amusement game, recreat

4、ional, interactive and intelligence in one, has become the most of people relaxed manner.this program is a small program at the vc platform of a small program,useing the c+ language, based on a mfc class library,all in succession to the class library mfc, socket and technical understanding and achie

5、ve in the lan the client and server connections between communication and information field to obtain specific types of information and implement the program content, chatter, graphics, the host, and the core of communication between process keywords: mfc,socket,client,server 前言前言 伴随着计算机技术和网络技术的发展,1

6、997 年,世界第一款图形化网络游 戏网络创世纪问世。挟计算机与网络技术之高精尖,融传统视听与数码娱 乐之精华,集娱乐性、竞技性、仿真性、互动性于一体, 网络创世纪迅速风 靡全球,备受青睐。 自此拉开了网络游戏的序幕。之后随着现代信息技术的迅 猛发展,网络技术在教育中的应用日益广泛和深入,特别是 internet 与校园网 的接轨,为给广大爱好者提供一个方便的学习与交流平台,开展网络五子棋游 戏的设计和实现与实践研究有着十分重要的意义。 五子棋是起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为 “连珠” ,英译为“renju” ,英文称之为“gobang”或“fir” (five in

7、a row 的缩写) ,亦有“连五子” 、 “五子连” 、 “串珠” 、 “五目” 、 “五目碰” 、 “五格”等 多种称谓。大约在南北朝时期随围棋一起先后传入朝鲜、日本等地。据日本史 料记载,五子棋先由中国传到高丽(朝鲜) ,再由高丽传到日本。当时主要在皇 宫和贵族大家庭中流行。到元禄末期,在日本京都,这一当时被称作“五目碰” 、 “五格”的棋戏在民间开始盛行起来,无论武士、僧侣、农夫等都能参与这一 活动。到日本明治 32 年(公元 1899 年) ,经过公开征名, “连珠”这一名称才 被正式确定下来。目前,连珠五子棋这一棋类运动已迅速在国际上发展起来。 五子棋不像网络上有的游戏只是一味的机

8、械的消磨时间,它是必须动用脑 力的游戏,所以五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助 于修身养性。五子棋既有现代休闲的明显特征 “ 短、平、快 ” ,容易上手, 老少皆宜,而且趣味横生,引人入胜,同时又有古典哲学的高深学问 “ 阴阳 易理 ” ;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧 和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观; 既有 “ 场 ” 的概念,亦有 “ 点 ” 的连接。它是中西文化的交流点,是 古今哲理的结晶。 目前,连珠五子棋这一棋类运动已迅速在国际上发展起来。现在,有 40 多 个国家和地区己开展了五子棋活动。许多国家

9、的人对五子棋都有不同的爱称, 例如韩国人把五子棋称为“情侣棋” ,言下之意是说情人之间下五子棋有利于增 加情感的交流;欧洲人称之为“绅士棋” ,喻棋手下五子棋的君子风度胜似绅士:美 洲人称之为“商业棋” ,意思可能是边下五子棋边谈生意,是商业贸易之桥;日 本人则称之为“中老年棋” ,表示五子棋适合成熟的中老年的生理特点和思维方 式。不同语言、地区的人们都可以借助五子棋这一简单而又深奥的棋艺进行交 流、比赛,以增进友谊。 1998 年 8 月 8 日,国际连珠联盟(rif)由日本、俄罗斯、瑞典、亚美尼 亚、阿塞拜疆、爱沙尼亚、法国、拉脱维亚、白俄罗斯九个成员国在瑞典宣告 成立。以后有澳大利亚、保

10、加利亚、加拿大、克罗地区、丹麦、芬兰、以色列、 意大利等国家以及我国台湾地区相继与之联系。第一届五子棋(连珠)世界锦 标赛于 1989 年 8 月 2 日至 6 日,在日本京都举行,日本夺得冠军,此后五子棋 的世界锦标赛每两年举办一次。其申办竞争也十分激烈。日本目前拥有自己的 五子棋职业棋手,并且对连珠技术的研究也相当昔遍和全面。就水平而言,目 前日本最强,研究也最深,欧洲人则紧迫其后。 我国是从 20 世纪 90 年代引进五子棋世界流行规则的,此后的十多年的时 间里,五子棋在民间迅速普及。北京是五子棋发展最早也最普及的地区,1992 年就成立了我国第一个五子棋民间组织京都五子棋社。在北京的带

11、动下, 其他地区也先后成立了五子棋组织,从此积极的投身于这项益智的游戏中, 2004 年成立中国围棋协会五子棋分会,它属于中国五子棋界的领导机构,并且 先后在部分地区组织俱乐部,组织比赛,让越来越多的人参与和喜爱这项活动, 但是中国还是没有专业的棋手,在这方面的相关规则和体系还不完善,能够真 正弄懂的人还是很少,所以中国在五子棋这方面的发展空间还是很大的,这就 需要我们不断的努力探索和研究才能把五子棋发展的更加壮大。那么现在通过 网络五子棋游戏的产生也让更多的人收益,人们不仅可以和电脑下棋,还可以 和异地的陌生人下棋,更可以在下棋的时候和对方交流心得,这就是我此次设 计的主题,那么在未来的五子

12、棋的发展来看,也许比赛的规则会有所改变,棋 局会变的更复杂而且所需的技巧也会越来越多,这就需要所有人的努力才会实 现了。 1 1 程序概况程序概况 1.11.1 功能功能 为了迎合广大五子棋爱好者的需求和交流,设计出一款基于网络版的五子 棋游戏,玩家可以通过网络挑选自己喜爱的对手并同其进行比赛,比赛过程中 可以进行聊天,达到相互交流经验的作用,使其不仅能够进行比赛,同时也能 达到交友的功能。 .1 寻找服务器寻找服务器 程序自带主机 ip 搜索器,可以通过设置 ip 网段来搜索该网段的服务器, 并且得到该服务器的基本情况信息。 .2 连接服务器连接服务器 连接服

13、务器之前先获取服务器的基本信息,以及服务器的当前连接情况, 当服务器的连接数大于可以游戏人数则会拒绝连接,否者可以连接。 .3 头像以及用户名头像以及用户名 在登录游戏的时候会要求玩家填写用户名以及选择头像这些基本信息,在 游戏中可以显示用户名和头像来区分,本游戏自带上 10 个头像,不同形象,不 同性格。 .4 聊天聊天 在游戏时候讨论下游戏心得这个是所有游戏玩家最愿意做的事,玩家可以 在右下角填写聊天内容发送给对方,对方也可以在显示头像的下方看到聊天信 息。 .5 投降投降 当玩家知道自己无力回天的时候可以点击投降按钮,就可以提前结束游戏,

14、不必为了一个死局纠缠,大丈夫能屈能伸,大不了再重新来一盘,谁怕谁啊! .6 开始游戏开始游戏 连接上了服务器不是马上就开始游戏,要等游戏双方都点下来开始,愿意 开始游戏,这盘游戏才正真开始。 1.21.2 开发环境和运行环境开发环境和运行环境 .1 开发环境开发环境 intel core 2 duo 1.8ghz 1g内存 160硬盘 microsoft windowsxp professional microsoft visual sutdiao 2008 .2 运行环境运行环境 intelpentium 2及以上处理器,32m以上内存,4g以

15、上硬盘 microsoft windows 9x/nt/xp操作系统 800*600或以上的屏幕分辨率 2 2 实现技术实现技术 2.12.1 通信技术通信技术 通信:人与人或人与自然之间通过某种行为或媒介进行的信息交流与传 递,从广义上指需要信息的双方或多 方在不违背各自意愿的情况下无论采 用何种方法,使用何种媒质,将信息从某方准确安全传送到另方。 2 2. .1 1. .1 1 c c/ /s s模模式式 一个在建立分布式应用时最常用的范例便是客户机 /服务器模型。在这 种方案中客户应用程序向服务器程序请求服务。这种方式隐含了在建立客户 机/服务器间通讯时的非对称性。客户机 /服务器模型工

16、作时要求有一套为 客户机和服务器所共识的惯例来保证服务能够被提供(或被接受) 。这一套 惯例包含了一套协议。它必须在通讯的两头都被实现。根据不同的实际情况, 协议可能是对称的或是非对称的。在对称的协议中,每一方都有可能扮演主 从角色;在非对称协议中,一方被不可改变地认为是主机,而另一方则是从 机。一个对称协议的例子是 internet中用于终端仿真的 telnet。而非对称 协议的例子是 internet中的ftp。无论具体的协议是对称的或是非对称的, 当服务被提供时必然存在 客户进程和服务进程。一个服务程序通常在 一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠 状态,直到

17、一个客户对这个服务的地址提出了连接请求。在这个时刻,服务 程序被惊醒并且为客户提供服务对客户的请求作出适当的反应。这一请 求/相应的过程可以简单的用图表示。虽然基于连接的服务是设计客户机/ 服务器应用程序时的标准,但有些服务也是可以通过数据报套接口提供的 2 2. .1 1. .2 2 w wi in ns so oc ck k 通信的基础是套接口( socket) ,一个套接口是通讯的一端。在这一端 上你可以找到与其对应的一个名字。一个正在被使用的套接口都有它的类型 和与其相关的进程。套接口存在于通讯域中。通讯域是为了处理一般的线程 通过套接口通讯而引进的一种抽象概念。套接口通常和同一个域中

18、的套接口 交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序) 。windows sockets规范支持单一的通讯域,即 internet域。各种进程使用 这个域互相之间用 internet协议族来进行通讯( windows sockets 1.1以上 的版本支持其他的域,例如 windows sockets 2) 。套接口可以根据通讯性 质分类;这种性质对于用户是可见的。应用程序一般仅在同一类的套接口间 通讯。不过只要底层的通讯协议允许,不同类型的套接口间也照样可以通讯。 用户目前可以使用两种套接口,即流套接口和数据报套接口。流套接口提供 了双向的,有序的,无重复并且无记录边

19、界的数据流服务。数据报套接口支 持双向的数据流,但并不保证是可靠,有序,无重复的。也就是说,一个从 数据报套接口接收信息的进程有可能发现信息重复了,或者和发出时的顺序 不同。数据报套接口的一个重要特点是它保留了记录边界。对于这一特点, 数据报套接口采用了与现在许多包交换网络(例如以太网)非常类似的模型。 2 2. .1 1. .3 3 广广播播数数据据包包 数据报套接口可以用来向许多系统支持的网络发送广播数据包。要实现 这种功能,网络本身必须支持广播功能,因为系统软件并不提供对广播功能 的任何模拟。广播信息将会给网络造成极重的负担,因为它们要求网络上的 每台主机都为它们服务,所以发送广播数据包

20、的能力被限制于那些用显式标 记了允许广播的套接口中。广播通常是为了如下两个原因而使用的:1. 一个应用程序希望在本地网络中找到一个资源,而应用程序对该资源的地址 又没有任何先验的知识。 2. 一些重要的功能,例如路由要求把它们的信息 发送给所有可以找到的邻机。被广播信息的目的地址取决于这一信息将在何 种网络上广播。 internet域中支持一个速记地址用于广播 inaddr_broadcast。由于使用广播以前必须捆绑一个数据报套接口,所以 所有收到的广播消息都带有发送者的地址和端口。 2 2. .1 1. .4 4 w wi in ns so oc ck k a ap pi i主主要要函函数

21、数介介绍绍 accept():接受某一socket的连接要求,以完成 stream socket 的连接。 格 式: socket pascal far accept( scoket s,struct sockaddr far *addr,int far *addrlen ); bind():指定 socket 的 local 位址 (address)。 格 式: int pascal far bind( socket s,const struct sockaddr far *name,int namelen ); recv():自 socket 接收资料。 格式: int pascal fa

22、r recv( socket s,char far *buf,int len,int flags ); recvfrom():读取一个 datagram,并储存资料来源的位址。 格 式: int pascal far recvfrom( socket s,char far *buf,int len,int flags,struct socketaddr far *from,int far *fromlen ); send():使用连接式的 socket 传送资料。 格式: int pascal far send( socket s,const char far *buf,int len,int

23、 flags ); sendto():将资料送到指定的目的地。 格式: int pascal far sendto( socket s,const char far *buf,int len,int flags,const struct sockaddr far *to,int tolen ); socket():建立socket。 格式: socket pascal far socket( int af,int type,int protocol ); closesocket():关闭某一socket。 connect():要求连接某一 socket到指定的对方。 格 式: int pasc

24、al far connect( socket s,const struct sockaddr far *name,int namelen ); getsockopt():要求某一 socket 目前状态设定的资料。 格式: int pascal far getsockopt( socket s,int level,int optname,char far *optval,int far *optlen ) listen():设定 socket 为监听状态,准备被连接。 格 式: int pascal far listen( socket s, int backlog ); 2 2. .1 1.

25、 .5 5 c ca as sy yn nc cs so oc ck ke et t 看类名就知道,它是一个异步非阻塞socket 封装 casyncsocket:create()有一个参数指明了你想要处理哪些socket 事件, 你关心的事件被指定以后,这个 socket 默认就被用作了异步方式。 casyncsocket的create()函数,除了创建了一个 socket以外,还创建 了个csocketwnd窗口对象,并使用 wsaasyncselect()将这个socket与该窗 口对象关联,以让该窗口对象处理来自 socket的事件(消息),然而 csocketwnd收到socket事

26、件之后,只是简单地回调 casyncsocket:onreceive(),casyncsocket:onsend(), casyncsocket:onaccept(),casyncsocket:onconnect()等虚函数。所以 casyncsocket的派生类,只需要在这些虚函数里添加发送和接收的代码。 2 2. .2 2 软软件件界界面面设设计计 ui(user interface)即用户界面,也称人机界面。是指用户和某些系统 进行交互方法的集合,这些系统不单单指电脑程序,还包括某种特定的机器, 设备,复杂的工具等。 软件设计可分为两个部分:编码设计与ui 设计。编码设计大家都很熟 悉,

27、但是 ui 设计还是一个很陌生的词,即使一些专门从事网站与多媒体设 计的人也不完全理解 ui 的意思。ui 的本意是用户界面,是英文 user 和 interface 的缩写。从字面上看是用户与界面2 个组成部分,但实际上还包 括用户与界面之间的交互关系。 界面设计。在漫长的软件发展中,界面设计工作一直没有被重视起来。 做界面设计的人也被贬义的称为 “美工” 。其实软件界面设计就像工业产品 中的工业造型设计一样,是产品的重要买点。一个友好美观的界面会给人带 来舒适的视觉享受,拉近人与电脑的距离,为商家创造卖点。界面设计不是 单纯的美术绘画,他需要定位使用者、使用环境、使用方式并且为最终用户 而

28、设计,是纯粹的科学性的艺术设计。检验一个界面的标准即不是某个项目 开发组领导的意见也不是项目成员投票的结果,而是最终用户的感受。所以 界面设计要和用户研究紧密结合,是一个不断为最终用户设计满意视觉效果 的过程。 user interface 也可以称之为用户接口或使用者接口,是系统和用户之 间进行交互和信息交换的媒介,它实现信息的内部形式与人类可以接受形式 之间的转换。 用户接口是介于使用者与硬件而设计彼此之间互动沟通相关软件,目的 在使得使用者能够方便有效率地去操作硬件以达成双向之互动,完成所希望 借助硬件完成之工作,用户接口定义广泛,包含了人机交互与图形使用者接 口,凡参与人类与机械的信息

29、交流的领域都存在着用户接口。 2 2. .3 3 m mf fc c mfc,微软基础类(microsoft foundation classes),实际上是微软提供 的,用于在 c+环境下编写应用程序的一个框架和引擎 ,vc+是 windos 下开 发人员使用的专业 c+ sdk(sdk,standard software develop kit,专业软 件开发平台),mfc 就是挂在它之上的一个辅助软件开发包 ,mfc 作为与 vc+ 血肉相连的部分 (注意 c+和 vc+的区别:c+是一种程序设计语言 ,是一种 大家都承认的软件编制的通用规范 ,而 vc+只是一个编译器 ,或者说是一种

30、编译器+源程序编辑器的 ide,ws,platform,这跟 pascal 和 delphi 的关系 一个道理,pascal 是 delphi 的语言基础 ,delphi 使用 pascal 规范来进行 win 下应用程序的开发和编译 ,却不同于 basic 语言和 vb 的关系,basic 语 言在 vb 开发出来被应用的年代已经成了 basic 语言的新规范 ,vb 新加的 basic 语言要素,如面向对象程序设计的要素 ,是一种性质上的飞跃 ,使 vb 既是一个 ide,又成长成一个新的程序设计语言 ),mfc 同 bc+集成的 vcl 一 样是一个非外挂式的软件包 ,类库,只不过 mf

31、c 类是微软为 vc+专配的. mfc是win api与c+的结合,api,即微软提供的 windos下应用程序的 编 程语言接口,是一种软件编程的规范 ,但不是一种程序开发语言本身 ,可以允 许用户使用各种各样的第三方 (如我是一方 ,微软是一方 ,borland就是第三 方)的编程语言来进行对 windos下应用程序的开发 ,使这些被开发出来的应 用程序能在windos下运行,比如vb,vc+,java,dehpi编程语言函数本质上全 部源于api,因此用它们开发出来的应用程序都能工作在 winos的消息机制和 绘图里,遵守windos作为一个操作系统的内部实现 ,这其实也是一种必要 ,

32、微软如果不提供 api,这个世上对 win编程的工作就不会存在 ,微软的产品就 会迅速从时尚变成垃圾 ,上面说到mfc是微软对api函数的专用 c+封装,这种 结合一方面让用户使用微软的专业 c+ sdk来进行win下应用程序的开发变 得容易,因为mfc是对api的封装,微软做了大量的工作 ,隐藏了好多程序开发 人员在win下用c+ i != 11;i+ ) for( int j = 0; j != 11;j+) m_qizhiij = 2; .2 voidvoid cclientdlg:init(void)cclientdlg:init(void) 用于绘制主界面的函数,这个

33、函数在onpaint(),中调用当函数被调用时将 重新绘制主界面,在onpaint()中调用主要是由于程序对话框的变化,程序的主 框架,图片的绘制也要随着变化。绘制棋子的函数如下: for(int i = 0;i != 11;i+) for(int j = 0;j != 11;j+) if(m_qizhiij = 0) paint(130,(i+1)*50-18,(j+1)*50-18); if(m_qizhiij = 1) paint(131,(i+1)*50-18,(j+1)*50-18); .3 voidvoid cclientdlg:onpaint()cclientdl

34、g:onpaint() 每当wm_paint消息触发时,都需要对棋盘进行重绘。onpaint作为响应绘制 消息的消息处理函数使用了双缓冲技术,减少了多次绘图可能导致的图像闪烁 问题。这个函数主要完成了以下工作: 装载棋盘位图并进行绘制。 根据棋盘数据绘制棋子。 绘制最后落子指示矩形。 .4 voidvoid cclientdlg:onlbuttondown(uintcclientdlg:onlbuttondown(uint nflags,nflags, cpointcpoint point)point) 当服务器给客户端发送允许走棋的时候,来响应单击左键的消息 wm_onlbu

35、ttondown,这个函数将在主界面对话框上面的像数转换成棋盘上面对 应的坐标,用于保存和发送,但是不将这个值记录与本地,这个是主要为了网 络同步,将这个值与客户端的ip绑定发送给服务器,然后有服务器将这个值发 送给每个客户端,客户端获取这个消息来更新自己的主界面。 .5 voidvoid cclientdlg:onreceive(void)cclientdlg:onreceive(void) 客户端与服务器之间的主要的tcp连接的收信息程序,将服务器发送给客户 端的信息解,ctcpscoket类响应onreceive消息,调用cclientdlg的这个函数, 首先将信息的第一

36、个字符取下,来判断这个字符时多少,然后根据这个值调用 下面的if的函数: char *data = new char80; memset(data,0,80); m_tcpsocket-receive(data,80); char *dat = new char80; memset(dat,0,80); catchar(data,dat,0,1); int n = atoi(dat); if( n = 1) 处理语句; return; if(n = 2 ) .6 voidvoid cclientdlg:ontimer(uint_ptrcclientdlg:ontimer(uin

37、t_ptr nidevent)nidevent) 这个函数响应wm_ontimer,即定时器,是用来当客户端连接服务器,在函数 那里开始计时,用一个状态值来记录连上没,在设置定时器的函数处设定这个 状态bool m_state = 0,在收到服务器的同步信息的时候将这个值设定为1,若 1秒中以后这个值没变为1则弹出对话框告诉连接失败,否则弹出连接成功的对 话框来提示已经连上服务器。 .7 voidvoid cclientdlg:onsearch()cclientdlg:onsearch() 函数响应“开始”菜单中的单击“搜索服务器”的消息,当玩家单击的时 候弹出搜索服务器的对话

38、框,玩家可以在这里搜索当前网段打开的服务器,并 且连接上去,若服务器可以连接则关闭对话框,连接服务器,触发定时器。 .8 voidvoid cclientdlg:onbnclickedstart()cclientdlg:onbnclickedstart() 函数响应开始按钮的单击消息,当单击开始的时候客户端向服务器发送希 望开始游戏的信息,服务器收到此信息,将客户端的状态设为1,当两个玩家都 希望开始游戏的时候游戏才真正开始。 .9 voidvoid csearch:shuaxin(void)csearch:shuaxin(void) 在服务器搜索器中,这个从g

39、msrchip中读取网段的ip,使用udp套接字向网 段内发送“1”的广播,当该网段的服务器收到了这条信息,会给客户端发送服 务器基本情况的信息,这个函数在“刷新”和“自动刷新”按钮的单击响应消 息中使用。 .10 voidvoid csearch:onbnclickedconnect()csearch:onbnclickedconnect() 再服务器搜索器中,当确定了要连接的服务器,单击“连接”按钮, udpsocket向服务器发送信息再次取在线人数,若人数已满则,弹出对话框提醒 “人数已满”,如果可以连接则调用cdialog:onok()函数来结束对话框,将获 取的ip

40、传给cclientdlg中来连接。整个csearch为程序中提供的是一个可以连接 的服务器ip由cclientdlg来连接。 .11 voidvoid cshezhi:initlist(void)cshezhi:initlist(void) cshezhi类用来处理搜索对话框中所需的网段的ip,函数先取gmsrchip.ini 文件的lenth这个设置,根据这个设置来确定读取ip的次数,将ip加入clistbox 控件中显示出来。 6.6.服务器的实现服务器的实现 6.16.1 主要的成员变量主要的成员变量 .1 boolbool cserverdlg:cse

41、rverdlg: m_isstartm_isstart 记录是否开始游戏,游戏开始m_isstart为1,其他时候为0。 .2 cptrlistcptrlist *cserverdlg:m_list*cserverdlg:m_list 动态记录tcp连接的套接字的链表,可以做到随时的删除和添加,cptrlist 为mfc里面自动的void类型的指针链表,使得tcpsocket的操作更加方便。 .3 intint cserverdlg:m_numcserverdlg:m_num 记录连接数,有客户端连接服务器的时候m_num+1,当服务器的连接数达到 2的时候停止

42、接受客户端的连接。 .4 intint cserverdlg:m_qizhi1111cserverdlg:m_qizhi1111 记录当前棋盘的情况,客户端的的走棋信号发送给服务器,服务器使用 iswin函数来判断m_qizhi,来确定是否胜利。 .5 csersocketcsersocket cserverdlg:m_sersocketcserverdlg:m_sersocket listen 的tcp套接字,这个套接字一直存在,来提供客户端的连接的,但 是如果m_num达到2将不再接受。 .6 cudpsocketcudpsocket cse

43、rverdlg:m_udpscoektcserverdlg:m_udpscoekt udp 套接字,这个套接字一直存在,只要有客户端的udp发送请求都会应答, 显示服务器情况。 .7 xinxixinxi cserverdlg:m_xinxi2cserverdlg:m_xinxi2 记录登录客户端信息的,开始游戏,id均存于此成员变量中,来作为游戏 开始结束,连接的判断。 6.26.2 重要数据结构重要数据结构 记录客户端的信息的结构体 struct xinxi int id; /记录客户端的id char *yonghu; /存储客户端的用户名 int pic; /存储客户端

44、的头像id bool state; /存储客户端是否愿意开始游戏 6.36.3 主要类的功能以及成员函数介绍主要类的功能以及成员函数介绍 cserverdlg 系统自动生成的主要界面,主要负责服务器信息的管理。 csersocket继承于casyncsocket,用于listen socket,一直存在用于监听。 ctcpsocket用于tcp连接的信息处理。 cudpsocket用于udp的信息处理。 .1 voidvoid cserverdlg:updateuser(void)cserverdlg:updateuser(void) 用户更新链接的客户端的信息,对连接在服务器

45、上的所有客户端发送包含 id,用户名以及头像资源id的信息,客户端收到这条信息的时候必须更新所有连 接服务器上面的信息,以达到和服务器的同步。 .2 voidvoid cserverdlg:onaccept(void)cserverdlg:onaccept(void) 服务器处理收到连接时候的函数,处理这个链接时候会查询m_num这个成员 变量,来确定服务器怎么处理连接,若m_num = 2则停止建立连接,若m_num = 0则向客户端分配id=0,若m_num = 1,则根据以下函数来分配id给客户端,达 到客户端的id不重复,并且形成动态分配,函数如下: for(int i

46、 = 0;i != 2;i+) if(m_xinxii.id != 2) socket-m_id = (m_xinxii.id +1)%2; .3 voidvoid ctcpsocket:onreceive(intctcpsocket:onreceive(int nerrorcode)nerrorcode) 服务器端收到信息处理函数,和客户端结构类似,当tcpsocket时候有 onrecieve信号时,收取信息,并且去第一个字符,将其转换成int型号的,根 据这个字符来判断该做什么事。这个函数是整个服务器的核心,并且非常复杂。 .4 boolbool ctcp

47、socket:iswin(intctcpsocket:iswin(int m_ncoords1111,m_ncoords1111, intint x,x, intint y)y) 五子棋判断胜负的算法,提前将收到的走棋信息存储于二维数组中,在根 据走棋的坐标来判断,若现在走的一方为胜,则返回true,否则返回flase,二 维数组为cserverdlg类的成员变量。具体的判断方法将在下章的算法分析中分 析。 7 7 主要算法主要算法 五子棋游戏中,有相当的篇幅是算法的部分。无论是人机对弈,还是网络 对弈,都需要合理算法的支持,本节中将详细介绍五子棋中使用的算法。 7.17.1 判断胜负判断胜负

48、 五子棋的胜负,在于判断棋盘上是否有一个点,从这个点开始的右、下、 右下、左下四个方向是否有连续的五个同色棋子出现,如图 6.1: 图图 3 3 判断胜负方向判断胜负方向 这个算法是 ctcpsocket 类中的 iswin 成员函数,分析上这个要接受 3 个形 参,一个棋盘的二维数组,和走棋的横坐标和竖坐标,代码如下: bool ctcpsocket:iswin(int m_ncoords1111, int x, int y) int xmin=max(0, x - 4); int xmax=min(10, x + 4); int ymin=max(0, y - 4); int ymax=m

49、in(10, y + 4); int i, j, p, q, sum1, sum2, sum3, sum4; /判断横方向 for(j=xmin; j=xmax-4; j+) for(i=j, sum1=0; ij+5; i+) if(m_ncoordsiy=m_ncoordsxy) sum1+; if(sum1=5) return true; /判断竖方向 for(i=ymin; i=ymax-4; i+) for(j=i, sum2=0; jxmin i-, j-); for(; i=xmax-4 i+, j+) for(sum3=0, p=i, q=j; pxmin i-, j+); f

50、or(; i=ymin+4; i+, j-) for(sum4=0, p=i, q=j; pi+5; p+, q-) if(m_ncoordspq=m_ncoordsxy) sum4+; if(sum4=5) return true; return false; 7.27.2 人机对弈算法人机对弈算法 .1 获胜组合获胜组合 获胜组合是一个三维数组,它记录了所有取胜的情况。也就是说,参考于 iswin 中的情况,对于每一个落子坐标,获胜的组合一共有 15 * 11 * 2 + 11 * 11 * 2 = 572 种。 而对于每个坐标的获胜组合,应该设置一个1515572大小的三

51、维数组。 在拥有了这些获胜组合之后,就可以参照每个坐标的 572 种组合给自己的局面 和玩家的局面进行打分,也就是根据当前盘面中某一方所拥有的获胜组合多少 进行权值的估算,给出最有利于自己的一步落子坐标。 由于是双方对弈,所以游戏的双方都需要一份获胜组合,也就是: bool m_computer1515572; / 电脑获胜组合 bool m_player1515572; / 玩家获胜组合 在每次游戏初始化(conegame:init)的时候,需要将每个坐标下可能 的获胜组合都置为 true。 此外,还需要设置计算机和玩家在各个获胜组合中所填入的棋子数: int m_win2572; 在初始化

52、的时候,将每个棋子数置为 0。 .2 落子后处理落子后处理 每当一方落子后,都需要作如下处理: 如果己方此坐标的获胜组合仍为 true,且仍有可能在此获胜组合处添 加棋子,则将此获胜组合添加棋子数加 1; 如果对方此坐标的获胜组合仍为 true,则将对方此坐标的获胜组合置 为 false,并将对方此获胜组合添加棋子数置为-1(不可能靠此组合获胜) 。 以玩家落子为例,代码为: for ( i = 0; i 572; i+ ) / 修改状态变化 if ( m_playerstepput.xstepput.yi if ( m_computerstepput.xstepput.yi

53、) m_computerstepput.xstepput.yi = false; m_win1i = -1; .3 查找棋盘空位查找棋盘空位 在计算机落子之前,需要查找棋盘的空位,所以需要一个 searchblank 成 员函数完成此项工作,此函数需要进行不重复的查找,也就是说,对已查找过 的空位进行标记,并返回找到空位的坐标,其代码如下: bool conegame:searchblank( int for ( x = 0; x 15; x+ ) for ( y = 0; y 15; y+ ) if ( nowtablexy = -1 j = y; return true; return false; .4 落子打分落子打分 找到空位后,需要对这个点的落子进行打分,这个分数也就是这个坐标重 要性的体现,代码如下: int conegame:givescore( const step for ( i = 0; i getcolor() = stepput.color ) / 玩家下 if ( m_playerstepput.xstepput.yi ) switch ( m_win0i ) case

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论