NET推箱子课程设计报告Word文件下载.docx
《NET推箱子课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《NET推箱子课程设计报告Word文件下载.docx(23页珍藏版)》请在冰豆网上搜索。
1、目的、意义
本次课程设计的重要目的及任务就是将平时所学应用到具体设计中,能够熟练的应用学习中的各种方法。
重在提高自身的vb编程能力。
2、研究现状分析
1.系统结构的总体设计
决定系统的总体结构,包括整个系统分哪些部分,各部分之间有什么联系以及已确定的需求对这些组成部分如何分配等方面。
2.详细设计
对各功能模块的功能定义,说明模块之间的调用关系与接口(参数)。
3.编码及调试
根据详细设计的要求,按照统一的要求和编码规范,用C语言编码实现,同时负责每个模块的独立调试。
三、主要解决的问题
在整个的游戏实现过程中,主要有七个模块,开始,重新载入,选关,保存,载入存档,排行榜,退出这个七个。
在具体实现的时候主要问题有,按键的处理问题,在各种情况下,下一步分别是什么图片;
还有在撤销的时候,需要对上一步进行判断,在进行恢复退步。
选关的时候需要定义临时变量来传递玩家所选择的关数。
四、小组成员及分工情况
经典的推箱子是一个来自日本的古老游戏,目的是在训练人的逻辑思考能力。
在一个狭小的仓库中,要求把木箱从开始位置推放到指定的位置。
在仓库有障碍物,稍不小心就会出现箱子无法移动或者通道被堵住的情况,而且箱子只能推,不能拉,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务。
本游戏一共4关,由易到难。
有保存、载入存档、重新载入、选关及退出的功能。
(1)初始化包括屏幕初始化和每一关卡的初始化
(2)按键处理包括移动小人和移动箱子,通过移动上下左右或ASDW键来控制小人的移动,从而推动箱子,以把箱子推到指定的目的地为过关。
(3)每一关都可以重置。
(4)记录走的步数,创建文件,记录每关的最好成绩。
模块分工
朱陈立:
(1)所有Form的排版设计,控件的添加,属性的设置
(2)地图编译的编写
(3)地图的创建
赵杰:
实现游戏功能
(1)ASDW,上下左右键的事件处理
(2)实现游戏的开始,重载,选关,退出,撤销,保存,载入存档等功能
(3)计步功能,创建文件,记录每关的最好成绩
五、主要开发环境与工具、技术路线和解决方案
课程设计的实验环境
软件:
MicrosoftVisualStudio2005
课程设计的预备知识
熟悉VisualBasic.net程序设计的基本语法知识及常用技巧。
六、系统分析与设计
流程图
推箱子
七、系统编码
定义一个Maps类用来画出每一关的地图
PublicEnumBoxmap‘将Boxbmp定义成Enum
StoneWall=1‘代表石墙
NullBrick=2‘代表空路
StoneBrick=3‘代表砖头
OuterBox=4‘代表在洞外的箱子
InnerBox=5‘代表推进洞的箱子
NullHole=6‘代表空洞
OuterHole=7‘代表小人
InnerHole=8‘代表小人在洞内
EndEnum
PublicClassMaps
PrivateRowAsInteger‘定义行数为Row
PrivateLineAsInteger‘定义列数为Line
PrivateKindAsBoxmap‘定义Kind为Boxbmp
PrivateAtlasAsPictureBox‘定义地图集Atlas为picturebox
PublicSubNew(ByValiAsInteger,ByValjAsInteger)'
初使成员化变量,i,j传递的是行列数
Row=i:
Line=j
Atlas=NewPictureBox
Atlas.Location=NewPoint((Row-1)*30,(Line-1)*30)‘设置地图集的位置
Atlas.Size=NewSize(30,30)‘定义地图集的大小
Atlas.SizeMode=PictureBoxSizeMode.StretchImage
EndSub
PublicReadOnlyPropertyGetKind()‘得到图片类型
Get
ReturnKind
EndGet
EndProperty
PublicReadOnlyPropertyGetImage()‘获取图片
ReturnAtlas
PublicWriteOnlyPropertySetting()‘构建地图
Set(ByValValue)
Kind=Value
Atlas.Image=Image.FromFile("
"
&
Kind&
"
.bmp"
)‘从debug文件里读取读图图片
EndSet
EndClass
载入游戏界面的初始化设置
两个textbox在整个游戏中都设置为不可编辑的状态,其他的几个键后面根据函数需求设置
PrivateSubForm1_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load
Me.TextBox1.Enabled=False‘设置一些空间的属性值
Me.TextBox2.Enabled=False
Me.重新载入ToolStripMenuItem.Enabled=False
Me.选关ToolStripMenuItem.Enabled=False
Me.保存ToolStripMenuItem.Enabled=False
Me.载入存档ToolStripMenuItem.Enabled=False
Me.撤销ToolStripMenuItem.Enabled=FalseEndSub
EndSub
定义一些全局变量,再下面的多个程序块里都要用到
PrivatexxAsInteger'
设置地图的横坐标
PrivateyyAsInteger'
设置地图的纵坐标
Privatemap(,)AsMaps'
定义的一个地图类,获取地图信息
PrivaterowAsInteger'
读取地图的总行数
PrivatelineAsInteger'
读取地图的总列数
PrivatetotalAsInteger'
统计进洞箱子个数
PrivatestepnumAsInteger'
统计步数
PrivateroundAsString'
当前所在关卡
PrivateflagAsInteger=0'
记录上一步的操作 1上,2下,3左,4右
Privateflag1AsInteger=0'
记录上一步的操作有7个数,分别代表上一步出现的地图种类
定义一个记录的结构体
在后面游戏中的英雄榜中记录最好玩家是用到如下的结构体来存放数据
Structurerecorder
<
VBFixedString(10)>
DimLevelAsString‘定义成字符类型
DimPlayNameAsString
DimBestNumAsString
EndStructure
PrivaterecAsrecorder‘定义变量为记录类型
PrivaterecNumAsInteger‘定义变量为记录总条数
定义rec为recorder结构recNum为总的记录条数
ReadRound函数(用于读取关数,显示地图)
PublicSubReadRound(ByValsenderAsString)
DimfileAsString'
读取配置文件内容
Dimstr()AsString'
读取相关信息
Dimarr()AsString'
读取位置信息
Me.Panel1.Show()
stepnum=0‘记录玩家游戏时的总步数,并再在TextBox2中显示出来
TextBox2.Text=stepnum.ToString
TextBox1.Text="
第"
+sender+"
关"
TextBox1.BackColor=Color.Pink
IfVal(sender)=10Then'
当返回的地图参数是10时,说明此地图是玩家保存地图,要另外处理参数
FileOpen(1,"
recoderstemp.txt"
OpenMode.Input)'
打开记录地图关数和已走得步数
Input(1,round)'
将保存的关数赋给round
Input(1,stepnum)'
将保存已走得步数赋给stempnum
FileClose
(1)‘关闭文件
+round+"
TextBox2.Text=stepnum‘TextBox2中显示总步数
EndIf
Try
IfNotIO.File.Exists("
Game"
.ini"
)Then
ExitSub'
如果文件不存在直接退出函数
EndIf
'
第几关文件读取,函数变量代表第几关
OpenMode.Input,OpenAccess.Read)‘打开地图文件
Input(1,file)‘读取地图
str=file.Split("
$"
)'
相关信息读取
arr=str
(1).Split("
#"
第几关信息读取
row=CType(arr(0).Substring(0,2),Integer)'
读取地图的行数
line=CType(arr(0).Substring(2,2),Integer)'
读取地图的列数
xx=CType(arr(0).Substring(4,2),Integer)'
读取小人起始位置的横坐标
yy=CType(arr(0).Substring(6,2),Integer)'
读取小人起始位置的纵坐标
total=CType(arr(0).Substring(8,2),Integer)'
读取地图共有多少个空洞
ReDimPreservemap(row,line)‘重定义并保存当前的地图参数
ForiAsInteger=1Torow'
利用当前的地图参数读取地图图片
ForjAsInteger=1Toline
map(i,j)=NewMaps(i,j)‘得到新的地图
map(i,j).Setting=CType(arr(i).Substring(j-1,1),Integer)‘设置新的地图
Next
ForiAsInteger=1Toline'
在Panel中拼接地图
ForjAsInteger=1Torow
Me.Panel1.Controls.Add(map(i,j).GetImage)‘画出新的地图
Me.Panel1.Size=NewSize(row*30,line*30)'
窗口大小计算
Me.Size=NewSize(row*45,line*38)‘设置Form的size,随着地图的大小自动调整窗口的大小
CatchexAsException
无条件退出该函数
EndTry
开始
点击开始键,游戏自动开始第一局游戏
PrivateSub开始ToolStripMenuItem_Click(…)ndles开始ToolStripMenuItem.Click
开始ToolStripMenuItem.Enabled=False‘开始之后将开始键设置为不可点击
重新载入ToolStripMenuItem.Enabled=True‘载入了游戏之后将重新载入设置为可点击
选关ToolStripMenuItem.Enabled=True‘载入了游戏之后将选关设置为可点击
round=1'
程序启动时加载第一关‘将计存关数的变量赋初值为1
ReadRound("
0"
+round.ToString)
Boxman_InoutGo()函数
PrivateSubBoxman_InoutGo()'
判断小人运动之前是在洞外还是洞内
Ifmap(xx,yy).GetKind=Boxmap.OuterHoleThen
map(xx,yy).Setting=Boxmap.NullBrick‘如果当前是小人则下一步是将当前map(xx,yy)变为空地
ElseIfmap(xx,yy).GetKind=Boxmap.InnerHoleThen
map(xx,yy).Setting=Boxmap.NullHole‘如果当前是在洞内的小人,则下一步当前怎变为空洞
Boxman_Gameover()函数
PrivateFunctionBoxman_Gameover()AsBoolean‘判断游戏是否结束
DimtAsInteger=total‘定义临时变量t等于总的洞的个数
ForiAsInteger=1Torow‘扫描每行每列
ForjAsInteger=1Toline
Ifmap(i,j).GetKind=Boxmap.InnerBoxThen
t-=1‘扫面地图时每次遇到进了洞的箱子就将t减1,以便下一步的判断
Ift=0Then‘由上面的步骤之后,当t等于0时说明图中的进洞的箱子和地图中的洞的个数相同,则说
ReturnTrue‘明游戏玩完成过关了,返回true
Else
ReturnFalse‘如果没有过关则返回False表设计没有过关
EndFunction
KeyDown函数
游戏中的上下左右键的处理函数
PrivateSubformMain_KeyDown(…)HandlesMyBase.KeyDown
Me.撤销ToolStripMenuItem.Enabled=True
SelectCasee.KeyCode
CaseKeys.W,Keys.Up'
处理上键
flag=1'
用flag来标记按下的是上下左右中的哪个键,1上,2下,3左,4右
flag1=0'
将flag1的初始值设为0,当满足下列的情况是flag1值不变
SelectCasemap(xx,yy-1).GetKind
CaseBoxmap.StoneWall'
小人前面是石墙,不做处理
CaseBoxmap.NullBrick'
当下一步坐标上是空路时,小人直接移动,flag1=1
Boxman_InoutGo()
map(xx,yy-1).Setting=Boxmap.OuterHole
yy-=1'
小人纵坐标改变了
stepnum=stepnum+1‘游戏中小人每成功移动一小格则步数加1
flag1=1
CaseBoxmap.StoneBrick
CaseBoxmap.OuterBox'
小人前面有箱子,且箱子不在洞内
SelectCasemap(xx,yy-2).GetKind'
判断箱子上面是什么
CaseBoxmap.StoneWall'
箱子前面是石墙,不做处理
箱子前面是空路时,flag1=2
map(xx,yy-1).Setting=Boxmap.OuterHole'
小人直接移动
map(xx,yy-2).Setting=Boxmap.OuterBox'
箱子直接移动
yy-=1
flag1=2
CaseBoxmap.OuterBox
CaseBoxmap.InnerBox
CaseBoxmap.NullHole'
箱子前面是空洞时,flag1=3
map(xx,yy-1).Setting=Boxmap.OuterHole'
map(xx,yy-2).Setting=Boxmap.InnerBox'
箱子直接移,且设为进洞的箱子
yy-=1
flag1=3
CaseBoxmap.OuterHole
CaseBoxmap.InnerHole
EndSelect
CaseBoxmap.InnerBox'
小人前是进洞的箱子,flag1=4
CaseBoxmap.StoneWall
CaseBoxmap.NullBrick'
箱子前面是空路时,flag1=4
map(xx,yy-1).Setting=Boxmap.InnerHole'
小人直接移动,且设为小人在洞内
'
箱子直接移动,且设置为在洞外的'
箱子
flag1=4
CaseBoxmap.StoneBrick
CaseBoxmap.NullHole'
箱子前面是空洞时,flag1=5
map(xx,yy-1).Setting=Boxmap.InnerHole'
箱子直接移动,且仍为在进洞的'
flag1=5
小人前面是空的洞
flag1=6
CaseKeys.S,Keys.Down'
处理下键,处理与上面类似,在这不再详细注释
…
CaseKeys.A,Keys.Left'
处理左键,处理与上面类似,在这不再详细注释
CaseKeys.D,Keys.Right'
处理右键,处理与上面类似,在这不再详细注释
CaseElse
Me.TextBox2.Text=stepnum.ToString‘将步数显示在TextBox中
IfBoxman_Gameover()=TrueThen'
判断游戏十是否结束
DimtempAsInteger=Val(round)
recorder.dat"
OpenMode.Random,,,Len(rec))‘打开存放记录的文件
FileGet(1,rec,temp)‘将记录写进文件
IfVal(rec.BestNum)=0Then‘当文件里是空的记录是,则显示如下信息
rec.PlayName=InputBox("
你是第一个玩家,请输入大虾的名号"
)
rec.BestNum=TextBox2.Text&
Chr(13)&
Chr(10)
FilePut(1,rec,temp)
‘将第一个玩该游戏的玩家的信息写进文件,以后的记录是否存放都一次为标准
ElseIfTextBox2.Text<
rec.BestNumThen
了不起啊,破了纪录啦,请输入大虾的名号"
rec.BestNum=Text