版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGEPAGE97摘要因特网的进展使人类进入了一个全新的世界,人与人之间可以远隔万里为了同一爱好爱好而沟通,做到了网络无国界,信息无国界.随着因特网的不断进展,网络游戏作为一个新的名词融入到了人们的日常生活当中。网络游戏来源于“onlinegame”,更直接的翻译是“在线游戏”,亦即必须在大家联网而且都在线的时候,才能够团队互动,否则就属于单机游戏了.网络游戏产业作为现代电脑电子技术的产物,正在以其独特的魅力在全世界的娱乐领域占据主流位置,我们在承认宽阔娱乐网民的选择空间狭小的同时,也必须明确的一点就是网络游戏本身所具有的强大的吸引力。网络游戏的吸引力主要在于,它在让玩家打发时间的同时,可以让人实现在显示生活中不能实现的抱负,得到在显示中不能得到的东西。而且网游产业促动高科技技术不断升级,作为经济增长的一大支撑点,已经成为经济腾飞的“第四产业”。近年来,世界网络游戏市场高速进展。依据统计,全球网络玩家所占互联网人群的比例已经超过30%。网络游戏凭借其信息双向沟通,速度快,不受空间限制等互联网有时,具有诱人的互动性、仿真性和竞技性,已经成为网络业盈利优厚的三大领域之一。网络平台的进展,为网络游戏奠定了坚实的“物质”基础。宽带的迅猛进展为网络游戏供应了“高速公路”,而专用游戏服务器则为网络游戏供应了容量巨大的“加油站”.前不久,网络游戏还被视为一个“高风险”的行业,但随着人们对网络游戏的重新熟识,网络游戏正在恢复其应有的地位.本文在基于VC++开发平台的多人对战平台系统的工作基础上采纳基于B/S三层架构模式,选取VC++6.0作为开发工具,以Access2007为后台数据库,来实现多人对战平台的基本功能.关键词:连连看、网络游戏、网络对战名目TOC\o”1-3"\h\z\uHYPERLINK\l"_Toc261900585"摘要ﻩPAGEREF_Toc261900585\hIHYPERLINK\l"_Toc261900586"名目ﻩPAGEREF_Toc261900586\hIIHYPERLINK\l"_Toc261900587"第1章绪论 PAGEREF_Toc261900587\h1HYPERLINK1.2意义ﻩPAGEREF_Toc261900589\h1HYPERLINK1.3主要问题 PAGEREF_Toc261900590\h1HYPERLINK\l”_Toc261900591"1.4技术要求ﻩPAGEREF_Toc261900591\h1HYPERLINK\l"_Toc261900592”1.5进展概况ﻩPAGEREF_Toc261900592\h1HYPERLINK\l”_Toc261900593"1。6指导思想ﻩPAGEREF_Toc261900593\h2HYPERLINK\l”_Toc261900594”第2章系统解决方案的选择ﻩPAGEREF_Toc261900594\h3HYPERLINK\l"_Toc261900595"2.1C/S结构 PAGEREF_Toc261900595\h3HYPERLINK\l”_Toc261900596”2.2三层架构ﻩPAGEREF_Toc261900596\h4HYPERLINK\l"_Toc261900597"2。2.1什么是“三层架构” PAGEREF_Toc261900597\h4HYPERLINK\l"_Toc261900598”2.2.2三层架构的优缺点ﻩPAGEREF_Toc261900598\h4HYPERLINK\l”_Toc261900599”第3章需求分析 PAGEREF_Toc261900599\h5HYPERLINK\l"_Toc261900600”3.1产品描述ﻩPAGEREF_Toc261900600\h5HYPERLINK\l”_Toc261900601"3.2产品功能 PAGEREF_Toc261900601\h5HYPERLINK\l"_Toc261900602"3.3简略功能需求ﻩPAGEREF_Toc261900602\h6HYPERLINK\l”_Toc261900604"3.4协议设计ﻩPAGEREF_Toc261900604\h9HYPERLINK\l"_Toc261900605"3。4。1掌握消息UDP数据包格式 PAGEREF_Toc261900605\h9HYPERLINK\l”_Toc261900606"3.4。2客户端到服务器端(C—>S)UDP数据包ﻩPAGEREF_Toc261900606\h10HYPERLINK\l"_Toc261900607"3.4.3服务器端到客户端(S—>C)UDP数据包ﻩPAGEREF_Toc261900607\h11HYPERLINK\l”_Toc261900608"3。4.4数据库设计ﻩPAGEREF_Toc261900608\h11HYPERLINK\l”_Toc261900609”3。4.5简略设计ﻩPAGEREF_Toc261900609\h11HYPERLINK第4章总体设计ﻩPAGEREF_Toc261900610\h12HYPERLINK\l"_Toc261900611"4.1开发环境 PAGEREF_Toc261900611\h12HYPERLINK\l"_Toc261900612”4.2相关表设计图ﻩPAGEREF_Toc261900612\h12HYPERLINK\l”_Toc261900613”第5章简略设计ﻩPAGEREF_Toc261900613\h28HYPERLINK\l”_Toc261900615"5.1用户注册功能ﻩPAGEREF_Toc261900615\h28HYPERLINK\l"_Toc261900616”5.2登录页面 PAGEREF_Toc261900616\h38HYPERLINK\l"_Toc261900617"5。3游戏大厅 PAGEREF_Toc261900617\h45HYPERLINK\l”_Toc261900618”5.4游戏房间ﻩPAGEREF_Toc261900618\h54HYPERLINK\l”_Toc261900619"5。5游戏筹备界面ﻩPAGEREF_Toc261900619\h63HYPERLINK\l"_Toc261900620"5.6游戏界面ﻩPAGEREF_Toc261900620\h67HYPERLINK\l"_Toc261900622"第6章总结与展望ﻩPAGEREF_Toc261900622\h96HYPERLINK\l”_Toc261900623”致谢ﻩPAGEREF_Toc261900623\h96第1章绪论1.1目的网络小游戏制作的目的是满意了人们休闲的需要,在紧张工作之余休闲类的小游戏能够给人带来最大程度的放松,也可以增进人们之间的沟通,沟通,通过游戏还可以熟识更多的伴侣,也可以到达跨省、跨市,甚至跨国间人们相互娱乐的目的。另外也通过本程序将两年来所学的专业知识和其他方面的知识融入到实际应用中。1。2意义通过此次课题的设计,掌握如何制作一个游戏软件,以及制作游戏软件的整个流程,制作游戏软件的步骤,为以后的就业工作打下基础。1.3主要问题开头制作游戏时,主要要解决的问题有以下几个方面:如何设置整个游戏的界面;如何掌握连连看游戏中随机图片的生成且每种图片必须为偶数个;游戏开头后,推断鼠标两次点击的图片能否消去,即图片是否相同且图片之间路径的推断;如何连接网络上的两台计算机实现网络对战,互发消息,如何推断游戏是否结束以及输赢问题等。1。4技术要求网络中任意计算机当运行该游戏软件是,要有一台当服务器,如果要当服务器,则等待客户机的连接恳求;如果要当客户机,则要主动去连接服务器。游戏中能正确推断鼠标两次点下的图片是否可以消去、能正确推断游戏是否已经结束和哪一方玩家胜出。还可顺利发消息给对方和接收对方发来的消息。1。5进展概况网络游戏正处于加速进展周期中,中国网络游戏市场飞快扩大,近三年的年均增长率超过100%。网络游戏的告知进展,逐渐引起了我国政府的高度重视,信息产业部、文化部、新闻出版总属等相关部门都在乐观推动各项市场监管和鼓励网络游戏产业进展的政策措施的出台,2003年网络游戏首次被正式纳入国家863计划,标志着我国网络游戏产业已经的到政府的充分重视。除外,在网络游戏产业进展的同时,有力带动了相关行业的进展,如软件、计算机、通信、电信运营、互联网等,依据统计,网络游戏能够带动10倍于自身产值的相关行业的进展。估计将来三年,中国游戏时常规模仍将保持60%以上的告知增长,至2006年市场规模将接近100亿元,而多样的资本运作模式将成为网络游戏产业进展的重要推动力。同时,手机游戏、家用游戏机、游戏传媒、电子竞技等游戏周边行业也将快速进展起来。1.6指导思想依据软件开发的总过程进行设计,经历定义和计划、需求分析、软件设计、软件编码、软件测试等过程.第2章系统解决方案的选择2。1C/S结构C/S(Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理安排到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用进展,Web和Client/Server应用都可以进行同样的业务处理,应用不同的模块共享规律组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的规律可以扩展出新的应用系统.这也就是目前应用系统的进展方向。C/S结构的优点是能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器.对应的优点就是客户端响应速度快。C/S架构软件的优势与劣势:(1)应用服务器运行数据负荷较轻。最简洁的C/S体系结构的数据库应用由两部分组成,即客户应用程序和数据库服务器程序。二者可分别称为前台程序与后台程序。运行数据库服务器程序的机器,也称为应用服务器。一旦服务器程序被启动,就随时等待响应客户程序发来的恳求;客户应用程序运行在用户自己的电脑上,对应于数据库服务器,可称为客户电脑,当需要对数据库中的数据进行任何操作时,客户程序就自动地寻找服务器程序,并向其发出恳求,服务器程序依据预定的规章作出应答,送回结果,应用服务器运行数据负荷较轻。(2)数据的储存管理功能较为透明。在数据库应用中,数据的储存管理功能,是由服务器程序和客户应用程序分别独立进行的,前台应用可以违反的规章,并且通常把那些不同的(不管是已知还是未知的)运行数据,在服务器程序中不集中实现,例如访问者的权限,编号可以重复、必须有客户才能建立定单这样的规章。全部这些,对于工作在前台程序上的最终用户,是“透明”的,他们无须过问(通常也无法干涉)背后的过程,就可以完成自己的一切工作。在客户服务器架构的应用中,前台程序不是格外“瘦小”,麻烦的事情都交给了服务器和网络。在C/S体系的下,数据库不能真正成为公共、专业化的仓库,它受到独立的专门管理。(3)C/S架构的劣势是昂扬的维护成本且投资大.首先,采纳C/S架构,要选择适当的数据库平台来实现数据库数据的真正“统一”,使分布于两地的数据同步完全交由数据库系统去管理,但规律上两地的操作者要直接访问同一个数据库才能有效实现,有这样一些问题,如果需要建立“实时"的数据同步,就必须在两地间建立实时的通讯连接,保持两地的数据库服务器在线运行,网络管理工作人员既要对服务器维护管理,又要对客户端维护和管理,这需要昂扬的投资和简洁的技术支持,维护成本很高,维护任务量大。2.2三层架构2。2.1什么是“三层架构”三层架构(3-tierapplication)通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务规律层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合"的思想。所谓三层体系结构,是在客户端与数据库之间加入了一个“中间层”,也叫组件层。这里所说的三层体系,不是指物理上的三层,不是简洁地放置三台机器就是三层体系结构,也不仅仅有B/S应用才是三层体系结构,三层是指规律上的三层,即使这三个层放置到一台机器上。三层体系的应用程序将业务规章、数据访问、合法性校验等工作放到了中间层进行处理.通常情况下,客户端不直接与数据库进行交互,而是通过COM/DCOM通讯与中间层建立连接,再经由中间层与数据库进行交互。2.2.2三层架构的优缺点优点:(1)开发人员可以只关注整个结构中的其中某一层;(2)可以很容易的用新的实现来替换原有层次的实现;(3)可以降低层与层之间的依靠;(4)有利于标准化;(5)利于各层规律的复用.缺点:(1)降低了系统的性能.这是不言而喻的.如果不采纳分层式结构,很多业务可以直接造访数据库,以此猎取相应的数据,如今却必须通过中间层来完成。(2)有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务规律层和数据访问层中都增加相应的代码。第3章需求分析3.1产品描述本产品是一款网络游戏.系统由服务端与客户端两个程序构成。采纳C/S构架方式实现。服务端主要业务:供应客户端恳求的服务、中转游戏数据等。而客户端供应友好的人机交互方式,供用户游戏平台,主要实现了最多6人一起游戏,依据以下挨次实现:进入游戏大厅、筹备开头游戏,如果有3个以上的客户端预备开头游戏,而限定时间内又没有新的客户端筹备开头,服务端就要求客户端开头游戏的倒计时,倒计时完成后,各玩家开头游戏。在游戏过程中,各玩家可以看到其它玩家的游戏进度的缩略图,但不允许增加新玩家,其它没有游戏的玩家只可以旁观游戏3.2产品功能模块功能说明服务端玩家信息管理积分管理在线用户管理游戏桌子管理游戏棋盘管理信息中转管理客户端注册新玩家登陆功能大厅扫瞄功能筹备与自动搜寻游戏功能游戏旁观功能各玩家地图缩略图积分排行连连看游戏规章3.3简略功能需求3.3.1服务器端:玩家信息管理引言:该功能实现玩家基础数据管理,包括玩家的游戏ID、姓名、密码、昵称、性别、生日、联系电话。这些数据是由客户端输入,玩家提交信息后,通过网络传输到服务端,服务端验证合法性后,自动生成一个新的游戏ID,告知客户端,并将该玩家的一系列信息存入对应数据库表中。输入处理输出游戏ID姓名昵称密码性别生日联系电话游戏ID是服务端自动生成给玩家的游戏编号,玩家登陆时用该编号登陆(编号位数不限,可以为1位也可以为任意位数值)姓名与昵称长度都不能超过8位,可以为字母空格汉字。密码长度5位,必需给出确认密码的输入(不限定字符,可为任意字符)性别:男、女生日形如:**年**月**日联系电话:7位或8位或11位或12位(12位时第一个数字必需是0)全部输入不按规章输入,均给出相应错误提示,提示要有针对性如果两次密码输入不全都,给用户一个友好提示,要求改正密码用‘*’输出3.3.2服务端:积分管理功能引言:服务端必需在每次游戏结束后,按各玩家游戏的进度情况,评出6个等级出来,分别加分6、3、1、0、-1、—2,并在玩家积分表加入对应的积分值,并在客户端能查看出积分排行情况,列出前10名的玩家信息.积分表包含:游戏ID(连连看游戏ID值暂定为1000)、玩家ID、积分输入处理输出各玩家游戏的进度1、服务端要求统计出各玩家所得分值1、服务端应将该次游戏的各玩家得到累计到对应积分表中客户端能查看积分在前10名的玩家排行榜3。3.3服务端:在线用户管理引言:服务端必需在列表视图里显示当前在线玩家,某玩家上线或下线必需实时更新列表。该列表内容包括玩家ID、昵称、玩家状态(空闲、旁观、正在游戏)输入处理输出实时更新在线用户列表,及相应玩家状态3。3。4服务器端:游戏桌子管理功能引言:游戏桌子数量暂定为1张,共6个位置,至少要3个人坐不同位置才可以开头游戏。服务端当监控到该桌子数量玩家数有3个以上,并在10秒内没有新玩家坐下,即可通知各坐下的客户端开头倒计时,开头倒计时后不允许新玩家再坐下空位置。如果各玩家主动都提出开头游戏,则可不用倒计时直接开头游戏.3。3.5服务器端:游戏棋盘管理引言:开头游戏提交后,服务端随机生成本次游戏的棋盘布局数据,大小为12*8,发送给各玩家。(注:共有12*8=96项数据,数据取值暂定16种,每种数据消灭6次)输入处理输出无随机生成大小为12*8的棋盘布局数据将棋盘数据发送给各玩家3。3.6服务器端:信息中转管理功能引言:对各玩家的相互通讯的信息,都要经过服务器中转.包含游戏中通讯的数据、私聊、群聊等信息3。3.7客户端:注册新玩家引言:该功能在客户端输入新玩家信息,包括玩家的姓名、密码、昵称、性别、生日、联系电话.玩家提交信息后,通过网络传输到服务端,服务端能过后,通知客户端生成一个新的玩家ID,并在界面里提示出输入处理输出姓名昵称密码性别生日联系电话姓名与昵称长度都不能超过8位密码长度5位,必需给出确认密码的输入性别:男、女生日形如:**年**月**日联系电话:7位或8位或11位或12位(12位时第一个数字必需是0)全部输入不按规章输入,均给出相应错误提示,提示要有针对性如果两次密码输入不全都,给用户一个友好提示,要求改正密码用‘*'输出注册成功与否要提示客户,如果成功则要给出新玩家的ID号3.3.8客户端:登陆功能引言:客户端启动程序后,要求客户输入玩家ID与密码,通过服务器验证后,如果存在该玩家且密码正确,则允许登陆,进入系统后,在界面上能直观看出当前玩家昵称。否则登陆失败提示登陆出错信息,不允许进入系统输入处理输出玩家ID密码对输入的数据进行合法验证(数据格式验证)1、登陆结果要给出提示,提示内容要人性化,合理3。3.9客户端:大厅扫瞄功能引言:客户端进入系统后,可以扫瞄到当前游戏的大厅,及桌子数。目前只有一个桌子,因此在客户端能看到当前一张桌子,及桌子6个座位的入座情况即可。3.3.10客户端:筹备与自动搜寻位置功能引言:客户端各玩家依据当前桌子的入座情况,选择一个空位置即可进入游戏状态,筹备开头游戏。在入座过程中,有一玩家比你先坐下,则要提示已有玩家入坐该位置。自动搜寻位置:该功能实现自动的搜寻出一空位置,提示玩家是否入座该位置。3。3.11客户端:游戏旁观功能引言:该功能实现游戏桌子已经开头游戏后,其它非游戏中的玩家,可以进入旁观游戏状态,扫瞄到各玩家游戏进度情况.但不能任何方式干扰正在游戏玩家3.3。12客户端:各玩家地图缩略图引言:在游戏过程中,当前玩家可以看到其它玩家的游戏进度,用地图缩略图的方式清楚看到对方游戏状态。3。3.13客户端:积分排行引言:任何玩家都可以由主界面的功能链接,查看到当前全服积分提在前10名玩家信息,显示玩家信息只要主要信息即可3.3。14连连看游戏规章与约定引言:哪个玩家最快连完全图,则得分最高,只要一玩家连完全图,则游戏结束.此时服务端依据各玩家连接图片数量,排出该次游戏名次出来,并提示各玩家得分情况重列功能:客户端供应连连看图片重列功能:重新放置剩下图片,可随机转变剩下图片位置与挨次,重列次数暂定为最多重列5次连击次数统计:当连接图片一次与上一次连接时间相差在1秒内认为是连击,并要累计连接最大数,并显示在界面上.当断连击后,下次连击要显示出上次连击的最大数,如本次连击了两个,上次最大数为12次,则显示:2/123.3。15连连看游戏特效引言:连接线特效:两张相像的图被消时,要在这两张图之间爆破连线(仿照QQ连连看效果)3.4协议设计3。4。1掌握消息UDP数据包格式名称内容描述长度VERSION0100协议版本2CMD_TYPEXx命令类型(00,01)1KEYWORDXx加密字段1COMMANDXxxx命令代码2SEQNUMXxxx数据包序号2UINXxxxxxxx发送方标识4PARAMETERS可变可选参数可变CMD_TYPE取值范围值含义00C->S01S-〉C3.4。2客户端到服务器端(C->S)UDP数据包名称代码描述CMD_KEEPALIVE0x01同学在线保持CMD_REG0x02用户注册CMD_LOGIN0x03用户登录CMD_SEND_LOG_DATE0x04向服务器恳求在线列表CMD_FANGJIAN_DATE0x05进入游戏房间CMD_CLOSE_DATE0x06关闭游戏CMD_KEEPALIVE名称内容描述长度HOST可变主机名称可变MACXxxxxxxxxxxxMAC地址63。4.3服务器端到客户端(S->C)UDP数据包名称代码描述SRV_LOGIN_OK0x01登录成功SRV_REG_OK0x02注册成功SRV_QUNLIAO_DATE0x03群聊信息SRV_GAME_OVER0x04游戏结束SRV_EXIT_TUPIAN0x05离开桌子SRV_YOUXI_KAISHI0x06游戏开头SRV_CHONGZHI0x07重置图片3.4。4数据库设计依据系统流程图对数据库进行设计(简略见第4章)。3.4.5简略设计进行了系统简略设计,并进行编码设计,完成了对多人对战平台(连连看)系统大部分功能模块的开发。(简略见第5章)。第4章总体设计4。1开发环境开发工具:MicrosoftVisualC++6.0数据库:MicrosoftAccess数据库4.2相关表设计图服务器类图客户端类图数据库表设计图:用户明细表:用户积分表玩家在线状态表在线状态明细表数据库关系图系统用例图注册功能流程图登录功能流程图恳求实时在线列表流程图坐下位置流程图筹备开头游戏流程图开头游戏流程图重置图片流程图小地图功能流程图谈天流程图实时更新图片流程图第5章简略设计由于是客户机/服务器模式,因此下列的功能都将是服务器和客户端对应的功能一起讲解5。1用户注册功能1、注册如图5。1。1图5.1.1注册首先,我们先来查看如何获得用户输入的数据ﻩﻩ为了保存用户的数据,我们需要定义变量进行接收: ﻩCStringﻩm_username;ﻩﻩCStringﻩm_nicheng; ﻩCStringﻩm_pass; ﻩCStringﻩm_two_pass; CStringﻩm_tel; ﻩCTimeﻩm_date;ﻩﻩintﻩ m_men; ﻩ接下来是处理和打包数据:ﻩﻩ先是推断用户是否有输入数据:ﻩBOOLMyReg::CheckNull(){ﻩUpdateData();ﻩif(m_username.IsEmpty()) { ﻩMessageBox("用户名不能为空!");ﻩﻩm_pEdit=(CEdit*)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_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_RADIO1);ﻩﻩ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();ﻩﻩUpdateData(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()==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;ﻩ} elseﻩ{ﻩﻩMessageBox(”你输入的电话的位数不正确,请重新输入!!");ﻩ m_pEdit=(CEdit*)this—>GetDlgItem(IDC_DIANHUA); ﻩm_pEdit—〉SetFocus();ﻩﻩm_tel.Empty(); ﻩUpdateData(FALSE); returnFALSE;ﻩ}ﻩreturnTRUE;}ﻩ当数据都验证成功之后,将调用下面函数发送至服务器端voidMyReg::OnOK(){ﻩ//TODO:Addextravalidationhere if(!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);ﻩstrcpy(m_reg。user_name,m_username);ﻩm_reg.sex=m_men;ﻩcharbuf[sizeof(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));//这里将数据发送到服务器}服务器端:服务器在接受到客户端的信息之后,将调用下面的函数进行处理: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.JExecuteWithoutRecordset(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,sizeof(REG_DATE));ﻩ ﻩsend_reg.id=n;ﻩﻩ send_reg。flag=EXEC_OK;ﻩﻩ charbuf[sizeof(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;ﻩﻩﻩsend_reg。flag=OTHER_ERROR;ﻩﻩﻩcharbuf[sizeof(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;ﻩ}}客户端:接收到服务器端发送回来的信息之后将成功或失败的信息显示出来,如果失败,将需要用户连续输入,如果成功,将提示成功信息,并返回到登陆界面。LRESULTMyReg::OnUserReg(WPARAMwParam,LPARAMlParam){……………。。ﻩ{ﻩﻩCStringstr;ﻩﻩstr。Format("注册成功\r\n登陆ID为:%d",m_reg。id);ﻩﻩMessageBox(str);ﻩ}ﻩelseﻩ{ﻩﻩMessageBox("注册失败");ﻩﻩ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); 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个变量接受用户输入的账号和密码的信息,定义如下:ﻩCStringﻩm_id;ﻩCStringﻩm_mima;ﻩﻩ当用户点击了登陆界面之后,将调用以下函数进行处理:ﻩvoidMyLogin::OnOK(){ﻩ//TODO:AddextravalidationhereﻩUpdateData(); LOGIN_DATEm_log; memset(&m_log,0,sizeof(LOGIN_DATE));ﻩm_log.user_name=atoi(m_id);ﻩstrcpy(m_log.password,m_mima);ﻩcharbuf[sizeof(LOGIN_DATE)+sizeof(int)+1];ﻩmemset(buf,0,sizeof(buf));ﻩsprintf(buf,”%04d”,LOGIN);ﻩ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_DATE m_log;ﻩmemset(&m_log,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.Format(”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)ﻩﻩ{ ﻩﻩcharbuf[10]={0}; sprintf(buf,"%04d%04d",LOGIN,REPEAT_LOGIN); ﻩsendto(m_sock。GetSock(),buf,10,0,(sockaddr*)&pData—>addr,sizeof(sockaddr_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);ﻩ charbuf[sizeof(int)+sizeof(XINXI)+1]={0}; sprintf(buf,”%04d",BAOCUN_XINXI);ﻩﻩchar*p=buf;ﻩﻩp+=4;ﻩﻩmemcpy(p,&m_xinxi,sizeof(XINXI));ﻩﻩsendto(m_sock。GetSock(),buf,sizeof(int)+sizeof(XINXI)+1,0,(sockaddr*)&pData->addr,sizeof(sockaddr_in));ﻩ//客户端保存相应的数据;ﻩ chararr[10]={0};ﻩﻩsprintf(arr,"%04d%04d”,LOGIN,EXEC_OK);ﻩﻩsendto(m_sock.GetSock(),arr,10,0,(sockaddr*)&pData-〉addr,sizeof(sockaddr_in));ﻩﻩﻩﻩcharbuf1[sizeof(int)+sizeof(XINXI)+1]={0};ﻩﻩsprintf(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昵称,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上线了!!\r\n",str,m_log。user_name);ﻩﻩm_xinxi_xianshi。ReplaceSel(str1);ﻩ m_xinxi_xianshi。SetSel(-1,-1);ﻩﻩ }ﻩelse {ﻩﻩcharbuf[10]={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){ﻩintlog=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(”您输入的用户名或密码不正确,请您重新输入!”);ﻩﻩ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游戏大厅客户端的大厅界面如图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(NMHDR*pNMHDR,LRESULT*pResult)//选择房间{ﻩ//TODO:Addyourcontrolnotificationhandlercodehere POINTpoint; 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;ﻩ ﻩﻩstr=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);ﻩﻩﻩ}ﻩﻩﻩelseﻩﻩﻩ{ ﻩﻩﻩMessageBox("你已经开启房间了”); ﻩﻩ}ﻩﻩﻩﻩﻩ}ﻩﻩ} *pResult=0;}界面中间的窗体显示的是游戏中积分排名前10名的玩家的信息,相关的函数如下:charbuf[sizeof(int)+1];ﻩmemset(buf,0,sizeof(buf));ﻩsprintf(buf,”%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){ﻩﻩcharbuf[DATA_SIZE]={0}; intx=0;ﻩRECORDSETrs=m_ado.JExecuteWithRecordset(”selecta.昵称as昵称,a.积分as积分,b.在线状态as状态fromaccount_zaixianasa,account_zhuangtaiasbwherea.在线ID=b。在线ID”);ﻩx=Pack_date(rs,buf);ﻩchararr[DATA_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));//将信息发送回客户端}intCMyDlg::Pack_date(RECORDSETrs,char*buf)ﻩ//检索信息{ﻩintn=0;ﻩCStringm_nicheng,m_zhuangtai; intm_jifen;ﻩXINXIm_xinxi;ﻩchar*p=buf;ﻩif(rs!=NULL)ﻩ{ ﻩwhile(!rs-〉rsEOF)ﻩﻩ{ﻩﻩﻩmemset(&m_xinxi,0,sizeof(XINXI));ﻩﻩ m_jifen=GIF(rs,”积分");ﻩ ﻩm_nicheng=GTF(rs,"昵称”); ﻩﻩm_zhuangtai=GTF(rs,"状态"); ﻩ strcpy(m_xinxi.nicheng,m_nicheng);ﻩ ﻩstrcpy(m_xinxi。zhuangtai,m_zhuangtai);ﻩﻩﻩm_xinxi.jifne=m_jifen;ﻩﻩ memcpy(p,&m_xinxi,sizeof(XINXI)); ﻩﻩp+=sizeof(XINXI);ﻩ ﻩn++;ﻩﻩ rs->MoveNext();ﻩ }ﻩﻩﻩ}ﻩreturnn;}客户端:客户端在接受到服务器发送回来的玩家信息的数据之后,调用下面的函数进行处理:LRESULTMyDating::OnUserUpdateList(WPARAMwParam,LPARAMlparm){ﻩm_list。DeleteAllItems();ﻩUPDATELISTm_updatelist;ﻩmemset(&m_updatelist,0,sizeof(m_updatelist));ﻩintx=0;ﻩchararr[10]={0}; char*p=(char*)wParam; memcpy(arr,p,4);ﻩp+=4;ﻩx=atoi(arr);ﻩfor(inti=0;i〈x;++i)ﻩ{ﻩﻩmemcpy((char*)&m_updatelist,p,sizeof(UPDATELIST)); ﻩp+=sizeof(UPDATELIST);ﻩﻩm_list.InsertItem(i,"2222222");ﻩ m_list.SetItemText(i,0,m_updatelist.m_id);ﻩ//显示信息 m_list.SetItemText(i,1,m_updatelist.m_nicheng);ﻩﻩm_list.SetItemText(i,2,m_updatelist。m_jifen);ﻩ}ﻩm_list.Invalidate(); return0;}界面右边的是当前在线的玩家以及谈天的信息,首先我们演示的是在线列表,代码如下:服务器端:首先客户端登录成功之后服务器端向其他客户端下发有人登陆的指令以及数据,charbuf1[sizeof(int)+sizeof(XINXI)+1]={0};ﻩ sprintf(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));ﻩﻩ}客户端收到服务器发送的信息之后显示在线列表:LRESULTCMyDlg::OnUserDating(WPARAMwParam,LPARAMlparm)ﻩ//更新list控件信息{ﻩm_list.DeleteAllItems();ﻩm_flag=0;ﻩcharbuf[10]={0}; chararr1[sizeof(XINXI)+1]={0};ﻩ char*p=(char*)wParam;ﻩ XINXIm_xinxi;ﻩmemcpy(buf,p,4);ﻩp+=4;ﻩmemset(&m_xinxi,0,sizeof(XINXI));ﻩCStringa;ﻩfor(inti=0;i<atoi(buf);i++) {ﻩ memcpy(arr1,p,sizeof(XINXI)); ﻩp+=sizeof(XINXI);ﻩﻩm_xinxi=*((XINXI*)arr1); ﻩm_list.InsertItem(i,”aaaa");ﻩﻩa.Format("%d",m_xinxi.jifne);ﻩ m_list.SetItemText(i,0,m_xinxi。nicheng);ﻩﻩm_list。SetItemText(i,1,a);ﻩﻩm_list.SetItemText(i,2,m_xinxi.zhuangtai);ﻩ}ﻩm_flag=i; m_list。Invalidate(); delete[](char*)wParam;ﻩreturn0;}接下来我们显示的是谈天的实现:客户端:首先玩家先将一条信息发送到服务器端:voidCMyDlg::OnButton1(){ //TODO:AddyourcontrolnotificationhandlercodehereﻩMyGlobalVariable*m_glb=MyGlobalVariable::GetMyGlobalVariable();ﻩUpdateData();ﻩcharbuf[1024]={0};ﻩsprintf(buf,"%04d%s说:%s”,QUNLIAO_DATE,m_glb->m_xinxi.nicheng,m_fasong);ﻩm_fasong="";ﻩUpdateData(FALSE);ﻩsendto(MySocket::m_socket,buf,strlen(buf),0,(sockaddr*)&MySocket::udp_addr,sizeof(sockaddr_in)); CEdit*pEdit=(CEdit*)this->GetDlgItem(IDC_FASONG);ﻩpEdit->SetFocus();ﻩ}服务器端在收到客户端的信息之后,将这条信息群发到连接到服务器上的全部客户端:voidCMyDlg::Qunliao_date(LPPER_IO_DATApData){ char*buf=newchar[15+strlen(m_buf)];ﻩmemset(buf,0,sizeof(buf));ﻩsprintf(buf,"%04d%04d%s",15+strlen(m_buf),QUNLIAO_DATE,m_buf);ﻩm_pushdeque。push_back(buf);}客户端在接收到服务器的谈天信息之后,将信息显示到谈天窗口中:LRESULTCMyDlg::OnUserQunliao(WPARAMwParam,LPARAMlparm){ﻩUpdateData(); m_xianshi。ReplaceSel((char*)wParam); m_xianshi.ReplaceSel(”\r\n”);ﻩm_xianshi.SetSel(-1,-1);ﻩdelete[](char*)wParam;ﻩ//UpdateData(FALSE);ﻩreturn0;}5.4游戏房间1、客户端的游戏房间界面如图5。2。2图5.2。2游戏房间我们先来查看自动寻位的功能:当玩家点击自动寻位的功能之后,系统会自动选择一个空闲的位置并让玩家坐下,同时向服务器发送位置已经坐下的信息:voidMyFangjian::OnButton7(){ﻩ//TODO:Addyourcontrolnotificationhandlercodehere if(m_zhuozi==1)ﻩ{ﻩ return; }ﻩif(m_user1==0)ﻩ{ OnButton1();ﻩﻩreturn;ﻩ} if(m_user2==0) { OnButton2(); ﻩreturn;ﻩ} if(m_user3==0) { ﻩOnButton3();ﻩﻩreturn;ﻩ}ﻩif(m_user4==0)ﻩ{ﻩﻩOnButton4();ﻩ return;ﻩ}ﻩif(m_user5==0) {ﻩﻩOnButton5();ﻩ return; } if(m_user6==0) {ﻩ OnButton6();ﻩ return; }}voidMyFangjian::OnButton6(){ //TODO:Addyourcontrolnotificationhandlercodehere if(m_zhuozi==1)ﻩ{ ﻩMessageBox("游戏已经开头,不能坐下!");ﻩﻩreturn;ﻩ}ﻩif(m_user6==1)ﻩ{ ﻩMessageBox(”该位置已经有人坐了,请不要重复坐下!"); ﻩreturn;ﻩ}ﻩm_flag=6;ﻩcharbuf[10];ﻩmemset(buf,0,sizeof(buf));ﻩsprintf(buf,"%04d%04d",BUTTON_DATE,m_flag);ﻩsendto(MySocket::m_socket,buf,10,0,(sockaddr*)&MySocket::udp_addr,sizeof(sockaddr_in));ﻩMyYouxi::GetWeizhi(m_flag); MyYouxim_youxi;ﻩm_youxi.DoModal();ﻩchararr1[sizeof(int)+sizeof(int)]={0};ﻩsprintf(arr1,”%04d%04d”,EXIT_YOUXI,m_flag); sendto(MySocket::m_socket,arr1,sizeof(int)+sizeof(int),0,(sockaddr*)&MySocket::udp_addr,sizeof(sockaddr_in));ﻩm_flag=0;}voidMyFangjian::OnButton1(){ //TODO:Addyourcontrolnotificationhandlercodehereﻩif(m_zhuozi==1) {ﻩ MessageBox("游戏已经开头,不能坐下!");ﻩ return;ﻩ}ﻩﻩif(m_user1==1)ﻩ{ ﻩMessageBox(”该位置已经有人坐了,请不要重复坐下!");ﻩ return;ﻩ}ﻩm_flag=1; charbuf[10]; memset(buf,0,sizeof(buf));ﻩsprintf(buf,"%04d%04d”,BUTTON_DATE,m_flag);ﻩsendto(MySocket::m_socket,buf,10,0,(sockaddr*)&MySocket::udp_addr,sizeof(sockaddr_in));ﻩMyYouxi::GetWeizhi(m_flag);ﻩMyYouxim_youxi; m_youxi.DoModal(); chararr1[sizeof(int)+sizeof(int)]={0};ﻩsprintf(arr1,"%04d%04d”,EXIT_YOUXI,m_flag); sendto(MySocket::m_socket,arr1,sizeof(int)+sizeof(int),0,(sockaddr*)&MySocket::udp_addr,sizeof(sockaddr_in)); m_flag=0;}voidMyFangjian::OnButton2(){ﻩ//TODO:Addyourcontrolnotificationhandlercodehere if(m_zhuozi==1)ﻩ{ ﻩMessageBox("游戏已经开头,不能坐下!");ﻩ return;ﻩ}ﻩif(m_user2==1)ﻩ{ﻩﻩMessageBox("该位置已经有人坐了,请不要重复坐下!");ﻩﻩreturn;ﻩ}ﻩ…………….。 MyYouxi::GetWeizhi(m_flag);ﻩMyYouxim_youxi;ﻩm_youxi.DoModal(); chararr1[sizeof(int)+sizeof(int)]={0}; sprintf(arr1,"%04d%04d”,EXIT_YOUXI,m_flag);ﻩsendto(MySocket::m_socket,arr1,sizeof(int)+sizeof(int),0,(sockaddr*)&MySocket::udp_addr,sizeof(sockaddr_in));ﻩm_flag=0;}voidMyFangjian::OnButton3(){ﻩ//TODO:Addyourcontrolnotificationhandlercodehereﻩif(m_zhuozi==1)ﻩ{ﻩ MessageBox("游戏已经开头,不能坐下!”);ﻩﻩreturn; }ﻩif(m_user3==1)ﻩ{ﻩ MessageBox(”该位置已经有人坐了,请不要重复坐下!"); ﻩreturn;ﻩ}ﻩm_flag=3;ﻩcharbuf[10]; memset(buf,0,sizeof(buf));ﻩsprintf(buf,”%04d%04d",BUTTON_DATE,m_flag);ﻩsendto(MySocket::m_socket,buf,10,0,(sockaddr*)&MySocket::udp_addr,sizeof(sockaddr_in));ﻩﻩMyYouxi::GetWeizhi(m_flag);ﻩMyYouxim_youxi;ﻩm_youxi.DoModal(); chararr1[sizeof(int)+sizeof(int)]={0};ﻩsprintf(arr1,"%04d%04d”,EXIT_YOUXI,m_flag);ﻩsendto(MySocket::m_socket,arr1,sizeof(int)+sizeof(int),0,(sockaddr*)&MySocket::udp_addr,sizeof(sockaddr_in)); m_flag=0;}voidMyFangjian::OnButton4(){ﻩ//TODO:Addyourcontrolnotificationhandlercodehereﻩif(m_zhuozi==1) {ﻩﻩMessageBox("游戏已经开头,不能坐下!");ﻩﻩreturn;ﻩ}ﻩif(m_user4==1)ﻩ{ MessageBox("该位置已经有人坐了,请不要重复坐下!");ﻩ return;ﻩ}ﻩm_flag=4;ﻩcharbuf[10];ﻩmemset(buf,0,sizeof(buf));ﻩsprintf(buf,”%04d%04d",BUTTON_DATE,m_flag);ﻩsendto(MySocket::m_socket,buf,10,0,(sockaddr*)&MySocket::udp_addr,sizeof(sockaddr_in));ﻩMyYouxi::GetWeizhi(m_flag);ﻩMyYouxim_youxi;ﻩm_youxi.DoModal();ﻩchararr1[sizeof(int)+sizeof(int)]={0};ﻩsprintf(arr1,"%04d%04d",EXIT_YOUXI,m_flag); sendto(MySocket::m_socket,arr1,sizeof(int)+sizeof(int),0,(sockaddr*)&MySocket::udp_addr,sizeof(sockaddr_in));ﻩm_flag=0;}voidMyFangji
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 边缘计算节点运维工程师考试试卷及答案
- 2026届山大附属中学高三模拟版化学试题(10-6)含解析
- 2026届河南省南阳市重点中学高三5月第一次阶段性测试化学试题含解析
- 2026届北京市顺义区、通州区第二学期高三第一次模拟考试化学试题含解析
- 2026届湖北省武汉市江夏一中高三第一次全国大联考化学试题卷含解析
- 专题05 力学实验和电学实验(2大考点)(教师版)
- 上海普陀区2026届招生全国统一考试考试说明跟踪卷(二)化学试题含解析
- 老年慢性病患者的用药依从性影响因素分析
- 当前内镜报告结构化面临的技术挑战与对策
- 超市供货合同
- 2025湖北随州国有资本投资运营集团有限公司人员招聘27人笔试历年参考题库附带答案详解
- 《分析人类活动对生态环境的影响》生物教学课件
- 2026江苏有线常熟分公司招聘人岗相适度测评笔试及笔试历年参考题库附带答案详解
- 刑事证据审查手册
- 医疗器械经营质量管理制度、工作程序文件目录
- 第五版-FMEA-新版FMEA【第五版】
- 某工程甘肃段地质灾害危险性评估报告
- 河北大学版小学五年级信息技术教案
- GB/T 30727-2014固体生物质燃料发热量测定方法
- GB/T 2828.10-2010计数抽样检验程序第10部分:GB/T 2828计数抽样检验系列标准导则
- 航空气象-102雷达回波的识别课件
评论
0/150
提交评论