基于VS的扫雷游戏设计毕业论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要
当今社会的生活节奏越来越快,人们的压力日渐提高,扫雷作为一款经典的游戏,这款经典小游戏在提高人的逻辑推理能力与判断能力时还可以充分的享受娱乐。
本次毕业设计我们以VisualStudio2012为开发环境,设计并开发了基于VS的扫雷。
本应用软件针对逻辑推理能力的培养与游戏娱乐行,采用软件工程中结构化思想、标准的软件设计流程,从可行性研究、需求分析、系统设计及系统实现和测试等步骤来开发,基于VS开发平台,采用C++语言编写
关键词:C++;扫雷;游戏;
目录_Toc483039834
弓I言 (1)
第2章需求分析 (2)
1.1开发背景 (2)
1.2Visual Studio开发平台的优势 (2)
1.3需求分析及设计目标 (3)
第2章总体蚪 (4)
2.1设计规划 (4)
2.2功能模块设计 (4)
2.3功能模块流程 (4)
3.第3章程序界面设计 (6)
3.1开发及运行环境 (6)
3.2创建项目 (6)
3.3界面各模块的设计 (7)
第4章主要暨代码 (12)
4.1主程序的实现 (12)
4.2功能测试 (21)
总结 (1)
致谢 (2)
参考文献 (3)
引言
扫雷,在科学和技术发展史上的作用类似。
扫雷关于数字的谜最初是从20世纪60年代和70年代,那时已经流行Jerimac拉特利夫的〃多维数据集〃游戏。
几十年后,于1992年,在扫雷艇加入Windows 3.1,它不仅显示是专家在Windows作业系统的游戏,而且让用户属性鼠标周围基本功能,让我们操作变得非常自然,并培养鼠标移动速度和准确性。
第一个版本的扫雷游戏来自1973年称为〃方形〃的游戏。
在Rlogic中,球员的任务是作为英国海军陆战队,作为一种矿安信息中心任务,如果这条路被地雷围困那么你失去一切。
五年后,汤姆格开发游戏,〃地雷〃基于Rlogic平台,奠定了现代的扫雷游戏。
几十年前,罗伯特-多尔和约翰逊两个程序员在微软Windows3系统加入游戏,扫雷游戏开始蔓延到全世界游戏的操作原则包括单击操作、右键单击和双击。
左边的按钮用来打开一个安全的格子,加快游戏。
用鼠标右键单击标记地雷,然后帮助作出的决定,或准备以后双击。
第一章需求分析
1.1开发背景
C是流行的计算机编程语言,被广泛应用。
C语言的设计目标是提供一种简单的方法来编译和生成少量的机器代码并不关心任何运行时支持可能运行的编程语言。
虽然C语言的功能支持许多低级处理,但仍然保持一个跨平台的功能,如标准规格写C语言可以编译的程序。
在许多计算机平台,包括甚至一些内置的编辑器(MCU或单片机)。
1.2Visual Studio开发平台的优势
Microsoft Visual Studio2012是微软的推广开发环境。
VS2012是目前使用最广泛的开发环境Windows平台。
VS2012支持框架4框架,它支持64位的Windows,并且支持多个监视器。
Visual Studio2012是一个集成的环境,简化了创建、调试和部署应用程序的基本任务。
1.3需求分析及设计目标
随着时代的发展和人民生活水平的提高,游戏已经成为老百姓的日常生活中不可或缺的娱乐手段,而游戏被批评为有害的,但研究人员试图通过电子的博弈特点,用来帮助人们,让生活更美好。
这次扫雷游戏的设计的特点,不只是让人上瘾,而且可以使人对应电子游戏的态度做正确的转换。
计算机游戏有非常大的用处,比如通过计算机游戏功能,可以让孩子多吃蔬菜,有助于老年人保持大脑灵活性,甚至想用视频游戏来解决社会问题,如贫困和气候更改。
而扫雷游戏作为本次的毕业设计有着很大的用处。
扫雷游戏的整体形象通过点击一个方块,如果在这场比赛中,你想通过布满地雷的广场,那么它可能是几个小时的游戏过程。
作为一场普通的比赛,扫雷是一款为儿童和成人的休闲游戏,可以非常有效的消磨时间。
并且在同时锻炼游戏者的逻辑思维能力和判断力,对儿童是一种很好的思维启蒙手段。
第2章总体设计
2.1设计规划
扫雷的主要问题:
第一是编制的问题,包括数目随机游戏这次射线、射线布局为每个小面积约如何获取区域分布的光线数量等。
第二个是鼠标事件处理程序中,这是鼠标事件应该如何应对这场比赛。
去了解用户的意图,然后做相应的动作,再次导入清除的雷区,通过编写递归程序,该程序将成为比较全面的代码。
最后,布局管理团队(蓝图)用于整体布局。
2.2功能模块设计
使用c++接口设计语言编写扫雷完成,实现了定时的扫雷游戏,重新启动,难度设置、排名、帮助等。
它也增加了比赛的能力,以显示对话框时成功或失败。
一般情况下,已完成规划的功能要求。
但仍有一些缺点,如规划"扫雷游戏",可以添加一些背景音乐,到背景图像、视频等,将添加到娱乐。
2.3功能模块流程
1main()主函数
定义常数、全局变量和函数原型使用。
然后,准备图形系统,称为审计模式游戏、游戏接受只鼠标、游戏成为任意键退出游戏,关闭图形系统,
该程序已完成。
2Control。
游戏控制函数
调用GameBegin()函数显示原始的游戏界面,操作过程的特定游戏叫游戏(),函数返回值有两个功能:一种戏剧,早期游戏结束?
一种游戏、失败或赢得。
如果是前者,比赛重新开始,如果这是最后一次,,然后决定笑脸,请单击,然后再次启动。
否则,退出程序。
3GameBegin()画初始界面
此函数完成的原始接口设计和随机生成的地雷数量。
原始界面的主要工作是确定图表的位置与网格的位置。
在左上角的外边框(190,60)和较低的右角是(390、290),这表明该地区的笑脸,我的号码(190,60)-(390,
90)宽度和高度的每个网络是16。
4DrawSmile。
画笑脸
利用画椭圆函数fillellipse()和bar()画笑脸,设置好填充模式。
第3章程序界面设计
3.1开发及运行环境
本程序开发用的是Windows?系统,开发软件用的Visual Studio2012,在进行程序的开发之前,我们需要安装Visual Studio2012,在安装好Visual Studio2012后,在开始程序的开发。
3.2创建项目
在Visual Studio2012中创建一个名为Clear Mine的项目,项目框架如图3-1所示.
解知5案资源官理器▼毕尺返物
G•Q01r®'的
搜素解沃方案堂源旨朝吊P■
回Clear Mine
」应Properties
P C*Assemblylnlo.es
l>Ql Resources.resx
工{Jb Settings-settingg.
I>"l^I S-&ttings.De*signer.c
|>引用
-n
A营bin
Q App.config
h[U Forml.cs
A c*Program.es
图3T项目框架木意
3.3界面设计
人机交互界面设计核心代码如下。
usingSystem.Windows.Navigation; usingSystem.Windows.Sha pes; usingAForge;
usingAForge.Video;
usingAForge.Video.FFMPEG; usingComLibrary;
usingIPCameraDII;
usingMyCamerN;
usingSystem.Windows.Threading; usingSystem.10.Ports;
using System.10;
usingNewtonsoft.Json;
(
///<summary>
///MainWindow.xaml的交互逻辑
III</summary>
public partial class MainWindow:Window {
publicMainWindow()
lnitializeComponent();
)
IpCameraHelpersxt;
boolbl=false;
VideoF ileWritervfw=new VideoFileWriter();
DispatcherTimertl;
DispatcherTimer t2;
web.WebSoapCIientzb=new web.WebSoapClient();
#region开始
private void W indow_Loaded_l(object sender;Routed Event A rgs e) {
sxt=new IpCameraHelperf
"10.2.66.10",
"admin",
Illi
9
new Action<lmageEventArgs>((a)=>(
img.Source=a.FrameReadyEventArgs.Bitmapimage;
if(bl)
{
BitmapEncoder be=new BmpBitmapEncoder();
be.Frames.Add(BitmapFrame.Create(a.FrameReadyEventArgs.Bitm
aplmage));
Memorystream ms=new MemoryStream();
be.Save(ms);
System.Drawing.Bitmap bit=new System.Drawing.Bitmap(ms);
if(vfw.lsOpen)
(
vfw.Wr i t e V id eo F ra m e(bit);
)
)
}));
sxt.StartProcessingO;
tl=new DispatcherTimer();
tl.Interval+=newTimeSpan(0,0,5);
tl.Tick+=new EventHandler(shijan);
t2=new DispatcherTimer();
t2.Interval+=new TimeSpan(O,O,l);
t2.Tick+=new EventHa ndler(zigbee);
t2.Start();
)
#endregion
#region开始
private void Window_Closed_l(object sender,EventArgs e)
vfw.Dispose();
vfw.Close();
}
private void cbox_video_Click(object sender;RoutedEventArgs e) {
if(cbox_video.lsChecked==true)
{
tl.Start();
bl=true;
}
else
{
tl.Stop();
bl=false;
vfw.Dispose();
vfw.Close();
)
)
人机交互界面效果图,如图3-2所示.
图3-2界面效果图
第4章主要程序代码
4.1主程序的实现
主程序的核心代码具体如下。
usingIPCameraDll:
usingMyCamerN;
usingSystem.Windows.Threading;
usingSystem.10.Ports:
using System.10;
usingNewtonsoft.Json;
{
///<summary>
///MainWindow.xaml
///</summary>
public partial class MainWindow:Window {
pub1i cMa i nW i nd ow()
{
InitializeComponent();
}
IpCameraHelpersxt;
boolbl=false;
VideoFileWritervfw=new VideoFileWriter(); DispatcherTimer tl:
DispatcherTimer t2;
web.WebSoapClientzb=new web.WebSoapClient();
^region开始
private void Window Loaded1(object sender,RoutedEventArgs e)
{
sxt=new IpCameraHelper(
"10.2.66.10”,
admin>
〃//
new Action<ImageEventArgs>((a)=>{
img.Source= a.FrameReadyEventArgs.Bitmapimage;
if(bl)
{
BitmapEncoder be=new BmpBitmapEncoder();
be.Frames.Add(BitmapFrame.Create(a.FrameReadyEventArgs.Bit mapimage));
MemoryStreamms=new MemoryStrearn();
be.Save(ms);
System.Drawing.Bitmap bit=new System.Drawing.Bitmap(ms): if(vfw.IsOpen)
{
vfw.WriteVideoFrame(bit);
}
}
}));
sxt.StartProcessing();
tl=new DispatcherTimer();
tl.Interval+-new TimeSpan(0,0,5);
tl.Tick+-new EventHandler(shijan):
t2=new DispatcherTimer();
t2.Interval+=new TimeSpan(0,0,1);
t2.Tick+=new EventHandler(zigbee);
t2.Start();
ttendregion
^region开始
private void zigbee(object sender,EventArgs e) {
try
{
var s=zb.zigbeeget();
if(s==null)
{
return;
}
jinq j=JsonConvert.DeserializeObject<jinq>(s); Dispatcher.Invoke(()=>
{
Ib fire.Content=j.Fire:
lb invade.Content=j.Person;
lb smoke.Content=j.Smoke;
~});
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
ttendregion
private void shijan(object sender,EventArgs e) {
vfw=new VideoFileWriter();
string fire=㈣"f:\videos”;
if([Directory.Exists(fire))
{
Directory.CreateDirectory(fire);
}
DateTimedt=DateTime.Now;
fire=fire+〃//"+dt.ToString("yyyyMMddHHmmss")+avi”; if(vfw!=null)
vfw.Dispose();
vfw.Close();
}
vfw=new VideoFileWriter();
vfw.Open(fire,640,480,22,VideoCodec.Default);
}
private void Button Click l(object sender,RoutedEventArgs e) {--
if(sxt!=null)
{
sxt.PanUp();
}
}
private void Button_Click_2(object sender,RoutedEventArgs e) private void Button_Click_3(object sender,RoutedEventArgs e)
{--
if(sxt!=null)
{
sxt.PanLeft();
}
}
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea; import javax.swing.JTextField;
public class
JCheckBox
JCheckBox
JCheckBox
JCheckBox LY extends JFrame implements ItemListener( jcbxl=new JCheckBox();
jcbx2=new JCheckBox();
jcbx3=new JCheckBox();
jcbx4=new JCheckBox():
JLabel jbl=new JLabel():
JLabel jb2=new JLabel():
JTextField jtl=new JTextField(10):
public LY(){
super();
setSize(500,500);
setLayout(new BorderLayout());
JPanel jpl=new JPanel():
JPanel jp2=new JPanel():
JPanel jp3=new JPanel();
jpl.setLayout(new FlowLayout()):
jpl.add(jcbxl);
jpl.add(jcbx2);
jpl.add(jcbx3);
jpl.add(jcbx4);
jp2.setLayout(new BorderLayout());
jp3.setLayout(new FlowLayout()):
jp3.add(jbl);
jp3.add(jb2);
jp3.add(jtl);
add(jpl,BorderLayout.NORTH);
add(jp2,BorderLayout.CENTER);
add(jp3,BorderLayout.SOUTH);
jcbxl.addltemListener(this);
jcbx2.addltemListener(this);
jcbx3.addltemListener(this);
jcbx4.addltemListener(this);
setVisible(true);
public static void main(String[]args){ new LY();
©Override
public void itemStateChanged(ItemEvent argO){
String str=〃〃;
if(jcbxl.isSelectedO)
str=str+jcbxl.getText();
if(jcbx2.isSelectedO)
str=str+jcbx2.getText();
if(jcbx3.isSelectedO)
str=str+jcbx3.getText();
if(jcbx4.isSelectedO)
str=str+jcbx4.getText();
jtl.setText(str);
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
usingSystem.Windows;
usingSystem.Windows.Controls;
usingSystem.Windows.Data;
usingSystem.Windows.Documents;
usingSystem.Windows.Input;
usingSystem.Windows.Media;
usingSystem.Windows.Media.Imaging;
usingSystem.Windows.Navigation;
usingSystem.Windows.Sha pes;
usingAForge;
usingAForge.Video;
private void Window_Closed_l(object sender,EventArgs e)
{
vfw.Dispose();
vfw.Close();
)
private void cbox_video_Click(object sender;RoutedEventArgs e) {
if(cbox_video.lsChecked==true)
{
tl.Start();
bl=true;
)
else
{
tl.Stop();
bl=false;
vfw.Dispose();
vfw.Close();
}
package Gui;
import java.awt.BorderLayout;
import ponent;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.儿a bel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing JTextField;
public class login extends JFrame implements ActionListener( JLabel jlbuer=new JLabel();
JLabel jlbpass=new JLabel(;
JTextF ield jtfuserF ield=new JTextF ield(10);
JTextField jtfuser=new JPasswordField(lO);
JButton jbtnok=new JButton("确定");
JButton jbtncan=new JButton("取消,
public login()(
super("登录");
setSize(250,140);
JPanel jpl=new JPanel();
JPanel jp2=new JPanel();
JPanel jp3=new JPanel();
jpl.setLayout(new FlowLayout());
jpl.add(jlbuer);
jpl.add(jtfuserField);
jp2.add(jlbpass);
jp2.add(jtfuser);
jpS.add(jbtnok);
jp3.add(jbtncan);
add(jpl,BorderLayout.NORTH);
add(jp2,BorderLayout.CENTER);
add(jp3,BorderLayout.SOUTH);
jbtnok.addActionListener(this);
jbtncan.addActionListener(this);
setVisible(true);
}
public static void main(String[]args){
new login();
)
©Override
public void actionPerformed(ActionEvent s){
if(s.getSource()==jbtnok)(
if(jtfuserField.getText().toString().trim().equals("0")
&&jtfuser.getText().toString().equals("O l1))
System.out.println("登录成功");
else
System.out.println("你输入你账号或密码有误,请重新输入!!11);
)
else
System.exit(O);
)
)
启动程序,工控机通过函数OpenComConfig()来打开与3G模块相连的串口,并设置好串口的波特率、数据位、停止位、校验位以及输
入或输出消息队列最大队列数。
并且执行函数SetCTSMode()来关闭硬件流控制。
程序通过串口输入3G模块设置APN指令AT+CGDCONTo然后,再 发送3G模块TCP初始化AT指令ATAIPINIT,TCP初始化需要模块先设置好APN,初始化响应需要3秒等待。
初始化成功,工控机发送建立TCP 连接的AT的ATEPOPEN,其中云服务器的公网IP地址为120.27.93.199,网络端口为5002。
与云服务器的TCP建立成功,等待工控机与心电仪的TCP建立成功。
工控机与心电仪的TCP建立成功,心电仪每秒发送一次数据,工控机接收到数据放入缓存数组readbufo工控机通过串口向3G模块输入AT指令AFMPSENDEX,需要0.2秒等待模块响应,再次输入缓存数组readbuf的值,向云服务器发送数据包。
如果工控机与心电仪的TCP
连接没断开,那么工控机每接收一次数据包,并向云服务器发送一次数据包。
否则,向串口输入关闭TCP连接的AT指令ATNPCLOS。
回应指令杂乱,难以通过回应判断是否成功,最稳妥的是设置延时来判断。
4.2功能测试
(1)运行扫雷,开始游戏。
游戏界面如图4-2-1所示
回
七扫雷
图4-2-1游戏开始界面图
(2)开始游戏,点击笑脸图片,左侧数字为当前雷数,右侧数字为当前游戏时间显示界面,如图422所示.
图4-2-2游戏显75图
人机交互游戏显示界面核心代码。
private void zigbee(object sender;Eve nt A rgs e) (
try
{
var s=zb.zigbeeget();
if(s==null)
{
return;
)
jinq j=JsonConvert.DeserializeObject<jinq>(s); Dispatcher.!nvoke(()=>
(
I b_f i re.Content=j.Fire;
lb_invade.Content=j.Person;
lb_smoke.Content=j.Smoke;
});
)
catch(Exception ex)
(
MessageBox.Show(ex.Message);
)
)
#endregion
private void shijan(object sender;EventArgs e)
vfw=new VideoFileWriter();
string fire=@"f:\videos";
if(IDirectory.Exists(fire))
(
Directory.CreateDirectory(fire);
}
DateTimedt=DateTime.Now;
fire=fire++dt.ToStringC'yyyyMMddHHmmss")+".avi";
if(vfw!=null)
{
vfw.Dispose();
vfw.Close();
}
vfw=new VideoFileWriter();
vfw.Open(fire,640,480,22,VideoCodec.Default);
)
private void Button_Click_l(object sender;Routed Eve nt A rgs e) {
if(sxt!=null)
(
sxt.PanllpO;
)
)
private void Button_Click_2(object sender;Routed Eve nt A rgs e)
if(sxt1=null)
(
sxt.PanDown();
}
}
private void Button_Click_3(object sender;Routed Eve nt A rgs e)
{
if(sxt1=null)
{
sxt.PanLeft();
)
}
private void Button_Click_4(object sender;Routed Eve nt A rgs e)
{
if(sxt1=null)
{
sxt.PanRight();
)
)
(3)点击格子,根据自己的逻辑思维判断雷以及有可能存在的雷。
如图4-3.
回宴「
图4-3游戏过程示意图
扫雷失误点击到藏有雷的格子,如图4-4所示.(4)
图4-4游戏失败示意图(5)游戏失败,点击笑脸可以重新开始游戏
总结
本次基于的C++的扫雷毕业设计,我认为设计的C++排雷游戏已经基本上掌握,使用VisualStudio2012,基于windows系统,并且编程可以促进自己的思维能力,并且此次设计可以丰富人民的娱乐游戏时间,能够玩游戏并且培育和发展逻辑思考能力。
因为我学习浅,所以编程能力还弱,在此次毕业设计上还有很多的不足的地方,以后在学习C+ +的过程中,我会更深入的学习C++知识,并且开发的过程让我产生了非常大的兴趣,希望加强自身C++知识,希望以后能在老师的帮助下更多完善排雷程序。
致谢
谢谢物流学院对我大学三年的培养,让我学到很多,在大学三年来,特别感谢物流信息系统提供了很好的学习环境,感谢领导和老师在三年的无微不至的关怀和指导我,让我在这三年里学到很多有用的知识。
在这里,我还要感谢我的同学和我的朋友遇到麻烦的时候帮助我,给我支持和鼓励。
谢谢。
对于谢金龙教授的指导特别感谢,给了我发展方向,帮助我处理在设计上的很多困难,给了我鼓励和指导,让我克服困难,才能使系统完成,谢金龙教授在生活上无微不至的照顾并且在学习知识的过程中为我解开我的疑问,对我大学三年来的知识的学习起到了非常重要的作用,在此向谢金龙老师表示真诚的感谢!
谢谢!
2
参考文献
[1]本贾尼;斯特劳斯特鲁普(作者),王刚(译者)C++程序设计语言(第1-3部分)(原书第4版)人民邮电出版社
[2]萨特(Herb Sutter)(作者),安德烈亚历克斯安德莱斯库(Andrei Alexandrescu)(作者),刘基诚(译者)C++编程规范:101条规则、准则与最佳实践人民邮电出版社
[3]郭更麒,王愧林.数据库原理与应用一一SQL Server2005项目教程国].北京:中国水利水电出版社,2009
[4]邵鹏鸣主编.C#面向对象程序设计国].北京:清华大学出版社,2009
[5]杨克玉,阮进军,C#程序设计M.北京:中国水利水电出版社, 2014年1月
[6]余东,程序设计[M].北京:中国水利水电出版社,2014年6月
[7]吴明辉.ASP网络办公开发国].人民邮电出版社,2003
[8]庞亚娟,房大伟,张跃延.SQL Server应用与开发宝典.北京:人民邮电出版社,2009.10[4]丁宝康.数据库原理.北京:经济科学出版社,2004.1
[9]朱印宏.ASP基础与案例教程国].北京:中国水利水电出版社,2007年6月
[10]李旗编著,信息系统分析与设计国].职教论坛,2008年1
3
4。