vc++多人对战平台连连看系统毕业设计含源文件复习过程_第1页
vc++多人对战平台连连看系统毕业设计含源文件复习过程_第2页
vc++多人对战平台连连看系统毕业设计含源文件复习过程_第3页
vc++多人对战平台连连看系统毕业设计含源文件复习过程_第4页
vc++多人对战平台连连看系统毕业设计含源文件复习过程_第5页
已阅读5页,还剩163页未读 继续免费阅读

下载本文档

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

文档简介

1、Good is good, but better carries it.精益求精,善益求善。vc+多人对战平台连连看系统毕业设计含源文件摘要因特网的发展使人类进入了一个全新的世界,人与人之间可以远隔万里为了同一兴趣爱好而交流,做到了网络无国界,信息无国界。随着因特网的不断发展,网络游戏作为一个新的名词融入到了人们的日常生活当中。网络游戏来源于“onlinegame”,更直接的翻译是“在线游戏”,亦即必须在大家联网而且都在线的时候,才能够团队互动,否则就属于单机游戏了。网络游戏产业作为现代电脑电子技术的产物,正在以其独特的魅力在全世界的娱乐领域占据主流位置,我们在承认广大娱乐网民的选择空间狭小的

2、同时,也必须明确的一点就是网络游戏本身所具有的强大的吸引力。网络游戏的吸引力主要在于,它在让玩家打发时间的同时,可以让人实现在显示生活中不能实现的理想,得到在显示中不能得到的东西。而且网游产业促动高科技技术不断升级,作为经济增长的一大支撑点,已经成为经济腾飞的“第四产业”。近年来,世界网络游戏市场高速发展。根据统计,全球网络玩家所占互联网人群的比例已经超过30%。网络游戏凭借其信息双向交流,速度快,不受空间限制等互联网有时,具有诱人的互动性、仿真性和竞技性,已经成为网络业盈利优厚的三大领域之一。网络平台的发展,为网络游戏奠定了坚实的“物质”基础。宽带的迅猛发展为网络游戏提供了“高速公路”,而专

3、用游戏服务器则为网络游戏提供了容量巨大的“加油站”。前不久,网络游戏还被视为一个“高风险”的行业,但随着人们对网络游戏的重新认识,网络游戏正在恢复其应有的地位。本文在基于VC+开发平台的多人对战平台系统的工作基础上采用基于B/S三层架构模式,选取VC+6.0作为开发工具,以Access2007为后台数据库,来实现多人对战平台的基本功能。关键词:连连看、网络游戏、网络对战目录TOCo1-3hzuHYPERLINKl_Toc261900585摘要PAGEREF_Toc261900585hIHYPERLINKl_Toc261900586目录PAGEREF_Toc261900586hIIHYPERLI

4、NKl_Toc261900587第1章绪论PAGEREF_Toc261900587h1HYPERLINKl_Toc2619005881.1目的PAGEREF_Toc261900588h1HYPERLINKl_Toc2619005891.2意义PAGEREF_Toc261900589h1HYPERLINKl_Toc2619005901.3主要问题PAGEREF_Toc261900590h1HYPERLINKl_Toc2619005911.4技术要求PAGEREF_Toc261900591h1HYPERLINKl_Toc2619005921.5发展概况PAGEREF_Toc261900592h1H

5、YPERLINKl_Toc2619005931.6指导思想PAGEREF_Toc261900593h2HYPERLINKl_Toc261900594第2章系统解决方案的选择PAGEREF_Toc261900594h3HYPERLINKl_Toc2619005952.1C/S结构PAGEREF_Toc261900595h3HYPERLINKl_Toc2619005962.2三层架构PAGEREF_Toc261900596h4HYPERLINKl_Toc2619005972.2.1什么是“三层架构”PAGEREF_Toc261900597h4HYPERLINKl_Toc2619005982.2.2

6、三层架构的优缺点PAGEREF_Toc261900598h4HYPERLINKl_Toc261900599第3章需求分析PAGEREF_Toc261900599h5HYPERLINKl_Toc2619006003.1产品描述PAGEREF_Toc261900600h5HYPERLINKl_Toc2619006013.2产品功能PAGEREF_Toc261900601h5HYPERLINKl_Toc2619006023.3具体功能需求PAGEREF_Toc261900602h6HYPERLINKl_Toc2619006043.4协议设计PAGEREF_Toc261900604h9HYPERLIN

7、Kl_Toc2619006053.4.1控制消息UDP数据包格式PAGEREF_Toc261900605h9HYPERLINKl_Toc2619006063.4.2客户端到服务器端(C-S)UDP数据包PAGEREF_Toc261900606h10HYPERLINKl_Toc2619006073.4.3服务器端到客户端(S-C)UDP数据包PAGEREF_Toc261900607h11HYPERLINKl_Toc2619006083.4.4数据库设计PAGEREF_Toc261900608h11HYPERLINKl_Toc2619006093.4.5详细设计PAGEREF_Toc2619006

