计算机实习报告样本3VB版俄罗斯方块.docx
- 文档编号:30044887
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:22
- 大小:329.33KB
计算机实习报告样本3VB版俄罗斯方块.docx
《计算机实习报告样本3VB版俄罗斯方块.docx》由会员分享,可在线阅读,更多相关《计算机实习报告样本3VB版俄罗斯方块.docx(22页珍藏版)》请在冰豆网上搜索。
计算机实习报告样本3VB版俄罗斯方块
一、问题描述
游戏类第1个任务——俄罗斯方块游戏开发:
编程,实现俄罗斯方块游戏的设计,使得用户可以通过键盘操作,玩游戏,并且在游戏过程中得到必要的信息提示和操作提示,游戏结束时,得到操作基本统计信息通报。
二、需求分析
(这一部分主要是确定要做什么,以及问题的边界。
如对于本例,主要给出游戏软件的功能,描述操作的特性等。
具体来说,就是给出程序的基本功能和性能,设计问题的输入/输出)
俄罗斯方块游戏软件的功能有:
(1)提供游戏操作画面。
即给出游戏操作软件的主界面,这也是程序接收游戏者输入的操作界面。
如图所示:
(2)提供游戏功能。
游戏是控制7种形状的下坠物落入游戏区。
游戏用键盘操作控制,其中按J,下坠物左移一格;按L,下坠物右移一格;按K,下坠物逆时针旋转90度;按I,下坠物下降速度加快一倍。
假设本程序的游戏规则是:
(a)游戏时,游戏区域上方不断地出现预定义游戏的下坠物。
下坠物会不断地往下坠,直到它接触到游戏区域的底部或其他之前已经累叠起来的下坠物。
(b)当一个下坠物到达游戏区域底部后,它将占据游戏区域的相应位置,并稳定住。
(c)当游戏区域的某一行被下坠物填满,则该行的所有下坠物被消除,垒在其上的下坠物会自动下降,占据该行空间。
(d)下坠物在下坠过程中可以被控制,发生旋转。
(e)游戏结束条件是:
下坠物累叠到游戏区域的顶部,即某列的下坠物“顶满”游戏区。
游戏者单击“Esc”按钮,强制结束游戏。
(3)程序输出。
提供游戏操作的统计信息。
假设本程序在游戏者操作及结束时,提供如下输出信息,帮助游戏者了解程序状态。
(a)在游戏时,提前显示出下一个下坠物,方便游戏者规划好正在下坠的游戏块的放置位置。
(b)在游戏时,及时显示当前积分。
积分规则是:
每个下坠物进入游戏区,积20分;每销除一行,积100分;
(c)提示游戏的难度级别。
游戏难度的划分,以下坠物下坠速度来划分,初级,下坠速度是2秒;中级速度是1秒;高级速度是0.5秒。
(d)游戏结束时,显示“一共操作了几块下坠物,积分总数,时间”
程序中有如下性能:
(1)不同下坠物填充不同的颜色,便于区分不同下坠物的形状。
(2)提供排行榜,记录每个级别前3名得成绩。
三、程序设计
(这一部分主要是说怎么做,以及语言环境对问题处理的特殊影响。
如下例所示,游戏区域的表示,下坠物的形状表示,辅助数据结构,结果输出格式。
具体来说,就是给出程序的数据结构,模块划分,主要的算法流程,主程序结构)
游戏区域是由一系列的小方格组成,如下图所示:
针对需要做如下设计:
(1)数据结构设计
(a)游戏区域
假设游戏区域是一个二维数组,假设行最大值为21,列最大值为15。
当方格子没有被占据,则取值=0;被占据了,且下坠物不再移动,则取值=1;如果是被移动中的下坠物占据,则取值=2。
MAX_ROW=21;
MAX_COL=15;
intm_stateMap[MAX_ROW][MAX_COL];//取值为0,1,2
(b)游戏下坠物的图形及形状
分析如下下坠物图形,发现每个下坠物都是由4个小方格组成。
当按动旋转键时,下坠物将按照逆时针方向不断旋转,7种下坠物旋转状态如下。
其中,下坠物4、5、6有两种状态,下坠物1只有一种状态,其他3种下坠物有四种状态。
设计二维数组Status[7][4]记录不同下坠物的不同状态。
由以上下坠物图形描点可以看到,每幅图有4个坐标点中有值。
即Status[7][4]的元素是4个坐标点,在此定义坐标点的结构是:
TypeDOT
x,yAsinteger
EndType
所以7种下坠物的4种形状的存储空间是:
Status[7][4][4]AsDOT。
这里7,表示7种下坠物,第一个4是4种形状,第二个4是4个坐标DOT。
为了方便程序处理,把7种下坠物都统一到有4种状态,也就是下坠物4、5、6冗余两组取值2遍,下坠物1冗余一组取值4遍。
例如第1,2种下坠物的取值如下:
第1种田字下坠物坐标
其1,2,3,4形状都取值
2223
3233
两种倒L下坠物坐标
其1形状其2形状其3形状其4形状
22232223241223
333222313233
433233
每次操作的活动下坠物是以上7种下坠物的某种形状,定义当前被操作的活动下坠物块存储空间是ActStatus[4]AsDOT,取值是某一组4个坐标值。
(c)下一个下坠物形状块
下一个下坠物形状块与游戏中的形状相同,只是它不发生旋转,只取下坠物的第1种形状的取值,在此设计curStatus[4]AsDOT临时存储它的值。
(d)统计信息
积分统计值inttotalScore。
使用的时间intcurTimer
已经出现过的下坠物个数intObjectNumber。
(2)界面设计
黄色区域,显示当前要操作的下坠物。
蓝色区域,显示下一个下坠物。
写有数组的区域,游戏区域。
时钟1,下坠物自动下坠定时控制。
时钟2,使用时间计时,按“second”修改显示时间累计值。
(3)操作代码设计
(a)Start按钮操作
俄罗斯方块游戏开始由单击“Start”按钮开始,Start按钮的操作功能是:
初始化游戏,即清空游戏区间、当前下坠物显示区、下一下坠物显示区,随机选择第一个下坠物,随机选择下一个下坠物,积分、计时、下坠物块个数等值清0,启动计时等。
(b)End按钮操作
结束游戏,显示统计结果:
用时、积分、下坠物块数,等用户看好后,可以关闭游戏操作。
(c)游戏操作
这组操作是靠按键来实现。
代码是写在时钟1(GameTimer)定时方法中。
功能是:
当前下坠物首次进入游戏区,则还需要清空当前下坠物显示区。
下坠物已经在游戏区,那么按:
I:
可能,则下坠物下移一格。
至底,则判断需要销行否,是,销行,计100分。
下坠物顶到游戏空间顶部否,是,游戏结束。
K:
可能,下坠物逆时针旋转90度。
J:
可能,下坠物左移一格。
L:
可能,下坠物右移一格。
ESC:
是,强制结束游戏,显示统计信息。
(d)时钟2(curTimer)操作
每1秒钟修改一次使用时间显示值。
四、程序实现
(这一部分主要是说子程序的实现,以及引用的语言资源。
具体来说,就是给出程序模块的实现)
(1)界面设计实现
设计界面如上左图,它运行时如右图。
注意,由设计环节看到虽然7种下坠物形态各异,但是可以用4x4矩阵的方格描述7种下坠物,程序中下坠物移动,就是4x4区间在游戏区域的移动,考虑到边沿处理与游戏区域内部处理统一,在操作游戏区域外围还设计了一圈方格,且左右底部3边始终取值=1,表示占用,这可以便于判断活动块是否已经移动到最左/右/底部。
这一圈方格子颜色与背景同,达到隐藏的效果。
所以实现时,游戏区域共摆放了391(=17x23)个Label控件,组成StatusMap(0~390)控件数组。
使用Label控件的原因是它的前景颜色可以按需要设定,另外游戏操作时这些控件只显示,无需接受鼠标操作。
Label控件有属性Tag可以用来记录当前控件的状态(0/1/2),游戏时,Label控件.Tag=1/2,则置Label控件.Visible=True,显示Label控件,否则=False,不显示Label控件。
本程序中没有用Tag属性,而是另外定义了m_StatusMap(0~390)Asinteger数组对应Label控件的取值。
同理:
当前活动块显示区共摆放了16(=4x4)个Label控件,组成ActiveStatus(0~15)控件数组。
状态数组m_ActiveStatue(0~15)Asinteger,当前活动块形状坐标是ActStatus(0~3)ASDOT。
同理:
下一个活动块显示区共摆放了16(=4x4)个Label控件,组成NextStatus(0~15)控件数组。
状态数组m_NextStatue(0~15)Asinteger,当前活动块形状坐标是curStatus(0~3)ASDOT。
(2)操作代码实现
(a)下坠物自动下降速度控制
程序中下坠物的自动下坠用时钟1控制完成,时钟1控制下坠物自动下移的速度受“游戏级别、键盘操作”决定。
假设游戏开始时,最低级(初级=0)游戏中,默认下坠物下移速度是5s下移一格,操作对下移速度调整的计算公式是:
下坠物下移速度=5s-50ms*游戏级别*每个活动下坠物下降时I键被按次数
(1)
其中设定:
(1)游戏级别取值0~5级。
在操作100块下坠物后,游戏级别自动升一级(+1)。
以后每操作完100块下坠物,游戏级别+1。
到5级后不再提速。
(2)I键调节下降速度次数初值=0,每按一次I键,下降速度提高“级别*50ms”。
GameTimer.Intervel=下坠物下移速度
(b)操作流程设计
游戏初始化frmGame_Load过程
MAX_ROW=23
MAX_COL=17
游戏区域清空。
即状态数组m_StateMap[0~390]=0,游戏区域显示区域StateMap[0~390].Visible=False。
当前活动块区域清空。
即状态数组m_ActiveState[0~15]=0,显示区域ActiveState[0~15].Visible=False。
下一个活动块区域清空。
即状态数组m_NextState[0~15]=0,显示区域NextState[0~15].Visible=False。
3个统计数据清0
积分totalSco=0,积分显示TotalScore.Caption=totalSco
下坠物个数ObjectNumber=0
使用时间显示curTimer.Caption=currTimer
置随机数种子,以便下坠物随机出现。
Randomize(Second(Now)+100)
开始游戏cmdStart_Click过程
随机选择一个活动块,Block=Int(Rnd()*100)Mod7
取选择的活动块坐标点,CallLoadShape(ActStatus,Status,Block,curRotate)
设置活动块状态数组,CallDrawShape(m_ActiveStatus,curStatus,0,0,4,2)
根据m_ActiveStatus(0~15)取值,设置ActiveStatus(0~15).Visible是否显示
保留当前下坠物编号ActNo(取值范围0~6)
同理选择下一个活动块
随机选择下一个下坠物Block=Int(Rnd()*100)Mod7
取出随机选择的下坠,CallLoadShape(curStatus,Status,Block,curRotate)
设置下一活动块状态数组,CallDrawShape(m_NextStatus,curStatus,0,0,4,1)
根据m_NextStatus(0~15)取值,设置NextStatus(0~15).Visible是否显示
保留下一个下坠物编号NextNo(取值范围0~6)
游戏开始,关闭“开始”按钮,打开“结束”按钮,标记游戏刚开始。
cmdStart.Enabled=False:
cmdEnd.Enabled=True:
GameState=True
启动时钟1、2,即游戏开始。
GameTimer.Interval=5000:
curTimer.Interval=1000
结束游戏cmdEnd_Click过程
关闭游戏界面,弹出游戏统计结果窗口。
frmGame.Hide:
frmInfo.Show
用户开后,整个退出游戏。
End
时钟1GameTimer_Timer游戏操作代码
判断游戏初次操作否,是的(GameState=True),当前活动块放入游戏区,积分增20分,关闭活动块显示。
是初次进入:
curRow=0:
curCol=6'第一行中间坐标
CallDrawShape(m_StatusMap,ActStatus,curRow,curCol,17,2)'放入第一行中间
'积分增20,并显示出来
totalSco=totalSco+20
frmGame.TotalScore.Caption=totalSco
'下坠物个数增1
totalNum=totalNum+1
'关闭活动块
CallInitShape(m_ActiveStatus)
全部ActiveStatus(0~15).Visible=False
'修改游戏状态值
GameState=False
'刷新游戏区,显示出刚放入的下坠物
CallFlushMap()
定时执行的代码是下移活动块一格:
'活动块自动下降一格代码
'首先判断至底否
CallLoadShape(curStatus,BottomEdge,ActNo,curRotate)
res=IsBottom(curRow,curCol,17)
If(res=True)Then'已沉底,沉底处理
CallMoveBottom
Else'没沉底,下移一格
CallMoveDown(curRow,curCol)
CallFlushMap
curRow=curRow+1
EndIf
按键I、J、L、K操作Form_KeyPress过程
SelectCase(KeyAscii)
Case74,106'按J或j键,向左移动下坠物
CallLoadShape(curStatus,LeftEdge,ActNo,curRotate)
res=IsLeft(curRow,curCol,17)
If(res=True)Then'表示已经移动到最左边
Beep
Else
CallMoveLeft(curRow,curCol)
CallFlushMap
curCol=curCol-1
EndIf
Case75,107'按K或k键,逆时针旋转下坠物
'判断是否应该发生旋转
If(IsRotate(curRow,curCol,17)=True)Then'是,则旋转,否,什么都不做
curRotate=(curRotate+1)Mod4
CallLoadShape(curStatus,Status,ActNo,curRotate)
'清除没有旋转前的图形
CallDrawShape(m_StatusMap,ActStatus,curRow,curCol,17,0)
CallFlushMap
'把旋转之后的下坠物保留起来
ActStatus(0~3)=curStatus(0~3)'记住当前下坠物的坐标值
'绘制旋转的图形
CallDrawShape(m_StatusMap,ActStatus,curRow,curCol,17,2)
CallFlushMap
EndIf
Case76,108'按L或l键,向右移动下坠物
CallLoadShape(curStatus,RightEdge,ActNo,curRotate)
res=IsRight(curRow,curCol,17)
If(res=True)Then'表示已经移动到最右边
Beep
Else
CallMoveRight(curRow,curCol)
CallFlushMap
curCol=curCol+1
EndIf
Case73,105'按I或i键,向下移动下坠物
INum=INum+1
Speed=5s-50*GameLevel*INum
CallGameTimer_Timer'调用定时程序,下移下坠物一格
Case27'按下ESC键,强制结束程序,调用cmdEnd结束按钮过程
CallcmdEnd_Click
EndSelect
辅助函数
程序代码中一共设计了16个公用函数和过程。
第一组是判断函数
(i)是否可左移下坠物,IsLeft(currRow,currCol,rowNumAsInteger)AsBoolean
当前下坠物的最左边是否已经移到当前游戏区域的最左边,就是判断左边位置为空否,不是,则表示已经移到了最左边,不能再左移,返回值TRUE。
否则,返回FALSE。
判断过程是:
'取当期活动块左边界判断坐标值
CallLoadShape(curStatus,LeftEdge,ActNo,curRotate)
Loc=currRow*rowNum+currCol
'判断沉底否,即LeftEdge左边界点的左边是否为空
Fori=0To3Step1
If(curStatus(i).x<>0)Then
If(m_StatusMap((Loc+(curStatus(i).x-1)*17+curStatus(i).y-1)-1)=1)Then
IsLeft=True'是最左边,返回TRUE
ExitFunction
EndIf
EndIf
Nexti
IsLeft=False'没到最左边,返回FALSE
(ii)是否可右移下坠物,IsRight(currRow,currCol,rowNumAsInteger)AsBoolean。
同IsLeft函数,不同语句CallLoadShape(curStatus,RightEdge,ActNo,curRotate)。
(iii)是否可下移下坠物,IsBottom(currRow,currCol,rowNumAsInteger)AsBoolean。
同IsLeft函数,不同语句CallLoadShape(curStatus,BottomEdge,ActNo,curRotate)。
以上3个函数在实现中,需要事先建立每个下坠物每种形状的“左右下”3边界,它们分别存储在LeftEdge(7,4,4)AsDOT、RightEdge(7,4,4)AsDOT、BottomEdge(7,4,4)AsDOT3个数组中。
例如
第1种田字下坠物坐标的左右下3边界坐标点是
田字下坠物原型坐标
2223
3233
左边界右边界下边界
223200002333000032330000
倒L下坠物原型坐标
其1形状其2形状其3形状其4形状
22232223241223
333222313233
433233
形状1左边界右边界下边界
223343002333430032232400
形状2左边界右边界下边界
223200002432000032232400
形状3左边界右边界下边界
122232001222330032330000
形状4左边界右边界下边界
233100002333000031323300
(iV)是否可旋转下坠物,IsRotate(currRow,currCol,rowNumAsInteger)AsBoolean。
基本操作同IsLeft函数,不同是CallLoadShape(curStatus,Status,ActNo,(curRotate+1)Mod4),取旋转之后的下一个形状,判断新形状放置位置是否为空。
(V)是否游戏结束,IsGameEnd(currRow,currCol,rowNumAsInteger)AsBoolean。
已经沉到底,且curRow=0,即活动块已经堆到游戏区的顶部。
则返回TRUE,否则返回FALSE。
第二组是下坠物移动过程
(Vi)左移一格下坠物,MoveLeft(currRow,currColAsInteger)。
清除当前下坠物,在左移一列位置重新绘制下坠物。
CallDrawShape(m_StatusMap,ActStatus,currRow,currCol,17,0)'清除没有左移前图形
CallDrawShape(m_StatusMap,ActStatus,currRow,currCol-1,17,2)'绘制左移的图形
(Vii)右移一格下坠物,MoveRight(currRow,currColAsInteger)。
与MoveLeft相同。
(Viii)下移一格下坠物,MoveDown(currRow,currColAsInteger)。
与MoveLeft相同。
(iX)至底以后处理,MoveBottom。
活动块转静态块。
销行,判下坠物堆至顶端否,没有,下一个活动块激活,并随机选择新的下一个下坠物。
'将活动块转成静态块,即状态值2变成1
CallDrawShape(m_StatusMap,ActStatus,curRow,curCol,17,1)
'销行,即当某行全占满,则该行消除
CallDestroyLine
CallFlushMap'刷下游戏区域
'判游戏结束否
If(IsGameEnd(curRow,curCol,rowNum)=True)Then
MsgBox"游戏结束!
",vbOKOnly,"关于游戏的统计信息"
End
EndIf
'开始操作下一活动块激活,,即下一活动块放入到当前活动块,并产生新的下一活动块
CallLoadShape(ActStatus,Status,NextNo,curRotate)
CallDrawShape(m_ActiveStatus,ActStatus,0,0,4,2)
'刷新当前活动块
依据m_ActiveStatus(0~15)的取值,置frmGame.ActiveStatus(k).Visible
'修改当前活动块块号
ActNo=NextNo
'随机选择下一个下坠物
CallInitShape(m_NextStatus)
Block=Int(Rnd()*100)Mod7
'取出随机选择的下坠物
CallLoadShape(curStatus,Status,Block,curRotate)
CallDrawShape(m_NextStatus,curStatus,0,0,4,1)
'显示下一
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 实习 报告 样本 VB 俄罗斯方块
![提示](https://static.bdocx.com/images/bang_tan.gif)