资源描述
河北农业大学
本科毕业论文(设计)
题 目: 网络对战游戏平台
摘要
电脑游戏行业经过二十年的发展,已经成为与影视、音乐等并驾齐驱的全球最重要的娱乐产业产业之一,其年销售额超过好莱坞的全年收入。近年来,随着互联网在全球范围内的发展和普及,联网游戏作为一种娱乐手段,正以独特的魅力吸引着越来越多的玩家。互联网的出现为电脑游戏行业发展注入的新的活力,凭借信息双向交流、速度快、不受空间限制等优势,让真人参与游戏,提高游戏的互动性、仿真性和竞技性,使玩家在虚拟世界里可以发挥显示世界无法展现的潜能,改变的单机版游戏固定、代办、与机器对话的状况。
本文介绍了该系统的开发背景、意义及国内外现状,然后重点阐述利用C++、MFC、MySql开发网络游戏平台系统的过程。包括设计与实现环节,并且通过测试分析总结出该系统的功能特点。
本系统主要完成以下几个方面的功能,1.用户管理:包括对用户注册、登录和游戏信息的管理。2.游戏大厅:包括游戏房间和聊天的控制。3.五子棋游戏:游戏房间内进行的网络对战游戏。
关键字:网络游戏平台、五子棋、C++、MFC、MySql
Abstract
After two decades of development, the computer game industry has become one of the film, music and other entertainment industry to keep pace with the world's most important industry, with annual sales of more than Hollywood's annual income. The emergence of the Internet as a new vitality into the development of the computer game industry, with two-way exchange of information, speed, not restricted by space and other advantages, so that the real person involved in the game, to improve interactive games, simulation and athletic, the players in the virtual the world where you can play the world can not show the potential to change the stand-alone version of the game is fixed, the status of the dialogue with the machine.
This article describes the development of the system background, significance and status quo at home and abroad, and then focuses on the use of C + +, MFC, MySql development of online games platform system process. Design and Implementation of links, and summed up by test and analysis features of the system.
This system is mainly complete the following aspects,1.user management: including user registration, login and game information management. 2.game lobby: control include a games room and chat.3.Backgammon game: game room online play game.
Keywords: Online game platform, Backgammon C++, MFC, MySql
目录
摘要 2
Abstract 1
目录 1
1.绪论 1
1.1研究背景与意义 1
1.2国内外研究现状 1
1.3 研究内容与目标 1
2.理论技术基础 2
2.1理论基础 2
2.2技术基础 2
2.2.1 C++语言简介 2
2.2.2 MFC类库简介 3
2.2.3 MYSQL数据库 3
2.2.4 面向对象程序设计简介 3
2.2.5 TCP与UDP协议简介 3
2.2.6 SOCKET通信机制简介 4
3.系统的分析与设计 4
3.1需求分析 4
3.1.1可行性分析 4
3.1.2系统功能分析 4
3.2总体设计 5
3.2.1网络游戏平台功能设计 5
3.2.2登录注册模块设计 5
3.2.3游戏大厅模块设计 6
3.2.4.五子棋游戏模块设计 6
3.2.5.服务器模块设计 6
3.2.6.数据库模块设计 6
3.3系统详细设计 6
3.3.1注册登录模块详细设计 6
3.3.2游戏大厅模块详细设计 7
3.3.3五子棋模块详细设计 8
3.3.4服务器模块详细设计 9
3.3.5数据字典 10
3.3.6表结构说明 11
4.系统的实现 11
4.1用户的注册与登录 11
4.1.1用户登录 11
4.1.2用户注册 11
4.2游戏大厅模块 12
4.2.1更新游戏房间信息 12
4.2.2大厅内玩家聊天 12
4.2.3显示所有玩家信息 13
4.3五子棋游戏模块 13
4.3.1绘制五子棋棋盘 13
4.3.2绘制棋子 14
4.3.3判断胜负 14
4.3.4悔棋 15
4.3.5求和 15
4.4服务器模块 16
4.4.1接收客户端连接 16
4.4.2验证客户端注册和登录信息 17
4.4.3 转发聊天信息 17
4.4.4 转发和处理游戏信息 18
4.4.5 通知更新房间信息和用户信息 18
5.总结 19
致谢 20
参考文献 21
1.绪论
1.1研究背景与意义
在互联网迅速发展的今天,互联网应用到了各行各业之中。网络游戏与以往的游戏发展演变之路不同,他不再单单的表现为游戏设备的差异,进而体现了游戏传输载体以及游戏参与方式的变革。纵观目前全球的游戏产业,网络游戏正走向成熟和深化,技术融合带来游戏跨平台发展,通过网络、个人电脑、手持终端设备等都可以进行互动游戏,不同的设备可以通过网络运行相同的游戏。
随着互联网的扩张和基于互联网应用的发展,联网游戏正以一种独特的魅力吸引着越来越多的玩家,尤其是五子棋游戏更是得到广大玩家的青睐。因此,开发基于C/S模式的网络五子棋游戏具有重要的显示意义。
1.2国内外研究现状
电脑游戏自1972年由威尔•克劳舍(Will•Crowther)编写的一段简单的FORTRAN程序开始。由于网络游戏需要较大量运算以及网络传输容量,因此早期网络游戏通常以纯文字讯息作为呈现方式,重视玩家与玩家间的互动,而非声光效果。 随着电脑硬件及软件技术的进步,网络游戏服务器逐渐出现在小型的工作站服务器,并且受到学生族群的欢迎,其中尤以MUD最具代表性。与此同时,传统的单机游戏也开始出现利用局域网路进行小规模连线(2-8人)的形式,但多数以射击或即时战略游戏为主,这类型网络游戏进行时,需要交换数量惊人的同步讯息,因此通常较适合高速的局域网路,难以实现人数规模更庞大的网络游戏。1990年代中期,游戏产业开始采用类似MUD架构的技术发展网络游戏。此类架构不同于依赖高速局域网路连线的射击或即时战略游戏,取而代之的是借由最佳化的通讯协定及复杂的预测式算法,来达成网络游戏所需的资讯同步。这类型的游戏与MUD一样,需要居中运算的游戏服务器,并且能够实现万人以上同时连线进行游戏的规模。这种类型的游戏后来被统称为大型多人线上游戏。大型多人线上游戏由于玩家人数和规模庞大的关系,通常属于角色扮演游戏类型。
就国内的发展来看,最近些年内的游戏公司如雨后春笋般的成立,所开发或代理的网络游戏更是不胜枚举。国内的游戏娱乐产业正处于起步阶段,特点表现为:第一,他是一种文化的传播。娱乐产业可以潜移默化地改变人与人的观念。第二,网络游戏加强了人与人的沟通。第三,网络游戏具有一定的教育意义。
1.3 研究内容与目标
本网络游戏对战平台主要包括用户管理、平台管理和五子棋游戏三个部分,本次研究的内容为实现一个网络对战平台系统,系统包括有用户的登录和注册,游戏房间的管理和每个房间内进行的游戏。系统分为客户端和服务器端,客户端主要是玩家发送游戏和聊天信息并处理服务器到本地的各种消息,服务器端主要是接收客户端请求,并对客户端的请求进行相应的处理。
2.理论技术基础
2.1理论基础
网络游戏:英文名称为Online Game,又称 “在线游戏”,简称“网游”。指以互联网为传输媒介,以游戏运营商服务器和用户计算机为处理终端,以游戏客户端软件为信息交互窗口的旨在实现娱乐、休闲、交流和取得虚拟成就的具有可持续性的个体性多人在线游戏。网络游戏区别与单机游戏而言的,是指玩家必须通过互联网连接来进行多人游戏。 一般指由多名玩家通过计算机网络在虚拟的环境下对人物角色及场景按照一定的规则进行操作以达到娱乐和互动目的的游戏产品集合。
游戏对战平台是对Internet用户提供多人电脑游戏联机服务,它可以让在互联网的游戏玩家轻松的通过Internet进行游戏,就如果在同一个局域网中一样。平台通过网络协议转换技术,将互联网上远隔千里的玩家紧紧的联系到一起,并且还提供给用户实时的交流与沟通。
五子棋是一种两人对弈的纯策略型棋类游戏,棋具与围棋通用,是起源于中国古代的传统黑白棋种之一。发展于日本,流行于欧美。容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
2.2技术基础
2.2.1 C++语言简介
C++是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。
C++是由C发展而来的, 与C兼容。用C语言写的程序基本上可以不加修改地用于C++, 从C++的名字可以看出它是C的超越和集中。C++既可用于面向过程的结构化程序设计, 又可用于面向对象的程序设计, 是一种功能强大的混合型的程序设计语言。
C++对C的“增强”,表现在六个方面:
(1) 类型检查更为严格。
(2) 增加了面向对象的机制。
(3)增加了泛型编程的机制(template)
(4)增加了异常处理
(5)增加了运算符重载
(6)增加了标准模板库(STL)
面向对象程序设计,是针对开发较大规模的程序而提出来的,目的是提高软件开发的效率。不要把面向对象和面向过程对立起来, 面向对象和面向过程不是矛盾的,而是各有用途、互为补充的。
2.2.2 MFC类库简介
MFC(Microsoft Foundation Classes),是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
2.2.3 MYSQL数据库
MySQL是最受欢迎的开源SQL数据库管理系统,它由MySQL AB开发、发布和支持。MySQL AB是一家基于MySQL开发人员的商业公司,它是一家使用了一种成功的商业模式来结合开源价值和方法论的第二代开源公司。MySQL是MySQL AB的注册商标。MySQL是一个快速的、多线程、多用户和健壮的SQL数据库服务器。MySQL服务器支持关键任务、重负载生产系统的使用,也可以将它嵌入到一个大配置(mass-deployed)的软件中去。
2.2.4 面向对象程序设计简介
面向对象程序设计(英语:Object-oriented programming,缩写:OOP),指一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的集合。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
面向对象程序设计可以看作一种在程序中包含各种独立而又互相调用的对象的思想,这与传统的思想刚好相反:传统的程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对电脑下达的指令。面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”,即对象。
2.2.5 TCP与UDP协议简介
TCP协议是端点与端点之间建立持续的连接而进行通信。建立连接后,发送端将发送的数据以字节流的方式发送出去;接收端则按序列顺序将数据整理好,数据在需要时可以重新发送。TCP协议具有可靠性和有序性,并且以字节流的方式发送数据,是一种面向连接的协议。
UDP协议是一种无连接的传输协议。利用UDP协议进行数据传输时,首先需要将要传输的数据定义成数据报(Datagram),在数据报中知名数据所有达到的端点(Socket,主机地址和端口号),然后再将数据报发送出去。这种传输方式是无序的,也不能确保绝对的安全可靠,但他很简单而且具有比较高的效率。
2.2.6 SOCKET通信机制简介
SOCKET是网络上运行的两个程序之间双向通信链路的终端点,他是TCP和UDP的基础。一个SOCKET被绑定到一个端口号上,这样传输层能后识别数据要发送到那个应用程序。Socket连接可以分成三个基本的类型,这三个类型是:
(1)客户端连接
客户端连接是一个本地系统的客户端socket与一个远程系统上的服务端Socket连接。客户端连接由客户端Socket开始。首先,客户端 Socket必须描述它想连接到的服务端Socket. 接着客户端socket查找服务端socket,当找到服务器时,就要求连接。服务端socket可能不能完成正确的连接。服务器sockets维持一个 客户端请求队列,在他们有时间时完成连接。当服务端socket接受客户端连接,服务端socket
将向它想连接的客户socket发送一个完整的描述,客户端的连接完成。
(2)倾听连接
服务器 socket不会去定位客户端,代替的,他们形成被动的,"半连接"状态,倾听来自客户端的请求。服务器 sockets形成一个队列,存放 它们听到的连接请求。这个队列记录着客户端连接请求就象他们已连接进来一样。当服务器sockets同意客户连接请求时,它形成一个新的socket去连 接客户端,因此这个倾听连接能保持开放状态允许其他客户端请求。
(2)服务端连接
当倾听socket同意一个客户端请求时,服务器端socket形成一个服务器连接。当服务器端同意连接时,向客户端发送一个服务端socket描述以完 成连接,当客户端socket收到这个描述时这个连接得到确认,连接完成。一但连接到客户端的Socket完成,服务端连接就不能识别从一个客户端来的连 接。末端双方有同样的能力去接收同样的事件类型。只有倾听(listening)连接是根本不同的,它只有一个单一的末端。
3.系统的分析与设计
3.1需求分析
3.1.1可行性分析
(1)经济可行性:经济可行性包括两个方面的内容:一是某一备选方案占有和使用经济资源的可能性,进而实现政策目标的可能性;二是实施某一政策方案所需花费的成本和取得的收益。作为毕业设计,我们所受到的效益,应该说是受益终生,花费则寥寥无几。
(2)技术可行性:技术可行性是指决策的技术和决策方案的技术不能突破组织所拥有的或有关人员所掌握的技术资源条件的边界。整个系统使用微软官方的MFC标准类库,遵守面向对象编程规范。
(3)法律可行性:本系统不以盈利为目的,而且使用的免费的C++语言和MySql数据库,不存在违反法律问题。
(4)操作可行性:本系统操作简单,游戏玩法多样,运行环境要求低。
3.1.2系统功能分析
本系统主要包括五子棋游戏、游戏平台和服务器三个模块:
(1)五子棋游戏模块主要实现的功能是可以从游戏大厅启动。两个玩家可以进行游戏,其它玩家允许观看游戏。同一游戏室中的所有玩家可以进行文字聊天,游戏界面中要求显示所有玩家的相关信息。可以具有求和、悔棋功能。
(2)游戏大厅模块游戏大厅包括用户的注册、登录等功能。游戏大厅应可以查看当前已登录用户的所有信息及其状态(空闲、正在游戏、正在观看游戏),游戏大厅下可设游戏室,每个游戏室进行一盘五子棋游戏。可以查看各个游戏室的状态(正在游戏、等待游戏、空闲),可以查看游戏室中的玩家的信息。对于空闲的游戏室玩家可以进入等待其它玩家,等待游戏状态的游戏室玩家可以进入开始游戏,正在游戏的游戏室玩家只能进入观看游戏。
(3)服务器模块主要实现包括接受客户端请求和数据,储存每个用户的游戏成绩,即总游戏局数,胜负平的局数,胜率等。
3.2总体设计
3.2.1网络游戏平台功能设计
网络游戏平台系统具有用户注册和登录功能,用户登录成功后,可以进行单人游戏和多人游戏。在多人游戏中有玩家和观看者,平台具有储存用户相关战绩信息的功能。网络游戏平台模块如图3-1:
图3-2.系统模块图
3.2.2登录注册模块设计
网络游戏平台登录注册模块主要包括注册和登录功能。注册用户时如果用户名存在则注册失败,返回重新注册,用户名不存在时则注册成功,直接进入到游戏平台界面。用户登录时如果用户名密码正确则进去到游戏平台界面,否则重新登录。
3.2.3游戏大厅模块设计
游戏大厅主要包括多人游戏、单人游戏、聊天三个部分。每个游戏房间内有一局多人游戏,多人游戏中包括玩家和观看者两种角色,在同一个游戏房间的所有玩家可以进行聊天,一局游戏结束之后相关胜负战绩将储存到服务器端,在游戏大厅内需要显示本人和所有在线玩家的信息。
3.2.4.五子棋游戏模块设计
五子棋游戏模块主要是对五子棋游戏的棋盘和棋子进行绘制,在玩家下棋后可以悔棋和求和,游戏具有判断游戏胜负的功能。五子棋游戏单人模式中,对战AI的下棋算法为当对方有三连及以上时便阻碍,否则增加自己的布局。判断胜负算法为在最后一个下棋位置为中心向周围的方向辐射来计算。
3.2.5.服务器模块设计
服务器接收客户端发送的聊天信息,公聊信息发送到所有客户端,私聊信息发送到指定客户端。服务器接收客户端发送的游戏信息,对于不同的游戏信息有不同的处理。服务器具有对各客户端发送通知的功能。
3.2.6.数据库模块设计
网络游戏平台数据库模块设计主要是对用户信息管理数据表。
user表{用户名,密码,胜利局数,失败局数,平局局数}
user表的E-R图如图3-2:
图3-2.user表E-R图
3.3系统详细设计
3.3.1注册登录模块详细设计
注册登录界面详细设计主要包括验证注册信息和验证登录信息两个部分。
(1) 验证注册信息
验证注册信息主要包括判断用户名是否存在、两次输入密码是否相同。验证注册信息成功后进入游戏平台主界面,验证注册信息失败重新注册。
(2) 验证登录信息
验证登录信息主要包括判断用户名和密码是否正确。验证登录信息成功后进入游戏平台主界面,验证登录信息失败后重新登录。
网络游戏平台登陆注册模块中的主要模块结构如下图3-3所示:
图3-3.登录注册模块图
3.3.2游戏大厅模块详细设计
游戏大厅模块详细设计主要包括更新游戏房间信息、大厅内玩家聊天、显示本人信息、显示其他玩家信息。
(1) 更新游戏房间信息
根据服务器端存储的各个房间的游戏状态(空闲、等待游戏、正在游戏)更新本地游戏房间的状态。
(2) 大厅内玩家聊天
所有在大厅里面的玩家可以进行聊天,聊天分为公聊和私聊。
(3) 显示本人信息
在游戏大厅显示本人的信息,包括用户名、胜场数、负场数、平局数、胜率。
(4) 显示其他玩家信息
在游戏大厅界面显示其他玩家的信息,包括用户名、胜场数、负场数、平局数、胜率。
网络游戏平台游戏大厅模块设计图如图3-4。
图3-4.游戏大厅模块
3.3.3五子棋模块详细设计
五子棋模块详细设计主要包括绘制游戏棋盘、判断下棋位置、绘制棋子、判断胜负关系。
(1) 绘制游戏棋盘
绘制一个15*15大小的棋盘。
(2) 判断下棋位置
根据鼠标点击的坐标计算下棋的位置,如果坐标不在棋盘内部,则不绘制棋子。
(3) 绘制棋子
如果鼠标点击的位置经过判断之后位于棋盘内,绘制相应颜色的棋子。
(4) 判断胜负关系
每下完一个棋子之后根据当前所有棋子的位置判断是否分出胜负,如果分出胜负,则不在允许下棋,否则继续游戏。
网络游戏平台五子棋游戏模块设计如图3-5。
图3-5.五子棋游戏模块设计
3.3.4服务器模块详细设计
服务器模块详细设计主要包括接收客户端连接、验证客户端注册和登录信息、转发聊天信息、转发游戏信息、通知更新房间信息、通知更新用户信息、用户退出平台管理、用户进入和退出游戏房间管理、玩家战绩管理。
(1) 接收客户端连接
服务器端可以一直接收不同客户端的连接请求。
(2) 验证客户端注册和登录信息
对客户端发送的注册和登录信息进行分别处理。
(3) 转发聊天信息
对客户端发送的公聊和私聊信息进行相应的转发。对游戏房间内的公聊和私聊信息进行相应的转发。
(4) 转发和处理游戏信息
客户端发送的游戏信息对位于游戏房间内的其他玩家转发,并对游戏信息进行处理。
(5) 通知更新房间信息和用户信息
服务器端定时通知所有在线客户端更新房间信息和所有玩家信息。
(6) 用户进入和退出游戏房间管理
用户进入和退出游戏房间后服务器端要对所有相应游戏房间内的其他玩家进行通知,并且根据游戏房间内的游戏状态更新每个客户端的游戏房间信息。
网络游戏平台服务器模块设计如图3-6。
图3-6.服务器模块图
3.3.5数据字典
本系统的数据字典如下:
数据文件:用户信息表
文件组成:id、用户名、密码、胜场数、负场数、平局数
数据项:id
数据类型:整型数据
长度:10
数据项:用户名
数据类型:可变字符
长度:10
数据项:密码
数据类型:可变字符
长度:16
数据项:胜利局数
数据类型:整型数据
长度:10
数据项:失败局数
数据类型:整型数据
长度:10
数据项:平局局数
数据类型:整型数据
长度:10
3.3.6表结构说明
根据逻辑关系模型可直接设计基于某种数据库管理系统支持的物理结构,我们知道关系数据库是由表构成的,依据用户信息在数据库中建立相应的表。表结构如表1所示。
表1.学生信息数据表
字段名
数据类型
长 度
主键/外键
id
Int
10
主键
用户名
Varchar
10
否
密码
Varchar
16
否
胜利局数
Int
10
否
失败局数
Int
10
否
平局局数
Int
10
否
4.系统的实现
4.1用户的注册与登录
4.1.1用户登录
本系统在登录界面可以输入主机地址、用户名、密码。点击登录按钮进行登录,成功后进去游戏平台界面,点击取消按钮取消登录操作,点击注册按钮弹出注册界面。登陆界面如下图4-1所示:
图4-1.登陆界面
4.1.2用户注册
如果用户没有登陆账号密码,点击登录界面的注册按钮弹出注册界面。注册界面中可以输入服务器IP、昵称、密码、密码确认。两次密码输入必须相同才可以进行注册,注册成功后跳转到游戏平台界面。注册界面如下图4-2:
图4-2.用户注册
4.2游戏大厅模块
4.2.1更新游戏房间信息
客户端要接收服务器定时发送的房间更新信息对所有房间信息进行更新,游戏平台内所有房间有三种状态:房间空闲、正在等待、正在游戏。没有玩家在游戏房间时,房间状态为空闲,有一名玩家进入后房间状态为正在等待。两名玩家以上进入房间后房间状态为正在游戏。更新房间状态如下图4-3:
图4-3.房间更新状态
4.2.2大厅内玩家聊天
游戏平台提供了聊天功能,可以选择“所有人”进行公聊,也可以选择特定玩家进行私聊。聊天界面如图4-4。
图4-4.管理员查询学生
4.2.3显示所有玩家信息
游戏大厅内可以显示本人和其他在线玩家的信息。玩家信息包括:用户名、状态、胜场、负场、平场、胜率。玩家状态包括:游戏和大厅。显示在线玩家信息界面如下图4-5:
图4-5.在线玩家信息界面
显示本人信息界面如下图4-6:
图4-6.本人信息界面
4.3五子棋游戏模块
4.3.1绘制五子棋棋盘
绘制一个15*15的棋盘,背景颜色为RGB(175,255,180)到RGB(115,220,200)的渐变颜色,绘制了天元等点。棋盘界面如图4-7。
图4-7.棋盘界面
4.3.2绘制棋子
根据鼠标点击位置判断位置是否在棋盘内,如果判断结果在棋盘内,则在指定位置绘制指定颜色的棋子,否则不进行处理。下棋界面如图4-8。
图4-8.下棋界面
4.3.3判断胜负
每次下一个棋子之后判断胜负,以当前棋子为中心判断它的所有方向内是否有五个相同颜色棋子连成一线,如果存在五个相同颜色棋子连成一线则分出胜负,客户端发送胜负关系到服务器,否则继续下棋直到分出胜负。判断胜负界面如图4-9。
图4-9.判断胜负界面
4.3.4悔棋
在下棋之后可以点击悔棋按钮悔棋一步,轮到本人下棋之后不能进行悔棋。客户端悔棋后向服务器发送悔棋消息代码如下:
Message msObj;
memset(&msObj,0,sizeof(Message));
msObj.iType = INGAME;
msObj.iSubType = REGRET;
CString strTemp = theApp.m_skMainSocket.GetUserName();
int iLen = strTemp.GetLength();
lstrcpy(msObj.strName,strTemp.GetBuffer(iLen));
CString piecePos;
piecePos.Format(_T("%ld|%ld"),lastChess.x,lastChess.y);
lstrcpy(msObj.strContent ,piecePos.GetBuffer(iLen));
theApp.m_skMainSocket.Send(&msObj,sizeof(Message));
m_isTurn = ISTURN;
m_isCanRegret = DONOTREGRET;
4.3.5求和
玩家可以点击求和按钮进行求和,对方同意后本局游戏结束,客户端发送游戏平局消息到服务器,下一局游戏重新开始,否则继续进行本局游戏。求和界面如图4-10。
图4-10.求和界面
4.4服务器模块
4.4.1接收客户端连接
服务器端创建SOCKET能够随时接收客户端的连接请求。服务端程序需要判断指定端口是否可用,如果可用创建SOCKET。服务器端创建SOCKET并监听相应的端口的代码如下:
if (m_port < 1024){
AfxMessageBox("请输入用户端口号");
return;
}
else if (m_port > 66000){
AfxMessageBox("此端口不提供使用");
return;
}
else{
if(m_port > 1024 && m_port <= 66000){
if(!m_ServerSocket.Create(m_port)){
AfxMessageBox("创建端口失败!");
return;
}
if(!m_ServerSocket.Listen()){
AfxMessageBox("监听失败!");
return;
}
}
}
4.4.2验证客户端注册和登录信息
玩家从客户端的登录和注册信息由服务器端完成验证,登录信息验证成功后登录到游戏大厅,失败退出登录。注册信息验证成功后登录到游戏平台界面,失败重新注册。服务器端登录信息验证程序主要代码如下:
CString cmdStr;
cmdStr.Format("SELECT count(*) as COUNT_NAME FROM `user` WHERE name = '%s' AND password = '%s';",strUserName,strClientName);
if(!mysql_query(&theApp.mysql,cmdStr))
{
MYSQL_RES *result;
MYSQL_ROW row;
result=mysql_use_result(&theApp.mysql)
row=mysql_fetch_row(result);
count = row[0];
mysql_free_result(result);
}
4.4.3 转发聊天信息
服务器端对客户端发送的消息进行分析,将游戏相关信息和聊天信息进行区分,提取相关聊天消息。服务器端对于客户端发送的公聊转发给所有在线用户,私聊信息发送给消息中指定的用户。公聊信息转发的主要代码如下:
CPtrList * m_pClientList = theApp.m_pClientSocketList;
int iCount = m_pClientList->GetCount();
POSITION pos = m_pClientList ->GetHeadPosition();
if(pos)
{ for(int i = 0; i < m_pClientList ->GetCount(); i++)
{
CClientSocket *m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));
CString strName = m_pClientSocket ->GetUserName();
if(strName != strUserName )
{
m_pClientSocket->Send(&m_Message,sizeof(Message));
}
}
4.4.4 转发和处理游戏信息
服务器端对客户端发送的消息进行分析,将游戏相关信息和聊天信息进行区分,提取相关游戏消息。服务器将客户端发送的游戏信息转发给同房间内所有玩家,并对游戏的胜负信息进行记录。服务器转发游戏信息的主要代码如下:
Message msObj1;
memset(&msObj1,0,sizeof(Message));
msObj1.iType = INGAME;
msObj1.iSubType = GETCHESS;
CString strTemp= m_Message.strContent;
int len = strTemp.GetLength();
lstrcpy(msObj1.strContent,strTemp.GetBuffer(len));
m_gClientSocket->Send(&msObj1,sizeof(Message));
4.4.5 通知更新房间信息和用户信息
服务器端接收所有房间信息和用户信息的变化,每隔特定时间向客户端发送更新消息,使客户端进行房间信息和用户信息的更新。通知客户端进行用户信息更新的主要代码如下:
Message m_Message;
memset(&m_Message,0,sizeof(Message));
m_Message.iType = INFOREFRESH;
m_Message.iSubType = PLAYERSINFO;
userInfoStr = userInfoStr.Left(userInfoStr.GetLength() - 1);
int len2 = userInfoStr.GetLength();
lstrcpy(m_Message.strContent,userInfoStr.GetBuffer(len2));
CPtrList * m_pClientList = theApp.m_pClientSocketList;
pos = m_pClientList ->GetHeadPosition();
if(pos)
{ for(int i = 0; i < m_pClientList ->GetCount(); i++)
{
CClientSocket *m_pClientSocket = static_cast < CClientSocket *>(m_pClientList->GetNext(pos));
CString strName = m_pClientSocket ->GetUserName();
CString info;
theApp.m_UserInfoMap.Lookup(strName,info);
m_pClientSocket->Send(&m_Message,sizeof(Message));
}
}
5.总结
在整个软件开发过程中,网络给了我很大的帮助。图书让我对C++形成了系统的认识,网络则让我得以针对性地解决问题。碰到具体的技术问题,翻阅文献太慢,便只能从网络寻求解决办法。
虽然这个软件能正常运行,但是我认为代码优化方面还很不足,程序的整体框架不够好,用户需求也没能充分满足,整个网络游戏平台系统没有使用相关的游戏引擎导致一些画面不是特别流畅,这些问题还需今后逐一解决。
可以说,这次毕业设计是我第一次独立开发一个完整的应用程序。由于基础的薄弱和经验的匮乏,我只能摸着石头过河,寻找各种途径学习C++的MFC开发。没有头绪的时候会惶恐不安,会焦虑,但我没怀疑过走出舒适区域的选择。我觉得这个过程中,我学到的最重要的不是C++知识本身,而是在茫然无措时寻求答案和应对压力的能力。学无止境,希望在未来的学习工作中,我能有更大的突破。
致谢
经过几个月的努力,本次毕业设计已经接近尾声,在课题选取、论文撰写和系统规划等过程中,我的指导老师给予我细心周到的指导,拓展了我的思路,使我能顺利完成任务,在此我表示衷心的感谢。感谢老师们的教诲、指导与帮助,我将铭记于心。老师们渊博的专业知识,严谨的治学态度,精益求精的工作作风,诲人不倦的高尚师德,严以律己、宽以待人的崇高风范,朴实无华、平易近人的人格魅力对我影响深远。在此,谨向各位老师表示崇高的敬意和衷心的感谢!
参考文献
[1].谢希仁.计算机网络(第5版)。电子工业
展开阅读全文