8、09h11HYPERLINKl_Toc261900610第4章总体设计PAGEREF_Toc261900610h12HYPERLINKl_Toc2619006114.1开发环境PAGEREF_Toc261900611h12HYPERLINKl_Toc2619006124.2相关表设计图PAGEREF_Toc261900612h12HYPERLINKl_Toc261900613第5章详细设计PAGEREF_Toc261900613h28HYPERLINKl_Toc2619006155.1用户注册功能PAGEREF_Toc261900615h28HYPERLINKl_Toc2619006165.2

9、登录页面PAGEREF_Toc261900616h38HYPERLINKl_Toc2619006175.3游戏大厅PAGEREF_Toc261900617h45HYPERLINKl_Toc2619006185.4游戏房间PAGEREF_Toc261900618h54HYPERLINKl_Toc2619006195.5游戏准备界面PAGEREF_Toc261900619h63HYPERLINKl_Toc2619006205.6游戏界面PAGEREF_Toc261900620h67HYPERLINKl_Toc261900622第6章总结与展望PAGEREF_Toc261900622h96HYPER

10、LINKl_Toc261900623致谢PAGEREF_Toc261900623h96第1章绪论1.1目的网络小游戏制作的目的是满足了人们休闲的需要,在紧张工作之余休闲类的小游戏能够给人带来最大程度的放松,也可以增进人们之间的交流,沟通,通过游戏还可以认识更多的朋友,也可以到达跨省、跨市,甚至跨国间人们互相娱乐的目的。另外也通过本程序将两年来所学的专业知识和其他方面的知识融入到实际应用中。1.2意义通过此次课题的设计,掌握如何制作一个游戏软件,以及制作游戏软件的整个流程,制作游戏软件的步骤,为以后的就业工作打下基础。1.3主要问题开始制作游戏时,主要要解决的问题有以下几个方面:如何设置整个游戏

11、的界面;如何控制连连看游戏中随机图片的生成且每种图片必须为偶数个;游戏开始后,判断鼠标两次点击的图片能否消去,即图片是否相同且图片之间路径的判断;如何连接网络上的两台计算机实现网络对战,互发消息,如何判断游戏是否结束以及输赢问题等。1.4技术要求网络中任意计算机当运行该游戏软件是,要有一台当服务器,如果要当服务器,则等待客户机的连接请求;如果要当客户机,则要主动去连接服务器。游戏中能正确判断鼠标两次点下的图片是否可以消去、能正确判断游戏是否已经结束和哪一方玩家胜出。还可顺利发消息给对方和接收对方发来的消息。1.5发展概况网络游戏正处于加速发展周期中,中国网络游戏市场迅速扩大,近三年的年均增长率

12、超过100%。网络游戏的告诉发展,逐渐引起了我国政府的高度重视,信息产业部、文化部、新闻出版总属等相关部门都在积极推动各项市场监管和鼓励网络游戏产业发展的政策措施的出台,2003年网络游戏首次被正式纳入国家863计划,标志着我国网络游戏产业已经的到政府的充分重视。除外,在网络游戏产业发展的同时,有力带动了相关行业的发展,如软件、计算机、通信、电信运营、互联网等,根据统计,网络游戏能够带动10倍于自身产值的相关行业的发展。预计未来三年,中国游戏时常规模仍将保持60%以上的告诉增长,至2006年市场规模将接近100亿元,而多样的资本运作模式将成为网络游戏产业发展的重要推动力。同时,手机游戏、家用游

