目录前言..............................................................................................................11扫雷游戏概述..........................................................................................21.1基本信息........................................................................................21.2游戏玩法简介...............................................................................22系统平台与技术选择.............................................................................32.1开发语言与工具............................................................................32.2技术选择........................................................................................33扫雷游戏需求分析..................................................................................43.1编写需求分析的目的....................................................................43.2功组织结构图................................................................................44扫雷游戏软件总体设计..........................................................................54.1主要功能模块划分........................................................................54.2设计步骤流程................................................................................65扫雷游戏程序详细设计..........................................................................95.1编写详细设计的目的....................................................................95.2单机版扫雷游戏的实现................................................................95.3完成单机版扫雷游戏界面设计..................................................105.4单机游戏状态转换图..................................................................125.5网络扫雷的实现..........................................................................136程序功能完善与优化............................................................................186.1增加音乐效果..............................................................................18
I西华大学毕业设计说明书
6.2保存功能......................................................................................186.3发送鼠标功能的优化..................................................................186.4增加排行榜功能..........................................................................186.5增加首次点击不会点到雷的功能..............................................196.6增加网络版双方玩家点击计数..................................................196.7增加聊天功能..............................................................................207网络扫雷游戏功能测试........................................................................218结论.....................................................................................................29总结........................................................................................................30致谢........................................................................................................31参考文献.............................................................................................32附录............................................................................................................33
II西华大学毕业设计说明书
摘要
本软件是一款具有联机功能的扫雷游戏,并且具有单机游戏功能。联机功能采用C/S模型,通过服务器程序中转消息,完成对游戏消息的传送。程序功能丰富,具有多种难度,且带有保存,排行榜,聊天等功能。
程序的设计采用了模块化程序设计的方法,对底层模块和经常被调用的函数,进行封装。使得单机扫雷游戏与网络版的扫雷都可以共用底层的游戏逻辑。且使得在单机版的基础上实现网络功能变得简单。
游戏界面美观,显示的数字和地雷都用贴图实现。关键词:扫雷游戏;C/S模型;服务器;
III西华大学毕业设计说明书
Abstract
Thissoftwareisaminesweepergamewithonlinefeaturesandfunctionalitywithasinglegame.OnlinefeaturesusingC/Smodel,thegamesendthethemessagethroughtheserverprogram.Thisprogramhasalotoffunctions,likeavarietyofdifficulty,andwithasave,highscores,chatandotherfunctions.
Programwasdesignedwithamodulardesignmethod,oftencalledthebottomofthemoduleandfunctionofthepackage.Makesthegamestand-alonemineclearanceandthenetworkversionofthegamecansharetheunderlyinglogic.Andmakesonthebasisofstand-alonenetworkingsimple.
Gameinterfaceisbeautiful,showingthenumberandmineplaygroundwiththebitmap.
Keywords:minersweeper;C/Smodel;server;
IV西华大学毕业设计说明书
前言随着计算机与网络的普及,人们生活水平的提高,电脑游戏越来越成为人们生活中不可或缺的一部分,在人们繁忙的工作之余,给人带去欢乐与放松。而一款网络游戏,因为能和真实存在的人一起互动,能和周围的同伴一起游戏,更使得游戏的可玩性大大提高,使得人们更能的投入到游戏中去。
随着电脑游戏产业的规模越来越大,开发一款成功的电脑游戏靠个人之力已非易事。不过,随着市场上开发的游戏产品越来越丰富,各种题材的游戏越来越多,创意已成为一款成功游戏的最重要的特点。例如目前流行的游戏<<植物大战僵尸>>,<<愤怒的小鸟>>,虽然都是一些很小的休闲游戏,但是因其特有的风格,使得它们都大获好评。
扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然是该系统装机必备的软件,可见这款小游戏受到越来越多人的喜爱。
我的毕业设计题目为2D单机版/网络版扫雷。单机版扫雷作为一款windows平台上最为普及的游戏,玩过的人不计其数,对大部分人来说,扫雷游戏不再具有吸引力。可是扫雷网络版,却是一款全新的游戏。由于其网络功能实现,为扫雷增添了新的趣味,再次丰富了游戏的可玩性。由于设计任务书中的对程序设计的具体要求较少,于是,我就有了很多可以自由发挥的空间,如对网络扫雷游戏玩法的设定,对网络模块的设计等,都是秉着实用与简单的原则进行设计的。
程序的编写按照的要求,分为两大模块,单机版与网络版。而其中的单机版,参考windowsxp上的扫雷版本,基本实现了该版本扫雷游戏所具有的功能。而网络版的扫雷,使用tcp/ip协议,采用c/s模型架构,能够实现两人一起玩同一局扫雷游戏,且服务器支持多人在线功能。
1西华大学毕业设计说明书
1扫雷游戏概述1.1基本信息
扫雷游戏英文名称为minesweeper,属于益智类游戏。通过鼠标即可操作游戏。游戏特点为操作简单,易于上手。
1.2游戏玩法简介
在游戏菜单上,单击开局。通过鼠标单击即可挖开方块。如果挖开的是地雷,则输掉游戏。如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷。由玩家逐个翻开方块,以找出所有地雷为最终游戏目标。如果玩家翻开所有非地雷的方块,则游戏通关。且根据游戏计时,判定玩家是否打破了在当前难度下的最短记录,如果是新纪录,则提示玩家输入姓名,进入游戏高分榜。
地雷的位置初始时随机生成。可以给确定是雷的格子通过右键进行标记。如果无法判定某方块是否有雷,请用右键单击两次给它标记一个问号(?)。之后,可以用鼠标右键单击方块一次将该方块标记为地雷或者或用鼠标右键单击方块两次去掉标记。
游戏除了有中级高级初级难度之外,还允许用户自定义游戏难度。即设定格子的高度,宽度,及雷的数量。
网络扫雷游戏的玩法与单机游戏相同,且可以两个人玩在不同的主机上一起玩同一盘扫雷游戏。
2西华大学毕业设计说明书
2系统平台与技术选择2.1开发语言与工具
程序使用c#语言,开发平台为vs2008。c#语言因其强大的类库与能够十分简便的使用图形界面而著称,可以快速的开发一款桌面应用软件。而且其具有强大的面向对象编程的能力,使得程序功能模块的划分与实现更为容易。
VisualStudio2008包括各种增强功能,例如可视化设计器(使用。NETFramework3。5加速开发)、以及能够加速开发和处理所有类型数据的语言增强功能。
2.2技术选择
程序的开发使发如题目的要求,分为两大模块,单机版与网络版。
单机版主要参考已有的windowsxp上的扫雷版本,根据所需实现的功能,利用c#中的事件处理机制,实现相应各种游戏逻辑。
网络版的扫雷,使用tcp/ip协议,c/s模型架构。之所以采用此种模式,是因为相较于UDP而言,我更为熟悉tcp。虽然使用c/s模型还要写相应的服务器程序,但是也因为有了服务器,能够为网络版扫雷很容易的实现一些其它功能,如多人同时聊天,知道对方的游戏状态等。
程序使用到了多线程技术。因此服务器支持多位玩家同时连接到服务器。服务器为每一位玩家打开一个阻塞socket,在一个单独的线程中,接受客户端传来的消息。
消息的传送与处理采用命令头加信息内容的方式。即根据发出命令的类别不同,使用独一的字符串的表示,添加在所要发送消息的前面。然后接受消息时,先分离命令头与内容,根据命令头,采用不同的函数去处理内容。
3西华大学毕业设计说明书
3扫雷游戏需求分析3.1编写需求分析的目的
需求分析的主要任务即详细的找出程序所需要的各种功能实现。本程序为扫雷游戏的实现,首先是要实现扫雷游戏的基本功能,根据扫雷游戏的玩法,设计程序,实现程序功能。然后,将其添加为可以联机的网络版扫雷游戏。
3.2功组织结构图
根据任务书的要求,做出如下需求分析,如图3-1所示:
单机网络扫雷游戏单机扫雷游戏扫雷游戏逻辑初中高级难度设定游戏难度自定义难度游戏界面设计设计扫雷界面网络界面设计网络扫雷游戏网络扫雷逻辑完善程序功能排行榜功能保存游戏功能增加音效寻找素材图3-1功能需求组织结构图
4西华大学毕业设计说明书
4扫雷游戏软件总体设计4.1主要功能模块划分
整个程序的架构都由模块化结构,分层结构的思想设计完成。从设计上主要分为两大模块
1.底层逻辑模块:底层主要由两大模块构成,也是程序底层逻辑所需要的主要功能。
a)游戏逻辑模块:完成扫雷游戏时的各种逻辑b)通信模块
:完成客户端与服务器之间数据的收发
2.界程序设计的实现面功能模块:界面模块属于上层模块,调用底层模块提供的各种借口,完成游戏游戏功能的实现。并且提供丰富的人机交互界面,方便用户操作
程序主要功能组织结构图如图4-1
单机/网络扫雷
游戏
底层逻辑模块
界面功能模块
游戏逻辑模块通信模块人机交互界面
使用底层逻辑模块完成功能
图4-1程序各模块组织结构图
5西华大学毕业设计说明书
游戏逻辑模块功能细分的组织结构图如图4-2所示:
游戏逻辑模块
设置游戏基本属性处理游戏数据游戏的逻辑设定
游戏状态的设定
雷数,扫雷地图格子长度,宽度随机生成地雷地图游戏的保存与读取游戏的胜负判断鼠标扫雷逻辑实现
图4-2游戏逻辑模块的组织结构图
4.2设计步骤流程
程序设计的流程主要为先实现单机扫雷,然后为单机扫雷添加上网络模块。然后再利用同样的网络模块开发出服务器端程序,提供信息的中转服务。
单机扫雷的系统流程图如图4-3所示
6西华大学毕业设计说明书
图4-3单机扫雷系统流程图
网络扫雷的系统流程图如图4-4所示
7西华大学毕业设计说明书
图4-4网络扫雷系统流程图
最终,在实现了网络与单机游戏的基础之上,在为程序添加上一些其它功能。如排行榜功能,保存功能等。并且对程序的部分地方予以优化。
8西华大学毕业设计说明书
5扫雷游戏程序详细设计5.1编写详细设计的目的
清楚的说明各个模块是如何实现的,各个模块的主要功能,设计程序时的思路等内容。
5.2单机版扫雷游戏的实现
5.2.1完成扫雷游戏底层逻辑的设计
1.设计实现:在程序中,使用一个SweepGame类完成所有底层的游戏逻辑功能。
2.扫雷的底层表现形式:使用二维数组存储当前游戏状态。2D扫雷游戏,抽象的说来,游戏的实质即是在二维空间,不同的点之间所具有的不同状态,例如该格子是雷,可以用数字-1表示,该格子周围一个雷也没有,可以用0表示,。使用二维数组能够完全表示所有地雷地图的数据。并且,再利用另一个二维数组,用以表示当前点是否已被用户点击。
3.游戏基本属性:地雷数组宽度,高度,地雷数量,游戏难度。4.游戏状态
:游戏失败,游戏通关,游戏进行中
5.SweepGame类主要功能:初始化游戏状态:生成随机的地雷数组,根据生成的地雷位置,将其余并非地雷的位置填上数字,数字代表该格子周围八个格子里,有几个地雷。。
设置游戏等级:游戏等级分为四等:初级,中级,高级和自定义。其中,其三者都由默认设置设置游戏属性。通过游戏等级的设置,间接设置游戏的基本属性。
扫雷逻辑实现:即当用户点击鼠标,通过界面传入到SweepGame时,是作为SweepGame二维数组中的一个下标。通过该下标所指示的地雷二维数组,判断用户是否踩到雷了,或者是数字。然后,在进行下一步判断。
5.2.2扫雷游戏状态分类
当玩家扫雷时,即用鼠标左键点击一个格子时,有以下几种状态:
9西华大学毕业设计说明书
踩到雷:游戏失败,结束游戏并且在界面中显示所有的雷。点到的是数字:显示数字,游戏继续。
若玩家点到的格子周围一颗雷也没有时:就采用递归算法,继续向周围扩展。当玩家点开所有的非雷的格子:提示游戏通过,并且结束游戏。扫雷底层逻辑关键函数分析:publicbool
checkMines(intcol,introw){}
checkMine(int,int)函数的主要功能即是对传入的格子的坐标,判断当前格子是什么,然后根据此,判断下一步游戏该如何进行。
privatevoidserch(intcol,introw){}
Serch(intcol,introw)该函数由checkMines函数调用,用于根据该格子所显示的数字,实现游戏逻辑,该函数的实现使用了递归调用。如果数字非0,则直接显示。否则,就要向该格子的周围八个格子进行递归,继续查找下去。并且,当翻开所有非雷格子后,更改游戏状态为游戏通关。
SweepGame类的功能如图5-1所示:
SweepGame类主要功能用数组表示游戏生成游戏数据执行游戏逻辑设置游戏难度表示当前游戏状态图5-1SweepGame类主要功能
5.3完成单机版扫雷游戏界面设计
5.3.1界面功能实现
1模仿windowsxp版本的扫雷界面,添加界面元素:a)计时窗口
b)当前地雷剩余数窗口c)扫雷面板
10西华大学毕业设计说明书
d)菜单栏2.实现方式
计时窗口与当前地雷剩余数窗口用PictureBox控件实现。
用一个SpiltContainer控件划分两个Panel,分别添加扫雷面板和计时、地雷数窗口。并且添加菜单控件。
3.功能的实现a)菜单功能
开局:根据当前游戏难度直接开始一盘新游戏
初级,中级,高级游戏设定:根据选项设定游戏难度后开始新游戏。
自定义难度:首先弹出游戏设置对话框,让用户设置扫雷游戏基本属性,然后根据用户设定的属性开始新游戏。
自定义对话框设计如图5-2所示:
图5-2自定义难度时弹出的对话框
b)扫雷面板功能
功能描述:使扫雷面板接受鼠标事件,并根据不同的键,定义不同的功能。鼠标左键定义:打开该鼠标坐标所在的格子,并以此点开始执行扫雷逻辑。鼠标右键定义:点击一次时完成地雷的标记,点击两次对此点进行疑问标记。点击三次消除标记。
5.3.2寻找素材,完成贴图
游戏中需要用到很多贴图,如下所示:地雷,雷爆炸,问号,0~8大小数字图片等。从网络上收索合适图片,使用PhotoShop对其进行裁剪,变换大小等操作。
11西华大学毕业设计说明书
5.3.3游戏界面与游戏底层逻辑之间的对应关系
根据格子的不同状态,显示不同的图片
1.未点击的格子---为一张蓝色带有立体感的纯色图片。
2.点击之后,非地雷的格子,显示其周围地雷的数量--直接有数字对应相应的数字图片,若果数字为0,则显示比未点击格子浅色的图片
3.地雷--对应地雷图片
4.点击地雷--对应地雷爆炸的图片。5.3.4游戏界面展示
最终生成的中级难度的游戏界面如图5-3所示:
图5-3中级游戏难度
5.4单机游戏状态转换图
单机扫雷游戏的状态转换图如图5-4所示,描述了根据不同的事件,游戏的状态的转换:
12西华大学毕业设计说明书
开始新游戏等待事件菜单事件鼠标事件重设游戏调用扫雷逻辑,进行下一步判Le左右键R地图标记点到雷Ye游戏失败Ne点开一片数字,继续判断Ne点完数字Ye游戏胜利图5-4单机扫雷状态转换图
5.5网络扫雷的实现
5.5.1完成扫雷客户端通信模块实现
1.C#提供的TcpClient类的使用
该类为TCP网络服务提供客户端连接,它提供了一些简单的方法,用于在同步阻止模式下通过网络来连接、发送和接收流数据。
tcpClient.Connect(ipAd,port);//连接服务器的代码tcpClient..Send(data);//向服务器发送数据2.通信模块
a)设计实现:在程序中添加类Client,用它来完成与服务器的所有通信操作,如发送数据,接受数据等操作。
13西华大学毕业设计说明书
b)传送数据分类及数据处理:考虑到游戏中,玩家之间要传送数据的类型有很多,于是增加数据类NetCommand,其中封装着所有需要传送的文件类型的文件头。例如鼠标左键,用publicconststringLEFT_BUTTONDOWN,在发送数据的时候,在数据文件之前先把这个文件头传送过去,然后接收端或者是服务器根据文件头的内容,按照不同的方式处理数据。
NetCommand类:使用NetCommand封装了所有的命令头。部分命令如下所示:
publicconststringPRIVCE_CHAT=\"privcchat\";//私聊publicconststringINVITE_JOIN=\"invitejoin\";//邀请游戏publicconststringAGREE_JOIN=\"agreejoin\";//同意加入游戏publicconststringNO_AGREE_JOIN=\"noagreejoin\";publicconststringMOUSE_POS=\"mousepos\";//鼠标位置
publicconststringLEFT_BUTTONDOWN=\"leftbuttondown\";//鼠标左键c)传送的消息的内容:根据所传递消息类型的不同,传送的内容也发生相应的变化。
鼠标消息内容:1.左右键2.鼠标的坐标聊天消息内容:1.是否为私聊2.聊天的文本消息地雷数据消息:地雷的分布
d)传送消息的目的:任何消息首先都是传给服务器,由服务器将消息处理之后,取得消息最后该发往那个服务器。所以,目的游戏客户端的地址也作为消息内容的一部分传送。
e)所需功能的分析:游戏客户端能够把联机游戏时所需要的各种内容都首先发送给服务器,服务器在转发信息给其它客户端。即通信模块又分为两大功能。发送与接收。
游戏客户端之间的通信由图5-5所示:
14西华大学毕业设计说明书
向ClientB发送消息GameClient将消息传ClientB收到并处理信息A将消息传给服务器GameServer发给正确的客户GameClientB服务器解析并将消息图5-5通信过程
f)发送功能的实现
通过底层函数:privateintsendVarData(Sockets,byte[]data),函数功能为使用Sockets,向服务器附送数据,并且具有发送数据时,同时将数据的长度给发出去的功能。其实现原理为封装了c#的socket类的send函数的使用。
中间层函数:publicvoidsendData(stringcommand,stringmsg)函数,其目的为供其他函数传入相应的命令头和数据,然后其将命令与数据组合之后,再调用sendVarData将数据直接发送给服务器。
最上层函数:上层函数根据消息类型的不同,分别建立不同的函数。例如传递鼠标消息到服务器的函数publicvoidsendMousePosToParter(intxPos,intyPos){},参数为传入客户端鼠标坐标,然后将它封装成数据,调用sendData函数,将其传给服务器。
h)处理传递过来的消息的实现:
底层函数:程序使用函数voidreceiveData()接受数据,然后,将数据分离为命令与内容。再通过switch-case语句,选择不同的分支完成对命令的处理。
高层处理函数:处理命令的函数都以hand开头,例如handMousePos与handMousePosChange一起,处理对方发送过来的鼠标消息,然后更改自己窗体中,代表对方鼠标的位置。
5.5.2服务器的实现
1.服务器的主要功能及实现
15西华大学毕业设计说明书
a)显示当前连接的玩家列表
实现方式:对每一个与服务器连接的客户端,记录其ip地址与端口,然后通过一个ListBox控件显示。当用户断开连接时,则清楚ListBox中该用户的信息。
b)转发玩家之间发送的信息此功能的实现的过程如下:
首先,得到客户端传过来的信息,然后将其分解成命令与内容。并根据命令头,选择相应处理程序。(此过程与客户端接收命令以后的过程相同,但不同之处在于,服务器是利用多线程,对每个客户端都有一个单独的serviceClient,接收并处理命令)
在startListener中接收客户端的连接,并新建线程,建立对这个客户端socket的监听。开启一个监听工作线程的代码如下:
ThreadStarttStart=newThreadStart(serviceClient);
通过serviceClient里的阻塞套接字,等待客户端发送过来的信息。并且交给消息处理函数处理。
在消息处理函数的实现原理与客户端的一样,实现方式为由serverClient根据聊天命令头进行调用,知道以后发送过来消息必然是聊天信息,通过handChat函数,从clientSocket中将聊天信息读出,然后,在根据客户端链表,将信息发送给其他用户。
c)发送服务器消息,客户端之间的状态信息
服务器消息即为从服务器向所有用户转发的信息,实现方式为为所有的用户建立一张链表,然后,遍历所有的客户,将信息发送给他们。
publicvoidsendSysMsg(stringmsg){}
服务器要想向客户端发送很多状态信息,如有新客户端加入,两个客户端一起进入游戏等。
16西华大学毕业设计说明书
5.5.2开始联机游戏时的状态转换图
网络扫雷游戏时进行联机游戏的状态转换图如图5-6所示:
玩家A玩家B连接服务器等待邀请对方服务器连接邀请信息连接邀请信息连接服务器开启服务同意信息收到邀请同意邀请游戏数据等待等待数据同意反馈转发信息创建游戏游戏数据服务器游戏状态信息游戏状态信息开始游戏发送游戏数据收到数据创建游戏开始游戏图5-6玩家A邀请玩家B进行联机游戏的状态转换图
说明:由于双方玩的是同一盘游戏,为保证双方的数据相同,由游戏的邀请方生成地雷的信息,然后将该信息通过服务器传给被邀请方。双方游戏时,通过对鼠标事件的处理,将本方的信息不断的传给对方。
17西华大学毕业设计说明书
6程序功能完善与优化6.1增加音乐效果
1.目的:通过音乐的添加,使得游戏的效果得到增强。
2.实现方式:通过c#提供的SoundPlayer,添加并播放音乐。添加了三个音乐效果,点击时的音效,地雷爆炸音效及游戏通过时的音乐。
6.2保存功能
1功能描述:在单机模式下,允许用户在退出时保存当前游戏,当用户下次进行游戏时,提示用户可以继续上次保存的游戏。
2实现方法:把当前的游戏信息,如游戏的雷数,高度,宽度,地雷数组和当前的访问数组一起写入一个文本文件,然后当继续游戏时,从文本文件中读取数据并赋值给游戏的状态变量。实现原理为c#语言中提供的访问文本文件的类。
6.3发送鼠标功能的优化
1.功能描述:当双方进行联机游戏时,要将本机的鼠标信息发送给对方,以更新对方客户端上的信息。但是,由于鼠标的移动,会产生大量的消息。而这些消息,对于扫雷并非都是需要的。因为,大量鼠标的移动,也许都没有移动出一个扫雷的小格子。
2.优化方式:设置两个变量表示鼠标旧的坐标,当前坐标与旧坐标的距离大于某个值时,此时更新旧值,同时发送鼠标值。
6.4增加排行榜功能
1.功能描述:记录初级,中级,高级难度中的最短时间作为排行榜。当用户当前游戏通过后时间比记录的时间短,则告知用户,让用户输入自己的姓名,并且记
18西华大学毕业设计说明书
录在排行榜上。
2.实现方式:将排行榜信息记录在一个文本文件中,每次开始游戏的时候,就将文本文件的信息读取出来。并且,网络版扫雷的排行榜文本文件保存在服务器上,当游戏客户端进行联机游戏之时,由服务器读取文件并且传给用户。当用户修改了这些信息时,还要讲信息发送给服务器。让服务器更新排行榜。如图6-1所示:
图6-1单机版扫雷排行榜
6.5增加首次点击不会点到雷的功能
1.功能描述:即当用户第一次点击时,如果点到的是一个雷,则此时,程序会自动调整地雷的位置,然后,根据此重新生成相应的游戏地图。在网络版游戏中也实现了此功能。
2.实现方式:记录是否是首次点击标志,如是,则自动将雷向右移动至一个不是雷的位置。
6.6增加网络版双方玩家点击计数
1.功能描述:即当玩家点击游戏的格子的时候,当点击的是一个没有被点开
19西华大学毕业设计说明书
的格子时,算作有效点击一次,并在相应的控件上显示
2.实现方式:在制作的聊天控件上,新创建两个Label控件,并且,当有鼠标左键按键和接受到连接方发送的鼠标左键信息时,将Label控件上的数字增加。
6.7增加聊天功能
功能描述:在用户连接服务器时起,就有群聊与私聊这两个功能。当用户进行联机游戏时,双方自动变为私聊。
联机时聊天窗口如图6-2所示:
图6-2联机聊天时窗口界面
说明:发送按钮左边的即为消息发送框,将消息写入,然后发送,与自己联机的玩家就会受到该信息,并且在发送按钮上面的文本框中显示。
20西华大学毕业设计说明书
网络扫雷游戏功能测试1通过菜单选项进入网络版扫雷游戏,如图7-1所示
图7-1游戏开始界面
选择两人游戏选项,开始进入网络版扫雷游戏界面,如图7-2所示:
图7-2填写游戏服务器的地址217西华大学毕业设计说明书
2.打开服务器
此时,开启服务器,服务器界面及功能如图7-3所示所示:
图7-3开启服务器之后等待客户端连接
当有两位玩家进入游戏时,服务器显示信息如图7-4所示:
22西华大学毕业设计说明书
图7-4有两位客户连接服务器
服务器功能说明:服务器支持多客户端的连接,当有客户端连接,或者退出时,消息栏里将显示客户端的状态。可以在文本框中输入信息,点击发送按钮,将所有的信息发送给所有连接的用户。
23西华大学毕业设计说明书
当客户端连接到服务器时,客户端显示的状态如图7-5所示:
图7-5当客户连接至服务器时收到的服务器信息
3.聊天功能测试
聊天有群聊与私聊的功能。
私聊:通过点击私聊按钮,然后将文本框中的信息发送给当前选则用户,其他用户则收不到此消息。
群聊:即发送的消息所有的人都能接收到。聊天功能的私聊与群聊功能测试如图7-6所示:
24西华大学毕业设计说明书
图7-6聊天功能测试
4.邀请游戏功能测试
步骤为:首先用鼠标选中对方,然后点击邀请,此时,客户端会发送消息至所选的客户端。对方会受到对话框提示,问是否加入游戏。如图7-7所示:
图7-7收到对方邀请信息25西华大学毕业设计说明书
当同意对方邀请时,则双方同时进入新游戏,新游戏的地雷分布都是一样的,而且,双方的鼠标都会在对方的窗口上同步显示为一个小黑箭头。如图7-8所示:
图7-8双方一起玩扫雷游戏的界面
当其他游戏客户端连接到服务器时,状态栏会显示当前玩家正处于联机游戏中,并且不能邀请其进行游戏。如图7-9所示:
图7-9不能邀请已进入游戏的玩家
26西华大学毕业设计说明书
5.测试游戏难度调整
设置为初级游戏难度如图7-10所示:
图7-10初级游戏难度
自定义游戏难度时,弹出设置难度的对话框,如图7-11所示:
图7-11自定义游戏对话框27西华大学毕业设计说明书
设定游戏之后游戏显示如图7-12所示
图7-12自己设定的游戏难度
28西华大学毕业设计说明书
8结论经过将近三个月的时间,基本完成了本次的毕业设计----2D单机/网络扫雷游戏。本程序已经过我与同学的多次测试,在不同的PC上通过网络功能可以成功进行游戏,并且在带宽充足的局域网内,游戏能够运行的很流畅。
虽然在程序网络模块设计的时候,有很多其它能够使得程序联网功能更好,更快的技术,但由于本人自身开发经验的欠缺,所以选择了最熟悉的C/S模型,服务器利用多线程与阻塞套接字的技术。但服务器在少量客户端连接的情况下,效率仍能够满足需要。
在本系统的开发中,由于本人是初次开发软件,在知识、经验方面都存在着不中间。另外,在整个开发的过程中,时间比较仓促。因此,该系统必然会存在一些缺陷和不足。
29西华大学毕业设计说明书
总结毕业设计作为我大学四年学习的一个检验,无论在量上还是质上都是以前所做的课程设计所不能比拟的。为了圆满的完成它,我也为此付出了大量的时间。去图书馆借书,查资料,请教老师等。出拿到任务书时,还对任务似懂非懂,但是经过一段时间的学习与知识储备,毕业设计的开发方案也渐渐在心中浮现。
首先是选择开发语言,c#虽然是自学的,但是由于其强大的GUI库与编译VS2008,所以我也就毫不犹豫的选择了它。然后,一点一点,一个模块一个模块的去完成,完善程序。从底层开始写起,从字符界面的扫雷游戏开始做起,完成了游戏底层。接着,开发了一个单机版的游戏模型,图形界面,鼠标事件。当时,心中满是喜悦与激动。因为,离最后的完成,我已迈出了一大步。接着便是网络模块的添加了,由于对widows网络编程的不熟悉,所以,专门的去熟悉socket的使用,为此,还照着书上的例子写了一个聊天程序。而这个聊天程序,也直接成了我的C/S模型的原型。在技术上已经没有任何问题之后,我的开发也走上了正轨,每天写一点,添加一些新的功能,就像修房子一样,最终,一个颇具规模的,具有完善功能的网络扫雷就给我实现了。那时,心中的成就感让我感觉到很快乐。
写程序,并且把程序写好,并不是一件容易的事情,需要耐心,遇到问题更需要不放弃的毅力,恒心,和信心。还有,要多喝老师与同学交流,听取别人的意见,是战胜困难的一条捷径。
但是通过艰辛的努力,所收获到的,不仅是一个程序的完成,而是通过自己努力战胜困难的喜悦,通过写大量程序对自己技术的又一次促进,对程序设计又有更多的理解与感悟。也为以后,程序员的生涯做好了准备。
30西华大学毕业设计说明书
致谢不久的六月,就将离开校园了。看这自己一行一行写出来的代码,十分欣慰。通过四年的努力,使得自己已拥有一定的编程水平了,所以面对毕业设计的这个题目时,也没有多分的担忧。虽然面对着很多的问题,但是因为周围丰富的可以利用的资源,很多问题也就一个个被攻克了。
在此,感谢指导老师xxx,在我有问题的时候,能够为我解答。也感谢专业里帮助了我的的同学,不仅解答了我的一些问题,而且扩宽了我的思路。最后,感谢西华大学,为我提供了一个良好的学习平台,为我的专业知识打下了坚固的基础。
31西华大学毕业设计说明书
参考文献[1]C#2.0完全自学手册/张立等编著北京:机械工业出版社,2007
[2]C#程序设计语言/(美)AndersHejlsberg等著顾雁宏,徐旭铭译北京:机
械工业出版社[3]C#网络编程技术教程
金华,华进编著
人民邮电出版社2009北京:化学工业出版社,2010
[4]C#.NET课程设计指导/主编龚自霞,高群北京:北京大学出版社,2008.01[5]C#3.0从基础到项目实战/李海涛等编著[7]C#基础与实例教程
[6]C#与.NET3.5高级程序设计/(美)AndrewTroelsen著朱晔...[等]译
郝春强编著中国电力出版社2005.08
主编龚自霞,高群
北京大学出版社2008.01
[8]C#.NET课程设计指导
[9]C#快速入门B-power工作室编著中国铁道出版社2001.08[10]C#网络程序设计B-power工作室编著
中国铁道出版社2001
32西华大学毕业设计说明书
附录部分核心函数的代码:
1游戏逻辑类的核心函数
SweepGame类作用:完成游戏底层逻辑的设定与处理,如用二维数组表现游戏,判定游戏胜负状态。其部分核心函数将在下面介绍。
serch,作用是当点到的是一个周围没有雷的格子时,将向周围递归继续点开格子。
saveCurrentGame,将当前所有游戏信息写入到文本文件中。publicclassSweepGame{privatevoidserch(inth,intw){//首先判断是否越出了地雷矩阵if(h==0||w==0||h==this.height+1||w==this.width+1)return;if(this.rightButtonFlag[h,w]==SweepGame.RightButtonOne)return;if(this.visitedArray[h,w]==true)return;if(this.mineArray[h,w]==SweepGame.BLANK){this.visitedArray[h,w]=true;//标记为要显示;this.visitedBoxCount++;//并向这个点的上下左右递归serch(h,w-1);//leftserch(h,w+1);//rightserch(h-1,w);//upserch(h+1,w);//downserch(h-1,w-1);//左上serch(h-1,w+1);//右上serch(h+1,w-1);//左下serch(h+1,w+1);//右下}else//此时,则此位置是一个数字{this.visitedArray[h,w]=true;//标记为要显示;33西华大学毕业设计说明书
this.visitedBoxCount++;}if(this.visitedBoxCount==this.totalVisitedBox){this.GameState=SweepGame.WIN;//owner.showWinInfo();}}publicvoidsaveCurrentGame(stringstrGameFormInfo){//将当前所有的游戏信息写入文件之中.FileStreamfs=newFileStream(\"gameSave.txt\StreamWritersw=newStreamWriter(fs);if(strGameFormInfo!=null){//如果传入的游戏界面信息字符串不为空的话,就将其写入第一行sw.WriteLine(strGameFormInfo);}//分隔符使用逗号隔开stringdiv=\stringdata=\"\";//写入高宽,宽度,雷数,等级,游戏状态data+=this.height+\+\+this.mineNum+\+gameLevel+\sw.WriteLine(data);//写入地雷数组信息.for(inti=1;i<=height;i++){data=\"\";//清空data,一行一行的写数据.for(intj=1;j<=width;j++){data+=mineArray[i,j].ToString();if(j!=width)//每个数字之间用,隔开data+=\}sw.WriteLine(data);}for(inti=1;i<=height;i++){data=\"\";//清空data,一行一行的写数据.for(intj=1;j<=width;j++){data+=visitedArray[i,j];34西华大学毕业设计说明书
if(j!=width)//每个数字之间用,隔开data+=\}sw.WriteLine(data);}for(inti=1;i<=height;i++){data=\"\";//清空data,一行一行的写数据.for(intj=1;j<=width;j++){data+=rightButtonFlag[i,j];if(j!=width)//每个数字之间用,隔开data+=\}sw.WriteLine(data);}sw.Flush();sw.Close();}}2通信模块的核心代码
Client类即为完成了通信模块客户端的类,功能主要是发送与接收各种消息,并将接收到的数据交给逻辑模块和界面模块去处理。
connectServer,根据给定的服务器IP地址与端口,连接服务器,并且保存本地的端口号。
sendVarData,根据套接字发送时为无边界套接字,所以将消息发送之前,将消息的长度发送给对方,使得接收方获取指定大小的数据。recvVarData,对应接受使用sendVarData发送的数据。
recivedData,为客户端的接受命令并且调用处理函数的工作线程。
classClient{publicboolconnectServer(stringipAd,intport){tcpClient=newTcpClient();Console.WriteLine(\"客户端开始连接...\");try{35西华大学毕业设计说明书
tcpClient.Connect(ipAd,port);}catch(SocketExceptione){this.exceptionStr=e.Message;returnfalse;}isConnected=true;//将连接状态为真clientName=tcpClient.Client.LocalEndPoint.ToString();Threadt=newThread(newThreadStart(recivedData));t.Start();returntrue;}privateintsendVarData(Sockets,byte[]data)//将data的长度转换成字节,并将其作为数据的首部先发送给服务器byte[]byteSize;intsize=data.Length;byteSize=BitConverter.GetBytes(size);try{s.Send(byteSize);}catch(SocketExceptione){return0;}intcurOffset=0,leftNum=size;//当前发送数据偏移量与还剩余数据大小intnum=0;while(curOffset 因篇幅问题不能全部显示,请点此查看更多更全内容