1、1课程设计报告题目介绍:“俄罗斯方块”是一款非常经典,而且很受欢迎的风靡全球的电视游戏机和掌上游戏机游戏,玩家既能感受到游戏中的乐趣,也能提供一个展现自己高超技艺的场所。此游戏有很多变种,但大体玩法相同。本题目要求编制俄罗斯方块的计算机版本。题目要求:当按“开始”键时,游戏开始,期间玩家可以选择“暂停”和“继续” 。方块可以在一定的范围内上下左右移动,而且可以根据玩家的指令转动方向,以更好的进行方块之间的组合。当每一行被方块填满时则会自动消去一行,多行都被方块填满时则都消去,同时消去的行数越多,则分数越高。一旦方块达到顶端则游戏自动结束。而且玩家可以根据自身的水平,选择游戏的难度。难度越高,速
2、度越快;难度越低,速度越慢。解题方案:本题涉及到VB 中的很多块知识使用的模块:数组,变量的命名,菜单编辑器,绘图,键盘事件处理,定时器控制,多模块程序设计,文本文件的读写等。主要用到的控件有:comma nd 控件,image控件,picture 控件,label 控件,timer控件, text 控件,windo ws media player 控件等等主要实现的功能:1.可以灵活控制方块在图形框中运动。2.游戏过程中方块可以自由旋转。3.当某一行的方块排列满时,将自动将这一行方块消除,然后将上面所有方块向下移动,可以支持连续消行。4.游戏前可以选择游戏的速度和游戏的等级,游戏速度既为方块
3、下落速度,游戏等级为初始游戏时在基层随机生成一定行数的无规律方块,生成的行数由你来选择,每行至少产生 5 个以上的无规律方块,这样增加了游戏难度,对于游戏高手来说,无疑不是一个新的挑战。5.游戏的得分支持积分,并且按照公式:得分 = 原来分数 + 100 * (2 同时消除的行数-1)这样,你同一时间消除的行数越多,你的得分也就越高,当游戏积分到了一定时可以自动升级,这个升级指速度升级主要步骤为以下 9 个方面:(1)游戏界面的设计。(2)俄罗斯方块的造型。(3)俄罗斯方块的旋转。(4)俄罗斯方块的运动情况(包括向左,向右和向下) 。(5)俄罗斯方块的自动消行功能。(6)游戏级别的自由选择。(
4、7)游戏速度的自由选择。(8)游戏得分的计算。(9)游戏菜单选项的设计及功能实现。分析及大概设计:方块的造型在旋转的时候存在一个公式,当然首先要判断是否满足旋转的要求,以上是一个长条型由横着变成竖立状态的旋转,我们以它的造型中的第三个小方块n(3)为中心旋转,这样,在开始运动的时候,2长条形要发生旋转最少要运动到第三行,才能由横着变成竖立状态,游戏区图形框中第三行的第一个方块的编号为20,所以长条造型的第一个小方块的编号n(0)必须要大于 20。同样,长条型方块在下落到底部的时候也有限制。如果长条下落到最后一行也将无法由横着变成竖立状态。如何实现方块的运动和自动消除满行的方块:我们的这个俄罗斯
5、方块游戏主要是利用 command 控件的 visible 属性完成效果的,其实在游戏区图形框可以看成是由许多的 command小方块组成,方块运动的过程就是造型里方块显示或者隐藏,就像现在的霓虹灯效果一样,由时钟控件控制 visible 属性改变的速度,上一层的消失,下一层的显示,这样,从视觉效果可以看到方块的下落运动效果。方块在下落的过程中会自动判断每一行方块的visible 属性,如果全部为true 时,就会将这一 行小方块的visible 属性全部变成 false,在将上面的小方块向下移动,利用 for语句进行循环判断,将所有这样情况的行改变小方块 visible 属性。连续消行:当有
6、多行同时出现这样情况时使用递归调用,实现连续消行。游戏速度和游戏级别自由选择游戏速度选择:就是改变时钟控件的频率,我们在菜单中添加了选择速度的功能,还有添加了考验功能,将欲览窗中的方块造型隐藏,给玩家提高了难度,如果你不愿意接受考验也可以点击显示还原成原来状态。游戏级别的自由选择是让用户选择游戏开始时候,游戏区底部出现一定行数的随机方块,同样给玩家增加了难度游戏得分的计算和游戏菜单的编辑:游戏得分的计算主要是根据消除的行数来决定的,当然每一次同时消除的行数不一样,每一行的得分也不一样,如果你每次消除的行数为 1,则最后得分是 100 分,如果同时消除 2 行,则最后得分是 300 分,同时消除
7、 3行,得分为 700 分,同时消除 4行,得分为1500 分,这由公式:得分 = 原来分数+ 100 * (2 同时消除的行数-1)。效果极其存在问题:游戏自身已经可以运行,可以带来游戏的轻松及其快感,可是界面显得粗糙,缺乏美感,而且就游戏菜单编辑器方面得进行改进心得:此次对俄罗斯方块的 VB 程序进行编辑,更加对这个 游戏的设计思路以及运行程序得到了解,而且从中学到很多 VB的知识,比如怎样对菜单编辑器进行设置,怎样设计产生两个甚至更多的窗体,对一些控件的应用以及数组的应用也有了更深的了解。 3VB 程序:定义产生方块的数组以及消除行数的数组:Private n(3), m(3) As I
8、nteger Private situation, situation2, linenum, t As Integer为了产生方块,定义使各个小方块可见和不可见的过程:Private Sub hidefang(a As Integer)Select Case aCase 0cmdfang(n(0).Visible = Falsecmdfang(n(1).Visible = Falsecmdfang(n(2).Visible = Falsecmdfang(n(3).Visible = FalseCase 1cmdfangnext(m(0).Visible = Falsecmdfangnext(m
9、(1).Visible = Falsecmdfangnext(m(2).Visible = Falsecmdfangnext(m(3).Visible = FalseEnd SelectEnd SubPrivate Sub showfang(a As Integer)Select CaseCase 0cmdfang(n(0).Visible = Truecmdfang(n(1).Visible = Truecmdfang(n(2).Visible = Truecmdfang(n(3).Visible = TrueCase 1cmdfangnext(m(0).Visible = Truecmdf
10、angnext(m(1).Visible = Truecmdfangnext(m(2).Visible = Truecmdfangnext(m(3).Visible = TrueEnd SelectEnd Sub实现消除一行(实现连续消行,用递归):Private Sub clearline()For i = 190 To 10 Step -10If cmdfang(i).Visible = True And _cmdfang(i + 1).Visible = True And _cmdfang(i + 2).Visible = True And _cmdfang(i + 3).Visible
11、 = True And _cmdfang(i + 4).Visible = True And _cmdfang(i + 5).Visible = True And _cmdfang(i + 6).Visible = True And _cmdfang(i + 7).Visible = True And _4cmdfang(i + 8).Visible = True And _cmdfang(i + 9).Visible = True ThenFor j = i + 4 To i Step -1t = 1cmdfang(j).Visible = Falsecmdfang(2 * i + 9 -
12、j).Visible = FalseFor k = 1 To 4000DoEventsNextt = 0Nextlinenum = linenum + 1For j = i - 1 To 0 Step -1If cmdfang(j).Visible = True Thencmdfang(j).Visible = Falsecmdfang(j + 10).Visible = TrueEnd IfNextclearlineEnd IfNextEnd Sub定义方块能否下降,左移和右移:Private Function downable() As Boolean If n(0) 0 And n(1)
13、 Mod 10 0 And n(3) Mod 10 9 And n(1) Mod 10 9 And n(3) Mod 10 = 2 And n(3) + 9 0 ThenIf cmdfang(n(0) + 18).Visible = False And _cmdfang(n(1) + 9).Visible = False And _cmdfang(n(3) - 9).Visible = False Thenhidefang 0n(0) = n(0) + 18n(1) = n(1) + 9n(3) = n(3) - 9showfang 0situation = 0End IfEnd IfCase
14、 2Case 3If n(0) - 11 1 ThenIf cmdfang(n(0) - 11).Visible = False And _cmdfang(n(3) + 2).Visible = False Thenhidefang 0n(0) = n(0) - 11n(2) = n(2) - 9n(3) = n(3) + 2showfang 0situation = 4End IfEnd IfCase 4If (n(3) - 2) Mod 10 1 ThenIf cmdfang(n(0) - 9).Visible = False And _cmdfang(n(3) - 2).Visible
15、= False Thenhidefang 0n(0) = n(0) - 910n(2) = n(2) - 11n(3) = n(3) - 2showfang 0situation = 6End IfEnd IfCase 6If (n(3) + 2) Mod 10 0 ThenIf cmdfang(n(2) + 11).Visible = False And _cmdfang(n(3) + 2).Visible = False Thenhidefang 0n(0) = n(0) + 9n(2) = n(2) + 11n(3) = n(3) + 2showfang 0situation = 5En
16、d IfEnd IfCase 7If n(0) - 9 0 ThenIf cmdfang(n(0) - 9).Visible = False Thenhidefang 0n(0) = n(0) - 9n(2) = n(2) + 9n(3) = n(3) - 11showfang 0situation = 8End IfEnd IfCase 8If (n(0) + 11) Mod 10 0 ThenIf cmdfang(n(0) + 11).Visible = False Thenhidefang 0n(0) = n(0) + 11n(2) = n(2) - 11n(3) = n(3) - 9s
17、howfang 0situation = 9End IfEnd IfCase 9If n(0) + 9 1 And (n(3) - 22) Mod 10 0 And n(3) - 18 1 ThenIf cmdfang(n(0) + 11).Visible = False And _cmdfang(n(3) - 18).Visible = False Thenhidefang 0n(0) = n(0) + 11n(2) = n(2) - 9n(3) = n(3) - 18showfang 0situation = 13End IfEnd IfCase 13If n(0) + 9 0 Then1
18、2If cmdfang(n(0) + 9).Visible = False And _cmdfang(n(3) + 22).Visible = False Thenhidefang 0n(0) = n(0) + 9n(2) = n(2) + 11n(3) = n(3) + 22showfang 0situation = 14End IfEnd IfCase 14If (n(0) - 11) Mod 10 1 ThenIf cmdfang(n(2) - 9).Visible = False And _cmdfang(n(3) - 18).Visible = False Thenhidefang
19、0n(0) = n(0) - 11n(2) = n(2) - 9n(3) = n(3) - 18showfang 0situation = 1713End IfEnd IfCase 17If (n(3) + 22) Mod 10 1 ThenIf cmdfang(n(2) + 11).Visible = False And _cmdfang(n(3) + 22).Visible = False Thenhidefang 0n(0) = n(0) - 9n(2) = n(2) + 11n(3) = n(3) + 22showfang 0situation = 18End IfEnd IfCase
20、 18If n(3) + 18 198 ThenIf cmdfang(n(2) + 9).Visible = False And _cmdfang(n(3) + 18).Visible = False Thenhidefang 0n(0) = n(0) + 11n(2) = n(2) + 9n(3) = n(3) + 18showfang 0situation = 15End IfEnd IfEnd SelectEnd Sub对暂停按钮进行编辑:Private Sub cmdpause_Click() Select Case cmdpause.CaptionCase “暂停“cmdpause.
21、Caption = “继续“tmrmain.Enabled = FalseCase “继续“cmdpause.Caption = “暂停“tmrmain.Enabled = Truepicmain.SetFocusEnd SelectEnd Sub游戏开始:Private Sub cmdstart_Click()If cmdstart.Caption = “开始“ Thenpicmain.SetFocus 14tmrmain.Interval = 1000 / Val(txtlevel.Text)For i = 0 To 3n(i) = m(i)Nextshowfang 0situation
22、= situation2tmrmain.Enabled = Truecmdpause.Enabled = Truecmdoption.Enabled = Falsehidefang 1loadfangkuaishowfang 1cmdstart.Caption = “结束“Elsetmrmain.Enabled = Falsecmdpause.Enabled = Falsecmdoption.Enabled = TrueFor i = 1 To 199cmdfang(i).Visible = FalseNextcmdstart.Caption = “开始“txtscore.Text = “0“
23、linenum = 0End IfEnd Sub对游戏下左右及旋转进行控制:Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)If t = 0 Thenhidefang 0Select Case KeyCodeCase vbKeyLeftIf leftable() = True ThenFor j = 0 To 3cmdfang(n(j) - 1).Visible = Truen(j) = n(j) - 1Next jEnd Ifshowfang 0Case vbKeyDownIf downable() = True T
24、henFor j = 0 To 3cmdfang(n(j) + 10).Visible = Truen(j) = n(j) + 10Next j15End Ifshowfang 0Case vbKeyRightIf rightable() = True ThenFor j = 0 To 3cmdfang(n(j) + 1).Visible = Truen(j) = n(j) + 1Next jEnd Ifshowfang 0Case vbKeyUpshowfang 0zhuanCase Elseshowfang 0End SelectEnd IfEnd Sub主界面的产生:Private Su
25、b Form_Load()picmain = LoadPicture(“)RandomizeFor i = 1 To 199Load cmdfang(i)Next iFor i = 0 To 199cmdfang(i).Left = (i Mod 10)cmdfang(i).Top = i 10cmdfang(i).Visible = FalseNext iFor i = 1 To 39Load cmdfangnext(i)Next iFor i = 0 To 39cmdfangnext(i).Left = (i Mod 10) - 3cmdfangnext(i).Top = i 10cmdf
26、angnext(i).Visible = FalseNext iloadfangkuaishowfang 1End Sub对时钟控件以及游戏失败结束和得分升级的计算的程序:Private Sub tmrmain_Timer()hidefang 016If downable() = True ThenFor j = 0 To 3n(j) = n(j) + 10Next jshowfang 0Elseshowfang 0clearlineFor i = 0 To 9If cmdfang(i).Visible = True Then Exit ForNextIf i 10 Then cmdstart
27、_Click: Exit SubFor i = 0 To 3n(i) = m(i)Nextshowfang 0situation = situation2txtscore.Text = Str(Val(txtscore.Text) + 100 * (2 linenum - 1)If Val(Right(txtscore.Text, 4) Val(Right(Str(Val(txtscore.Text) - 100 * (2 linenum - 1), 4) Thentxtlevel.Text = Str(Val(txtlevel.Text) + 1)tmrmain.Interval = 1000 / Val(txtlevel.Text)End Iflinenum = 0hidefang 1loadfangkuaishowfang 1End IfEnd Sub菜单编辑器Private Sub cmdoption_Click()Form1.ShowEnd SubPrivate Sub xx_Click()Form2.ShowEnd Sub