13、戏机、游戏传媒、电子竞技等游戏周边行业也将快速发展起来。1.6指导思想按照软件开发的总过程进行设计,经历定义和计划、需求分析、软件设计、软件编码、软件测试等过程。第2章系统解决方案的选择2.1C/S结构C/S(Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server应用都可以进行同样的业务处理,应用

14、不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。C/S结构的优点是能充分发挥客户端的处理能力,很多工作可以在客户端处理后再提交给服务器。对应的优点就是客户端响应速度快。C/S架构软件的优势与劣势:(1)应用服务器运行数据负荷较轻。最简单的C/S体系结构的数据库应用由两部分组成,即客户应用程序和数据库服务器程序。二者可分别称为前台程序与后台程序。运行数据库服务器程序的机器,也称为应用服务器。一旦服务器程序被启动,就随时等待响应客户程序发来的请求;客户应用程序运行在用户自己的电脑上,对应

15、于数据库服务器,可称为客户电脑,当需要对数据库中的数据进行任何操作时,客户程序就自动地寻找服务器程序,并向其发出请求,服务器程序根据预定的规则作出应答,送回结果,应用服务器运行数据负荷较轻。(2)数据的储存管理功能较为透明。在数据库应用中,数据的储存管理功能,是由服务器程序和客户应用程序分别独立进行的,前台应用可以违反的规则,并且通常把那些不同的(不管是已知还是未知的)运行数据,在服务器程序中不集中实现,例如访问者的权限,编号可以重复、必须有客户才能建立定单这样的规则。所有这些,对于工作在前台程序上的最终用户,是“透明”的,他们无须过问(通常也无法干涉)背后的过程,就可以完成自己的一切工作。在

16、客户服务器架构的应用中,前台程序不是非常“瘦小”,麻烦的事情都交给了服务器和网络。在C/S体系的下,数据库不能真正成为公共、专业化的仓库,它受到独立的专门管理。(3)C/S架构的劣势是高昂的维护成本且投资大。首先,采用C/S架构,要选择适当的数据库平台来实现数据库数据的真正“统一”,使分布于两地的数据同步完全交由数据库系统去管理,但逻辑上两地的操作者要直接访问同一个数据库才能有效实现,有这样一些问题,如果需要建立“实时”的数据同步,就必须在两地间建立实时的通讯连接,保持两地的数据库服务器在线运行,网络管理工作人员既要对服务器维护管理,又要对客户端维护和管理,这需要高昂的投资和复杂的技术支持,维

17、护成本很高,维护任务量大。2.2三层架构2.2.1什么是“三层架构”三层架构(3-tierapplication)通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。所谓三层体系结构,是在客户端与数据库之间加入了一个“中间层”,也叫组件层。这里所说的三层体系,不是指物理上的三层,不是简单地放置三台机器就是三层体系结构,也不仅仅有B/S应用才是三层体系结构,三层是指逻辑上的三层,即使这三个层放置到一台机器上。三层体系的应用程序将业务规则、数据访问、合法性校验等工作放到了中间层进行处理。通常情况下,

18、客户端不直接与数据库进行交互,而是通过COM/DCOM通讯与中间层建立连接,再经由中间层与数据库进行交互。2.2.2三层架构的优缺点优点:(1)开发人员可以只关注整个结构中的其中某一层;(2)可以很容易的用新的实现来替换原有层次的实现;(3)可以降低层与层之间的依赖;(4)有利于标准化;(5)利于各层逻辑的复用。缺点:(1)降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。(2)有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务

19、逻辑层和数据访问层中都增加相应的代码。第3章需求分析3.1产品描述本产品是一款网络游戏。系统由服务端与客户端两个程序构成。采用C/S构架方式实现。服务端主要业务:提供客户端请求的服务、中转游戏数据等。而客户端提供友好的人机交互方式,供用户游戏平台,主要实现了最多6人一起游戏,按照以下顺序实现:进入游戏大厅、准备开始游戏,如果有3个以上的客户端预备开始游戏,而限定时间内又没有新的客户端准备开始,服务端就要求客户端开始游戏的倒计时,倒计时完成后,各玩家开始游戏。在游戏过程中,各玩家可以看到其它玩家的游戏进度的缩略图,但不允许增加新玩家,其它没有游戏的玩家只可以旁观游戏3.2产品功能模块功能说明服务

20、端玩家信息管理积分管理在线用户管理游戏桌子管理游戏棋盘管理信息中转管理客户端注册新玩家登陆功能大厅浏览功能准备与自动搜寻游戏功能游戏旁观功能各玩家地图缩略图积分排行连连看游戏规则3.3具体功能需求3.3.1服务器端:玩家信息管理引言:该功能实现玩家基础数据管理,包括玩家的游戏ID、姓名、密码、昵称、性别、生日、联系电话。这些数据是由客户端输入,玩家提交信息后,通过网络传输到服务端,服务端验证合法性后,自动生成一个新的游戏ID,告诉客户端,并将该玩家的一系列信息存入对应数据库表中。输入处理输出游戏ID姓名昵称密码性别生日联系电话游戏ID是服务端自动生成给玩家的游戏编号,玩家登陆时用该编号登陆(编

21、号位数不限,可以为1位也可以为任意位数值)姓名与昵称长度都不能超过8位,可以为字母空格汉字。密码长度5位,必需给出确认密码的输入(不限定字符,可为任意字符)性别:男、女生日形如:*年*月*日联系电话:7位或8位或11位或12位(12位时第一个数字必需是0)所有输入不按规则输入,均给出相应错误提示,提示要有针对性如果两次密码输入不一致,给用户一个友好提示,要求改正密码用*输出3.3.2服务端:积分管理功能引言:服务端必需在每次游戏结束后,按各玩家游戏的进度情况,评出6个等级出来,分别加分6、3、1、0、-1、-2,并在玩家积分表加入对应的积分值,并在客户端能查看出积分排行情况,列出前10名的玩家

22、信息。积分表包含:游戏ID(连连看游戏ID值暂定为1000)、玩家ID、积分输入处理输出各玩家游戏的进度1、服务端要求统计出各玩家所得分值1、服务端应将该次游戏的各玩家得到累计到对应积分表中客户端能查看积分在前10名的玩家排行榜3.3.3服务端:在线用户管理引言:服务端必需在列表视图里显示当前在线玩家,某玩家上线或下线必需实时更新列表。该列表内容包括玩家ID、昵称、玩家状态(空闲、旁观、正在游戏)输入处理输出实时更新在线用户列表,及相应玩家状态3.3.4服务器端:游戏桌子管理功能引言:游戏桌子数量暂定为1张,共6个位置,至少要3个人坐不同位置才可以开始游戏。服务端当监控到该桌子数量玩家数有3个

23、以上,并在10秒内没有新玩家坐下,即可通知各坐下的客户端开始倒计时,开始倒计时后不允许新玩家再坐下空位置。如果各玩家主动都提出开始游戏,则可不用倒计时直接开始游戏。3.3.5服务器端:游戏棋盘管理引言:开始游戏提交后,服务端随机生成本次游戏的棋盘布局数据,大小为12*8,发送给各玩家。(注:共有12*8=96项数据,数据取值暂定16种,每种数据出现6次)输入处理输出无随机生成大小为12*8的棋盘布局数据将棋盘数据发送给各玩家3.3.6服务器端:信息中转管理功能引言:对各玩家的互相通讯的信息,都要经过服务器中转。包含游戏中通讯的数据、私聊、群聊等信息3.3.7客户端:注册新玩家引言:该功能在客户

24、端输入新玩家信息,包括玩家的姓名、密码、昵称、性别、生日、联系电话。玩家提交信息后,通过网络传输到服务端,服务端能过后,通知客户端生成一个新的玩家ID,并在界面里提示出输入处理输出姓名昵称密码性别生日联系电话姓名与昵称长度都不能超过8位密码长度5位,必需给出确认密码的输入性别:男、女生日形如:*年*月*日联系电话:7位或8位或11位或12位(12位时第一个数字必需是0)所有输入不按规则输入,均给出相应错误提示,提示要有针对性如果两次密码输入不一致,给用户一个友好提示,要求改正密码用*输出注册成功与否要提示客户,如果成功则要给出新玩家的ID号3.3.8客户端:登陆功能引言:客户端启动程序后,要求

25、客户输入玩家ID与密码,通过服务器验证后,如果存在该玩家且密码正确,则允许登陆,进入系统后,在界面上能直观看出当前玩家昵称。否则登陆失败提示登陆出错信息,不允许进入系统输入处理输出玩家ID密码对输入的数据进行合法验证(数据格式验证)1、登陆结果要给出提示,提示内容要人性化,合理3.3.9客户端:大厅浏览功能引言:客户端进入系统后,可以浏览到当前游戏的大厅,及桌子数。目前只有一个桌子,因此在客户端能看到当前一张桌子,及桌子6个座位的入座情况即可。3.3.10客户端:准备与自动搜寻位置功能引言:客户端各玩家根据当前桌子的入座情况,选择一个空位置即可进入游戏状态,准备开始游戏。在入座过程中,有一玩家

26、比你先坐下,则要提示已有玩家入坐该位置。自动搜寻位置:该功能实现自动的搜索出一空位置,提示玩家是否入座该位置。3.3.11客户端:游戏旁观功能引言:该功能实现游戏桌子已经开始游戏后,其它非游戏中的玩家,可以进入旁观游戏状态,浏览到各玩家游戏进度情况。但不能任何方式干扰正在游戏玩家3.3.12客户端:各玩家地图缩略图引言:在游戏过程中,当前玩家可以看到其它玩家的游戏进度,用地图缩略图的方式清楚看到对方游戏状态。3.3.13客户端:积分排行引言:任何玩家都可以由主界面的功能链接,查看到当前全服积分提在前10名玩家信息,显示玩家信息只要主要信息即可3.3.14连连看游戏规则与约定引言:哪个玩家最快连

27、完全图,则得分最高,只要一玩家连完全图,则游戏结束。此时服务端根据各玩家连接图片数量,排出该次游戏名次出来,并提示各玩家得分情况重列功能:客户端提供连连看图片重列功能:重新放置剩下图片,可随机改变剩下图片位置与顺序,重列次数暂定为最多重列5次连击次数统计:当连接图片一次与上一次连接时间相差在1秒内认为是连击,并要累计连接最大数,并显示在界面上。当断连击后,下次连击要显示出上次连击的最大数,如本次连击了两个,上次最大数为12次,则显示:2/123.3.15连连看游戏特效引言:连接线特效:两张相像的图被消时,要在这两张图之间爆破连线(模仿QQ连连看效果)3.4协议设计3.4.1控制消息UDP数据包

28、格式名称内容描述长度VERSION0100协议版本2CMD_TYPEXx命令类型(00,01)1KEYWORDXx加密字段1COMMANDXxxx命令代码2SEQNUMXxxx数据包序号2UINXxxxxxxx发送方标识4PARAMETERS可变可选参数可变CMD_TYPE取值范围值含义00C-S01S-C3.4.2客户端到服务器端(C-S)UDP数据包名称代码描述CMD_KEEPALIVE0 x01学生在线保持CMD_REG0 x02用户注册CMD_LOGIN0 x03用户登录CMD_SEND_LOG_DATE0 x04向服务器请求在线列表CMD_FANGJIAN_DATE0 x05进入游戏

29、房间CMD_CLOSE_DATE0 x06关闭游戏CMD_KEEPALIVE名称内容描述长度HOST可变主机名称可变MACXxxxxxxxxxxxMAC地址63.4.3服务器端到客户端(S-C)UDP数据包名称代码描述SRV_LOGIN_OK0 x01登录成功SRV_REG_OK0 x02注册成功SRV_QUNLIAO_DATE0 x03群聊信息SRV_GAME_OVER0 x04游戏结束SRV_EXIT_TUPIAN0 x05离开桌子SRV_YOUXI_KAISHI0 x06游戏开始SRV_CHONGZHI0 x07重置图片3.4.4数据库设计根据系统流程图对数据库进行设计(详细见第4章)。

30、3.4.5详细设计进行了系统详细设计,并进行编码设计,完成了对多人对战平台(连连看)系统大部分功能模块的开发。(详细见第5章)。第4章总体设计4.1开发环境开发工具:MicrosoftVisualC+6.0数据库:MicrosoftAccess数据库4.2相关表设计图服务器类图客户端类图数据库表设计图:用户明细表:用户积分表玩家在线状态表在线状态明细表数据库关系图系统用例图注册功能流程图登录功能流程图请求实时在线列表流程图坐下位置流程图准备开始游戏流程图开始游戏流程图重置图片流程图小地图功能流程图聊天流程图实时更新图片流程图第5章详细设计由于是客户机/服务器模式,因此下列的功能都将是服务器和客

31、户端对应的功能一起讲解5.1用户注册功能1、注册如图5.1.1图5.1.1注册首先,我们先来查看如何获得用户输入的数据为了保存用户的数据,我们需要定义变量进行接收:CStringm_username;CStringm_nicheng;CStringm_pass;CStringm_two_pass;CStringm_tel;CTimem_date;intm_men;接下来是处理和打包数据:先是判断用户是否有输入数据:BOOLMyReg:CheckNull()UpdateData();if(m_username.IsEmpty()MessageBox(用户名不能为空!);m_pEdit=(CEdi

32、t*)this-GetDlgItem(IDC_YONGHU);m_pEdit-SetFocus();returnFALSE;if(m_nicheng.IsEmpty()MessageBox(昵称不能为空!);m_pEdit=(CEdit*)this-GetDlgItem(IDC_NICHENG);m_pEdit-SetFocus();returnFALSE;if(m_pass.IsEmpty()MessageBox(密码不能为空!);m_pEdit=(CEdit*)this-GetDlgItem(IDC_MIMA);m_pEdit-SetFocus();returnFALSE;if(m_two

33、_pass.IsEmpty()MessageBox(确认的密码不能为空!);m_pEdit=(CEdit*)this-GetDlgItem(IDC_QUERENMIMA);m_pEdit-SetFocus();returnFALSE;if(m_tel.IsEmpty()MessageBox(电话不能为空!);m_pEdit=(CEdit*)this-GetDlgItem(IDC_DIANHUA);m_pEdit-SetFocus();returnFALSE;if(m_men=-1)MessageBox(性别不能为空!);m_pEdit=(CEdit*)this-GetDlgItem(IDC_R

34、ADIO1);m_pEdit-SetFocus();returnFALSE;returnTRUE;如果有输入空的数据,则返回假,正确返回真。之后是判断数据是否输入正确:BOOLMyReg:CheckFull()if(!CheckNull()returnFALSE;if(m_pass.GetLength()!=5|m_two_pass.GetLength()!=5)MessageBox(密码长度不正确!);m_pEdit=(CEdit*)this-GetDlgItem(IDC_MIMA);m_pEdit-SetFocus();m_pass.Empty();m_two_pass.Empty();U

35、pdateData(FALSE);returnFALSE;if(m_pass!=m_two_pass)MessageBox(两次输入的密码不正确!);m_pEdit=(CEdit*)this-GetDlgItem(IDC_MIMA);m_pEdit-SetFocus();m_pass.Empty();m_two_pass.Empty();UpdateData(FALSE);returnFALSE;if(m_tel.GetLength()=7|m_tel.GetLength()=8|m_tel.GetLength()=11)returnTRUE;elseif(m_tel.GetLength()=

36、12)if(m_tel.Left(1)!=0)MessageBox(你输入的电话的第一位不正确,请重新输入!);m_pEdit=(CEdit*)this-GetDlgItem(IDC_DIANHUA);m_pEdit-SetFocus();m_tel.Empty();UpdateData(FALSE);returnFALSE;returnTRUE;elseMessageBox(你输入的电话的位数不正确,请重新输入!);m_pEdit=(CEdit*)this-GetDlgItem(IDC_DIANHUA);m_pEdit-SetFocus();m_tel.Empty();UpdateData(

37、FALSE);returnFALSE;returnTRUE;当数据都验证成功之后,将调用下面函数发送至服务器端voidMyReg:OnOK()/TODO:Addextravalidationhereif(!CheckFull()return;REG_DATEm_reg;memset(&m_reg,0,sizeof(REG_DATE);strcpy(m_reg.birthday,m_date.Format(%Y-%m-%d);strcpy(m_reg.nicheng,m_nicheng);strcpy(m_reg.password,m_pass);strcpy(m_reg.tel,m_tel);

38、strcpy(m_reg.user_name,m_username);m_reg.sex=m_men;charbufsizeof(REG_DATE)+sizeof(int)+1;memset(buf,0,sizeof(buf);sprintf(buf,%04d,REG);char*p=buf;p+=4;memcpy(p,&m_reg,sizeof(REG_DATE);sendto(MySocket:m_socket,buf,sizeof(REG_DATE)+sizeof(int)+1,0,(sockaddr*)&MySocket:udp_addr,sizeof(sockaddr_in);/这里

39、将数据发送到服务器服务器端:服务器在接受到客户端的信息之后,将调用下面的函数进行处理:voidCMyDlg:Reg_date(LPPER_IO_DATApData)REG_DATEreg=*(REG_DATE*)(m_buf);CStringc_sql;intn;c_sql.Format(insertintoaccount(用户名,昵称,密码,性别,生日,电话)values(%s,%s,%s,%d,%s,%s),reg.user_name,reg.nicheng,reg.password,reg.sex,reg.birthday,reg.tel);LONGtext=m_ado.JExecute

40、WithoutRecordset(c_sql);/这里调用ADO连接数据库switch(text)case1:RECORDSETrs=m_ado.JExecuteWithRecordset(selectMAX(用户ID)asidfromaccount);if(rs!=NULL)while(!rs-rsEOF)CStringc_sql;c_sql.Format(insertintoaccount_jifen(用户ID)values(%d),n);m_ado.JExecuteWithoutRecordset(c_sql);REG_DATEsend_reg;memset(&send_reg,0,si

41、zeof(REG_DATE);send_reg.id=n;send_reg.flag=EXEC_OK;charbufsizeof(int)+sizeof(REG_DATE)+1=0;char*s=buf;sprintf(buf,%04d,REG);s+=4;memcpy(s,&send_reg,sizeof(REG_DATE);sendto(m_sock.GetSock(),buf,sizeof(int)+sizeof(REG_DATE)+1,0,(sockaddr*)&pData-addr,sizeof(sockaddr_in);break;default:REG_DATEsend_reg;

42、send_reg.flag=OTHER_ERROR;charbufsizeof(int)+sizeof(REG_DATE)+1=0;char*s=buf;sprintf(buf,%04d,REG);s+=4;memcpy(s,&send_reg,sizeof(REG_DATE);sendto(m_sock.GetSock(),buf,sizeof(int)+sizeof(REG_DATE)+1,0,(sockaddr*)&pData-addr,sizeof(sockaddr_in);/这里将注册成功或失败的信息返回给客户端break;客户端:接收到服务器端发送回来的信息之后将成功或失败的信息显

43、示出来,如果失败,将需要用户继续输入,如果成功,将提示成功信息,并返回到登陆界面。LRESULTMyReg:OnUserReg(WPARAMwParam,LPARAMlParam).CStringstr;str.Format(注册成功rn登陆ID为:%d,m_reg.id);MessageBox(str);elseMessageBox(注册失败);m_username=_T();m_nicheng=_T();m_pass=_T();m_two_pass=_T();m_tel=_T();m_date=CTime:GetCurrentTime();m_men=-1;UpdateData(FALSE

44、);m_pEdit=(CEdit*)this-GetDlgItem(IDC_YONGHU);m_pEdit-SetFocus();return1;MyGlobalVariable*m_glb=MyGlobalVariable:GetMyGlobalVariable();:SendMessage(m_glb-GetLoginHwnd(),USER_MSG,(unsignedint)&m_reg.id,NULL);CDialog:OnOK();return0;注册成功的界面5.2登录页面1、登录页面如图5.1.2图5.1.2登录截图首先定义2个变量接受用户输入的账号和密码的信息,定义如下:CStr

45、ingm_id;CStringm_mima;当用户点击了登陆界面之后,将调用以下函数进行处理:voidMyLogin:OnOK()/TODO:AddextravalidationhereUpdateData();LOGIN_DATEm_log;memset(&m_log,0,sizeof(LOGIN_DATE);m_log.user_name=atoi(m_id);strcpy(m_log.password,m_mima);charbufsizeof(LOGIN_DATE)+sizeof(int)+1;memset(buf,0,sizeof(buf);sprintf(buf,%04d,LOGI

46、N);char*p=buf;p+=4;memcpy(p,&m_log,sizeof(LOGIN_DATE);sendto(MySocket:m_socket,buf,sizeof(LOGIN_DATE)+sizeof(int)+1,0,(sockaddr*)&MySocket:udp_addr,sizeof(sockaddr_in);/这里将用户输入的数据发送到服务器端服务器端:当服务器收到用户提交的登录请求之后,将调用以下函数查询数据库并返回成功或失败的信息voidCMyDlg:Lonin_date(LPPER_IO_DATApData)LOGIN_DATEm_log;memset(&m_l

47、og,0,sizeof(LOGIN_DATE);m_log=*(LOGIN_DATE*)m_buf);CStringstr;str.Format(SELECTcount(*)as个数FROMaccountwhere用户ID=%dand密码=%s,m_log.user_name,m_log.password);RECORDSETflag=m_ado.JExecuteWithRecordset(str);intn=0;if(flag!=NULL)while(!flag-rsEOF)n=GIF(flag,个数);flag-MoveNext();if(n=1)/账号和密码正确inta=0;str.Fo

48、rmat(selectcount(*)as个数fromaccount_zaixianwhere用户ID=%d,m_log.user_name);RECORDSETrs=m_ado.JExecuteWithRecordset(str);if(rs!=NULL)while(!rs-rsEOF)a=GIF(rs,个数);rs-MoveNext();if(a=1)charbuf10=0;sprintf(buf,%04d%04d,LOGIN,REPEAT_LOGIN);sendto(m_sock.GetSock(),buf,10,0,(sockaddr*)&pData-addr,sizeof(socka

49、ddr_in);return;str.Format(selecta.用户IDasID,a.昵称as昵称,b.积分as积分fromaccountasa,account_jifenasbwherea.用户ID=%danda.用户ID=b.用户ID,m_log.user_name);rs=m_ado.JExecuteWithRecordset(str);XINXIm_xinxi=GetXinxi(rs);charbufsizeof(int)+sizeof(XINXI)+1=0;sprintf(buf,%04d,BAOCUN_XINXI);char*p=buf;p+=4;memcpy(p,&m_xin

50、xi,sizeof(XINXI);sendto(m_sock.GetSock(),buf,sizeof(int)+sizeof(XINXI)+1,0,(sockaddr*)&pData-addr,sizeof(sockaddr_in);/客户端保存相应的数据;chararr10=0;sprintf(arr,%04d%04d,LOGIN,EXEC_OK);sendto(m_sock.GetSock(),arr,10,0,(sockaddr*)&pData-addr,sizeof(sockaddr_in);charbuf1sizeof(int)+sizeof(XINXI)+1=0;sprintf(

51、buf1,%04d,SEND_LOG_DATE);p=buf1;p+=4;memcpy(p,&m_xinxi,sizeof(XINXI);for(ADDRITit=m_addr.begin();it!=m_addr.end();+it)sendto(m_sock.GetSock(),buf1,sizeof(int)+sizeof(XINXI)+1,0,(sockaddr*)&(*it),sizeof(sockaddr_in);m_addr.push_back(pData-addr);/*更新list控件*/rs=NULL;str.Format(selecta.用户IDasID,a.昵称as昵称

52、,a.积分as积分,b.在线状态as状态fromaccount_zaixianasa,account_zhuangtaiasbwherea.用户ID=%danda.在线ID=b.在线ID,m_log.user_name);rs=m_ado.JExecuteWithRecordset(str);UpdateList(rs);CTimet=CTime:GetCurrentTime();CStringstr,m_xianshi_xinxi,str1;str=t.Format(%Y-%m-%d%H:%M:%S:);str1.Format(%s玩家%05d上线了!rn,str,m_log.user_na

53、me);m_xinxi_xianshi.ReplaceSel(str1);m_xinxi_xianshi.SetSel(-1,-1);elsecharbuf10=0;sprintf(buf,%04d%04d,LOGIN,LOGIN_ERROR);sendto(m_sock.GetSock(),buf,10,0,(sockaddr*)&pData-addr,sizeof(sockaddr_in);客户端:当收到服务器端处理完毕的数据之后,将调用下面函数进行处理。成功之后将显示游戏大厅界面。LRESULTMyLogin:OnUserLog(WPARAMwParam,LPARAMlparm)intl

54、og=atoi(char*)wParam);delete(char*)wParam;if(log=EXEC_OK)/账号密码验证成功MySysCfg:Set_old_user(m_id);MySysCfg:write_to_old_file();/memcpy(m_id,m_id,m_id.GetLength();MyGlobalVariable*m_glb=MyGlobalVariable:GetMyGlobalVariable();m_glb-SetLoginHwnd(NULL);CDialog:OnOK();return0;if(log=LOGIN_ERROR)MessageBox(您输

55、入的用户名或密码不正确,请您重新输入!);m_id=;m_mima=;UpdateData(FALSE);CEdit*pEdit=(CEdit*)this-GetDlgItem(IDC_YONGHU);pEdit-SetFocus();return0;if(log=REPEAT_LOGIN)MessageBox(您输入的用户名已经登录,请您重新输入!);m_id=;m_mima=;UpdateData(FALSE);CEdit*pEdit=(CEdit*)this-GetDlgItem(IDC_YONGHU);pEdit-SetFocus();return0;return0;5.3游戏大厅客户

56、端的大厅界面如图5.2.1图5.2.1大厅界面界面左边是选择游戏大厅的界面,这个功能不需要连接服务器,相关的显示函数如下:voidCMyDlg:InitTreeText()/初始化控件信息m_tree.DeleteAllItems();HTREEITEMroot;HTREEITEMroot1;root=m_tree.InsertItem(连连看,0,1);m_tree.SetItemData(root,0);root1=m_tree.InsertItem(连连看一区,0,1,root);m_tree.SetItemData(root1,1);voidCMyDlg:OnDblclkTree1(N

57、MHDR*pNMHDR,LRESULT*pResult)/选择房间/TODO:AddyourcontrolnotificationhandlercodeherePOINTpoint;GetCursorPos(&point);UINTuFlags;m_tree.ScreenToClient(&point);HTREEITEMhItem=m_tree.HitTest(point,&uFlags);if(hItem!=NULL)&(TVHT_ONITEM&uFlags)inti=m_tree.GetItemData(hItem);if(i=1)if(m_bool=FALSE)CStringstr;s

58、tr=m_tree.GetItemText(hItem);m_tab.InsertItem(1,str,0);m_tab.SetCurSel(1);m_fangjian=newMyFangjian();m_fangjian-Create(IDD_FANGJIAN,&m_tab);m_sum+;m_bool=TRUE;DoTab(m_sum);elseMessageBox(你已经开启房间了);*pResult=0;界面中间的窗体显示的是游戏中积分排名前10名的玩家的信息,相关的函数如下:charbufsizeof(int)+1;memset(buf,0,sizeof(buf);sprintf(b

59、uf,%04d,REQUEST_DATE);sendto(MySocket:m_socket,buf,sizeof(int)+1,0,(sockaddr*)&MySocket:udp_addr,sizeof(sockaddr_in);/向服务器请求列表数据服务器端:服务器在接受到客户端的请求之后,调用函数查询数据库并返回结果集:voidCMyDlg:Request_date(LPPER_IO_DATApData)charbufDATA_SIZE=0;intx=0;RECORDSETrs=m_ado.JExecuteWithRecordset(selecta.昵称as昵称,a.积分as积分,b.

60、在线状态as状态fromaccount_zaixianasa,account_zhuangtaiasbwherea.在线ID=b.在线ID);x=Pack_date(rs,buf);chararrDATA_SIZE=0;sprintf(arr,%04d%04d,REQUEST_DATE,x);char*p=arr;p+=8;memcpy(p,buf,sizeof(XINXI)*x);sendto(m_sock.GetSock(),arr,sizeof(XINXI)*x+8,0,(sockaddr*)&pData-addr,sizeof(sockaddr_in);/将信息发送回客户端intCMy

温馨提示

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

评论

0/150

提交评论