网络扫雷游戏毕业设计论文.docx
- 文档编号:5960867
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:16
- 大小:157.87KB
网络扫雷游戏毕业设计论文.docx
《网络扫雷游戏毕业设计论文.docx》由会员分享,可在线阅读,更多相关《网络扫雷游戏毕业设计论文.docx(16页珍藏版)》请在冰豆网上搜索。
网络扫雷游戏毕业设计论文
(此文档为word格式,下载后您可任意编辑修改!
)
优秀论文审核通过
未经允许切勿外传
目录
前言1
1扫雷游戏概述2
1.1基本信息2
1.2游戏玩法简介2
2系统平台与技术选择3
2.1开发语言与工具3
2.2技术选择3
3扫雷游戏需求分析4
3.1编写需求分析的目的4
3.2功组织结构图4
4扫雷游戏软件总体设计5
4.1主要功能模块划分5
4.2设计步骤流程6
5扫雷游戏程序详细设计8
5.1编写详细设计的目的8
5.2单机版扫雷游戏的实现8
5.3完成单机版扫雷游戏界面设计9
5.4单机游戏状态转换图11
5.5网络扫雷的实现12
6程序功能完善与优化17
6.1增加音乐效果17
6.2保存功能17
6.3发送鼠标功能的优化17
6.4增加排行榜功能17
6.5增加首次点击不会点到雷的功能18
6.6增加网络版双方玩家点击计数18
6.7增加聊天功能19
7网络扫雷游戏功能测试20
8结论28
总结29
致谢30
参考文献31
附录32
摘要
本软件是一款具有联机功能的扫雷游戏,并且具有单机游戏功能。
联机功能采用CS模型,通过服务器程序中转消息,完成对游戏消息的传送。
程序功能丰富,具有多种难度,且带有保存,排行榜,聊天等功能。
程序的设计采用了模块化程序设计的方法,对底层模块和经常被调用的函数,进行封装。
使得单机扫雷游戏与网络版的扫雷都可以共用底层的游戏逻辑。
且使得在单机版的基础上实现网络功能变得简单。
游戏界面美观,显示的数字和地雷都用贴图实现。
关键词:
扫雷游戏;CS模型;服务器;
Abstract
Thissoftwareisaminesweepergamewithonlinefeaturesandfunctionalitywithasinglegame.OnlinefeaturesusingCSmodel,thegamesendthethemessagethroughtheserverprogram.Thisprogrammethod,oftencalledthebottomofthemoduleandfunctionofthepackage.Makesthegamestand-alonemineclearanceandthenetworkversionofthegamecansharetheunderlyinglogic.Andmakesonthebasisofstand-alonenetworkingsimple.
Gameinterfaceisbeautiful,showingthenumberandmineplaygroundwiththebitmap.
Keywords:
minersweeper;CSmodel;server;
前言
随着计算机与网络的普及,人们生活水平的提高,电脑游戏越来越成为人们生活中不可或缺的一部分,在人们繁忙的工作之余,给人带去欢乐与放松。
而一款网络游戏,因为能和真实存在的人一起互动,能和周围的同伴一起游戏,更使得游戏的可玩性大大提高,使得人们更能的投入到游戏中去。
随着电脑游戏产业的规模越来越大,开发一款成功的电脑游戏靠个人之力已非易事。
不过,随着市场上开发的游戏产品越来越丰富,各种题材的游戏越来越多,创意已成为一款成功游戏的最重要的特点。
例如目前流行的游戏<<植物大战僵尸>>,<<愤怒的小鸟>>,虽然都是一些很小的休闲游戏,但是因其特有的风格,使得它们都大获好评。
扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然是该系统装机必备的软件,可见这款小游戏受到越来越多人的喜爱。
我的毕业设计题目为2D单机版网络版扫雷。
单机版扫雷作为一款windows平台上最为普及的游戏,玩过的人不计其数,对大部分人来说,扫雷游戏不再具有吸引力。
可是扫雷网络版,却是一款全新的游戏。
由于其网络功能实现,为扫雷增添了新的趣味,再次丰富了游戏的可玩性。
由于设计任务书中的对程序设计的具体要求较少,于是,我就有了很多可以自由发挥的空间,如对网络扫雷游戏玩法的设定,对网络模块的设计等,都是秉着实用与简单的原则进行设计的。
程序的编写按照的要求,分为两大模块,单机版与网络版。
而其中的单机版,参考windowsxp上的扫雷版本,基本实现了该版本扫雷游戏所具有的功能。
而网络版的扫雷,使用tcpip协议,采用cs模型架构,能够实现两人一起玩同一局扫雷游戏,且服务器支持多人在线功能。
1扫雷游戏概述
1.1基本信息
扫雷游戏英文名称为minesweeper,属于益智类游戏。
通过鼠标即可操作游戏。
游戏特点为操作简单,易于上手。
1.2游戏玩法简介
在游戏菜单上,单击开局。
通过鼠标单击即可挖开方块。
如果挖开的是地雷,则输掉游戏。
如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷。
由玩家逐个翻开方块,以找出所有地雷为最终游戏目标。
如果玩家翻开所有非地雷的方块,则游戏通关。
且根据游戏计时,判定玩家是否打破了在当前难度下的最短记录,如果是新纪录,则提示玩家输入姓名,进入游戏高分榜。
地雷的位置初始时随机生成。
可以给确定是雷的格子通过右键进行标记。
如果无法判定某方块是否有雷,请用右键单击两次给它标记一个问号(?
)。
之后,可以用鼠标右键单击方块一次将该方块标记为地雷或者或用鼠标右键单击方块两次去掉标记。
游戏除了有中级高级初级难度之外,还允许用户自定义游戏难度。
即设定格子的高度,宽度,及雷的数量。
网络扫雷游戏的玩法与单机游戏相同,且可以两个人玩在不同的主机上一起玩同一盘扫雷游戏。
2系统平台与技术选择
2.1开发语言与工具
程序使用c#语言,开发平台为vs2008。
c#语言因其强大的类库与能够十分简便的使用图形界面而著称,可以快速的开发一款桌面应用软件。
而且其具有强大的面向对象编程的能力,使得程序功能模块的划分与实现更为容易。
VisualStudio2008包括各种增强功能,例如可视化设计器(使用。
NETFramework3。
5加速开发)、以及能够加速开发和处理所有类型数据的语言增强功能。
2.2技术选择
程序的开发使发如题目的要求,分为两大模块,单机版与网络版。
单机版主要参考已有的windowsxp上的扫雷版本,根据所需实现的功能,利用c#中的事件处理机制,实现相应各种游戏逻辑。
网络版的扫雷,使用tcpip协议,cs模型架构。
之所以采用此种模式,是因为相较于UDP而言,我更为熟悉tcp。
虽然使用cs模型还要写相应的服务器程序,但是也因为有了服务器,能够为网络版扫雷很容易的实现一些其它功能,如多人同时聊天,知道对方的游戏状态等。
程序使用到了多线程技术。
因此服务器支持多位玩家同时连接到服务器。
服务器为每一位玩家打开一个阻塞socket,在一个单独的线程中,接受客户端传来的消息。
消息的传送与处理采用命令头加信息内容的方式。
即根据发出命令的类别不同,使用独一的字符串的表示,添加在所要发送消息的前面。
然后接受消息时,先分离命令头与内容,根据命令头,采用不同的函数去处理内容。
3扫雷游戏需求分析
3.1编写需求分析的目的
需求分析的主要任务即详细的找出程序所需要的各种功能实现。
本程序为扫雷游戏的实现,首先是要实现扫雷游戏的基本功能,根据扫雷游戏的玩法,设计程序,实现程序功能。
然后,将其添加为可以联机的网络版扫雷游戏。
3.2功组织结构图
根据任务书的要求,做出如下需求分析,如图3-1所示:
图3-1功能需求组织结构图
4扫雷游戏软件总体设计
4.1主要功能模块划分
整个程序的架构都由模块化结构,分层结构的思想设计完成。
从设计上主要分为两大模块
1.底层逻辑模块:
底层主要由两大模块构成,也是程序底层逻辑所需要的主要功能。
a)游戏逻辑模块:
完成扫雷游戏时的各种逻辑
b)通信模块:
完成客户端与服务器之间数据的收发
2.界程序设计的实现面功能模块:
界面模块属于上层模块,调用底层模块提供的各种借口,完成游戏游戏功能的实现。
并且提供丰富的人机交互界面,方便用户操作
程序主要功能组织结构图如图4-1
图4-1程序各模块组织结构图
游戏逻辑模块功能细分的组织结构图如图4-2所示:
图4-2游戏逻辑模块的组织结构图
4.2设计步骤流程
程序设计的流程主要为先实现单机扫雷,然后为单机扫雷添加上网络模块。
然后再利用同样的网络模块开发出服务器端程序,提供信息的中转服务。
单机扫雷的系统流程图如图4-3所示
图4-3单机扫雷系统流程图
网络扫雷的系统流程图如图4-4所示
图4-4网络扫雷系统流程图
最终,在实现了网络与单机游戏的基础之上,在为程序添加上一些其它功能。
如排行榜功能,保存功能等。
并且对程序的部分地方予以优化。
5扫雷游戏程序详细设计
5.1编写详细设计的目的
清楚的说明各个模块是如何实现的,各个模块的主要功能,设计程序时的思路等内容。
5.2单机版扫雷游戏的实现
5.2.1完成扫雷游戏底层逻辑的设计
1.设计实现:
在程序中,使用一个SweepGame类完成所有底层的游戏逻辑功能。
2.扫雷的底层表现形式:
使用二维数组存储当前游戏状态。
2D扫雷游戏,抽象的说来,游戏的实质即是在二维空间,不同的点之间所具有的不同状态,例如该格子是雷,可以用数字-1表示,该格子周围一个雷也没有,可以用0表示,。
使用二维数组能够完全表示所有地雷地图的数据。
并且,再利用另一个二维数组,用以表示当前点是否已被用户点击。
3.游戏基本属性:
地雷数组宽度,高度,地雷数量,游戏难度。
4.游戏状态:
游戏失败,游戏通关,游戏进行中
5.SweepGame类主要功能:
初始化游戏状态:
生成随机的地雷数组,根据生成的地雷位置,将其余并非地雷的位置填上数字,数字代表该格子周围八个格子里,有几个地雷。
。
设置游戏等级:
游戏等级分为四等:
初级,中级,高级和自定义。
其中,其三者都由默认设置设置游戏属性。
通过游戏等级的设置,间接设置游戏的基本属性。
扫雷逻辑实现:
即当用户点击鼠标,通过界面传入到SweepGame时,是作为SweepGame二维数组中的一个下标。
通过该下标所指示的地雷二维数组,判断用户是否踩到雷了,或者是数字。
然后,在进行下一步判断。
5.2.2扫雷游戏状态分类
当玩家扫雷时,即用鼠标左键点击一个格子时,有以下几种状态:
踩到雷:
游戏失败,结束游戏并且在界面中显示所有的雷。
点到的是数字:
显示数字,游戏继续。
若玩家点到的格子周围一颗雷也没有时:
就采用递归算法,继续向周围扩展。
当玩家点开所有的非雷的格子:
提示游戏通过,并且结束游戏。
扫雷底层逻辑关键函数分析:
publicboolcheckMines(intcol,introw){}
checkMine(int,int)函数的主要功能即是对传入的格子的坐标,判断当前格子是什么,然后根据此,判断下一步游戏该如何进行。
privatevoidserch(intcol,introw){}
Serch(intcol,introw)该函数由checkMines函数调用,用于根据该格子所显示的数字,实现游戏逻辑,该函数的实现使用了递归调用。
如果数字非0,则直接显示。
否则,就要向该格子的周围八个格子进行递归,继续查找下去。
并且,当翻开所有非雷格子后,更改游戏状态为游戏通关。
SweepGame类的功能如图5-1所示:
图5-1SweepGame类主要功能
5.3完成单机版扫雷游戏界面设计
5.3.1界面功能实现
1模仿windowsxp版本的扫雷界面,添加界面元素:
a)计时窗口
b)当前地雷剩余数窗口
c)扫雷面板
d)菜单栏
2.实现方式
计时窗口与当前地雷剩余数窗口用PictureBox控件实现。
用一个SpiltContainer控件划分两个Panel,分别添加扫雷面板和计时、地雷数窗口。
并且添加菜单控件。
3.功能的实现
a)菜单功能
开局:
根据当前游戏难度直接开始一盘新游戏
初级,中级,高级游戏设定:
根据选项设定游戏难度后开始新游戏。
自定义难度:
首先弹出游戏设置对话框,让用户设置扫雷游戏基本属性,然后根据用户设定的属性开始新游戏。
自定义对话框设计如图5-2所示:
图5-2自定义难度时弹出的对话框
b)扫雷面板功能
功能描述:
使扫雷面板接受鼠标事件,并根据不同的键,定义不同的功能。
鼠标左键定义:
打开该鼠标坐标所在的格子,并以此点开始执行扫雷逻辑。
鼠标右键定义:
点击一次时完成地雷的标记,点击两次对此点进行疑问标记。
点击三次消除标记。
5.3.2寻找素材,完成贴图
游戏中需要用到很多贴图,如下所示:
地雷,雷爆炸,问号,0~8大小数字图片等。
从网络上收索合适图片,使用PhotoShop对其进行裁剪,变换大小等操作。
5.3.3游戏界面与游戏底层逻辑之间的对应关系
根据格子的不同状态,显示不同的图片
1.未点击的格子---为一张蓝色带有立体感的纯色图片。
2.点击之后,非地雷的格子,显示其周围地雷的数量--直接有数字对应相应的数字图片,若果数字为0,则显示比未点击格子浅色的图片
3.地雷--对应地雷图片
4.点击地雷--对应地雷爆炸的图片。
5.3.4游戏界面展示
最终生成的中级难度的游戏界面如图5-3所示:
图5-3中级游戏难度
5.4单机游戏状态转换图
单机扫雷游戏的状态转换图如图5-4所示,描述了根据不同的事件,游戏的状态的转换:
图5-4单机扫雷状态转换图
5.5网络扫雷的实现
5.5.1完成扫雷客户端通信模块实现
1.C#提供的TcpClient类的使用
该类为TCP网络服务提供客户端连接,它提供了一些简单的方法,用于在同步阻止模式下通过网络来连接、发送和接收流数据。
tcpClient.Connect(ipAd,port);连接服务器的代码
tcpClient..Send(data);向服务器发送数据
2.通信模块
a)设计实现:
在程序中添加类Client,用它来完成与服务器的所有通信操作,如发送数据,接受数据等操作。
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所示:
f)发送功能的实现
通过底层函数:
privateintsendVarData(Sockets,byte[]data),函数功能为使用Sockets,向服务器附送数据,并且具有发送数据时,同时将数据的长度给发出去的功能。
其实现原理为封装了c#的socket类的send函数的使用。
中间层函数:
publicvoidsendData(stringcommand,stringmsg)函数,其目的为供其他函数传入相应的命令头和数据,然后其将命令与数据组合之后,再调用sendVarData将数据直接发送给服务器。
最上层函数:
上层函数根据消息类型的不同,分别建立不同的函数。
例如传递鼠标消息到服务器的函数publicvoidsendMousePosToParter(intxPos,intyPos){},参数为传入客户端鼠标坐标,然后将它封装成数据,调用sendData函数,将其传给服务器。
;
if(this.rightButtonFlag[;
if(this.visitedArray[;
if(this.mineArray[
serch(e)
{
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 { num=s.Send(data,curOffset,leftNum,SocketFlags.None); curOffset+=num; leftNum-=num; } returncurOffset; } privatebyte[]ReceiveVarData(Sockets) { byte[]byteSize=newbyte[4]; intrev; try { rev=s.Receive(byteSize,0,4,SocketFlags.None); } catch(SocketExceptione) { MessageBox.Show("与服务器连接已经断开"); this.stopClient(); owner.changePanel(owner.panelConSer); returnnull; } if(rev==0){returnnull;} intsize=BitConverter.ToInt32(byteSize,0); byte[]data=newbyte[size]; intcur=0,leftNum=size; intnum=0; while(cur { try { num=s.Receive(data,cur,leftNum,0); } catch(SocketExceptione) { MessageBox.Show("与服务器连接已经断开"); this.stopClient(); returnnull; } if(num==0){returnnull;} cur+=num; leftNum-=num; } returndata; } publicvoidrecivedData() { while(isConnected) { byte[]buff; len=netStream.Read(buff,0,buff.Length); buff=this.ReceiveVarData(tcpClient.Client); if(buff==null) { break;退出循环 } stringstr=ascCode.GetString(buff);buff的大小刚好就是容纳数据的 string[]token=str.Split(newchar[]{'|'}); stringcommand=token[0]; Console.WriteLine("客户端收到命令"+command); switch(command) { caseNetCommand.ADD_CLIENTLIST: useList.Items.Clear(); for(inti=1;i { owner.[i]); } break; caseNetCommand.ADD_CLIENT: owner.[1]); break; caseNetCommand.CLOSE_CLIENT: this.stopClient(); break; caseNetCommand.CHAT: this.[1]); break; caseNetCommand.PRIVCE_CHAT: this.(token[1]); break; caseNetCommand.NO_AGREE_JOIN: this.(token[1]); break; caseNetCommand.AGREE_JOIN: this.(token[1]); break; caseNetCommand.MOUSE_POS: this.[1],token[2]);break; caseNetCommand.EXIT_JOINGAME: this.[1]); break; caseNe
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 扫雷 游戏 毕业设计 论文
![提示](https://static.bdocx.com/images/bang_tan.gif)