VB 俄罗斯方块的设计

合集下载

vb_俄罗斯方块

vb_俄罗斯方块

流程图程序开始1.设定地图资料2.设定界面大小和位置3.初始化游戏的运行数据4.设定各种方块数据5.启动timer置换下一块为现在方块,检查可否放入地图产生下一块Timer依设定时间下移方块由键盘方向键控制方块移动和变检查方块移动位置是否有障碍是检查方块是否无法下移是删除满行否是否再玩是程序结束否否是否移动方块重绘地图方块画面规划画面规划如图1所示图1说明如下:○1:游戏窗口(Form)。

为了避免因改变窗口大小而造成画面呈现不美观,将BorderStyle属性设定为3,即无法以窗口边缘进行窗口大小调整。

○2:积分框(Frame)○3:累计数框(Frame)○4:分数(Label)○5:等级(Label)○6:构成下一个动作方块所需组件(Image)。

程序设计阶段将Visible设为False,程序执行阶段再依需要改变属性值。

○7:构成地图方块所需组件(Image)。

程序设计阶段将Visible设为False,程序执行阶段再依需要改变属性值。

○8:构成现在动作方块所需组件(Image)。

程序设计阶段将Visible设为False,程序执行阶段再依需要改变属性值。

○9:定时器(Timer)。

○10:方块图形存储组件(ImageList)。

1.游戏使用说明上方向键旋转方块,左右和下方向键移动方块,空格键能让方块骤降,pause按键能暂停游戏。

每消除一行得100分,初始等级为1级,满3000分升1级,同时方块下降的速度也变快。

程序代码:Private Type blocktypeintblockarray(3, 4, 4) As Integer '方块数组blockpicture As Integer '方块图形End Type'所有方块形状数据Dim blockarray() As blocktype '方块类型数组'现在方块Dim nowblocktype As Integer '方块类型Dim nowblockmode As Integer '方块方向Dim nowblockpicture As Integer '方块图案Dim nowblockx As Integer 'x坐标Dim nowblocky As Integer 'y坐标Dim nowblockw As Integer '方块宽Dim nowblockh As Integer '方块高'下一个方块Dim nextblocktype As Integer '方块类型Dim nextblockpicture As Integer '方块图形'地图数据Dim mapxs As Integer '地图横向格数Dim mapys As Integer '地图纵向格数Dim maparray() As Integer '地图数组Dim mappicturearray() As Integer '地图中所代表的图案Dim mapx As Integer '地图x坐标Dim mapy As Integer '地图y坐标Dim delcount As Integer '删除行数计数器'游戏进行数据Dim score As Double '游戏分数Dim level As Integer '游戏级数Dim speed As Integer '游戏速度Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)'窗体加载Private Sub form_load()RandomizeCall setmap '设定地图数据Call setformsize '设定窗体大小Call setgamedata '初始化游戏数据Call setblock '设定各种方块数据Call createnextblock '产生下一方块Call createnowblock '产生现在方块Timer1.Enabled = TrueTimer1.Interval = speedEnd Sub'设定地图数据Private Sub setmap()mapx = 0mapy = 735mapxs = 14mapys = 18nowblockw = 375nowblockh = 375ReDim maparray(mapxs - 1, mapys - 1)ReDim mappicturearray(mapxs - 1, mapys - 1)'将地图数据清空,并加载图形组件For X = 0 To mapxs - 1For Y = 0 To mapys - 1Load imgmapblock(imgmapblock.Count)imgmapblock(imgmapblock.Count - 1). _Move (X * nowblockw + mapx), _(Y * nowblockh + mapy), _nowblockw, _nowblockhimgmapblock(imgmapblock.Count - 1).Visible = False maparray(X, Y) = 0mappicturearray(X, Y) = 0Next YNext XEnd Sub'设定窗体大小位置Private Sub setformsize()Dim frmleft As IntegerDim frmtop As IntegerDim frmw As IntegerDim frmh As Integerfrmleft = (Screen.Width - Me.Width) / 2frmtop = (Screen.Height - Me.Height) / 2frmw = nowblockw * mapxs + (Me.Width - Me.ScaleWidth) frmh = nowblockh * mapys + (Me.Height - Me.ScaleHeight) Me.Move frmleft, frmtop, frmw, frmh + 735imgnowblock(0).Width = nowblockwimgnowblock(0).Height = nowblockhimgmapblock(0).Width = nowblockwimgmapblock(0).Height = nowblockhEnd Sub'初始化游戏进行数据Private Sub setgamedata()score = 0level = 1speed = 800lbscore(0).Caption = scorelblevel(0).Caption = levelEnd Sub'设定方块数据Private Sub setblock()ReDim blockarray(6)Dim intcount As Integerblockarray(0).intblockarray(0, 2, 1) = 1 '倒T形 blockarray(0).intblockarray(0, 1, 2) = 1blockarray(0).intblockarray(0, 2, 2) = 1blockarray(0).intblockarray(0, 3, 2) = 1blockarray(1).intblockarray(0, 1, 1) = 1 ' L形blockarray(1).intblockarray(0, 1, 2) = 1blockarray(1).intblockarray(0, 2, 2) = 1blockarray(1).intblockarray(0, 3, 2) = 1blockarray(2).intblockarray(0, 3, 1) = 1 '倒L形 blockarray(2).intblockarray(0, 1, 2) = 1blockarray(2).intblockarray(0, 2, 2) = 1blockarray(2).intblockarray(0, 3, 2) = 1blockarray(3).intblockarray(0, 1, 2) = 1 '一字形 blockarray(3).intblockarray(0, 2, 2) = 1blockarray(3).intblockarray(0, 3, 2) = 1blockarray(3).intblockarray(0, 4, 2) = 1blockarray(4).intblockarray(0, 1, 1) = 1 'Z字形blockarray(4).intblockarray(0, 2, 1) = 1blockarray(4).intblockarray(0, 2, 2) = 1blockarray(4).intblockarray(0, 3, 2) = 1blockarray(5).intblockarray(0, 2, 1) = 1 '倒Z字形 blockarray(5).intblockarray(0, 3, 1) = 1blockarray(5).intblockarray(0, 1, 2) = 1blockarray(5).intblockarray(0, 2, 2) = 1For i = 0 To 3blockarray(6).intblockarray(i, 2, 2) = 1 '田字形blockarray(6).intblockarray(i, 2, 3) = 1blockarray(6).intblockarray(i, 3, 2) = 1blockarray(6).intblockarray(i, 3, 3) = 1Next iFor i = 0 To 5 '依序为倒T形,L形,倒L形,一字形,Z形和倒Z形 For j = 1 To 3 '每一形状要做三次旋转,每次顺时针90intcount = 0If i > 2 And (j Mod 2 = 0) ThenFor X = 0 To 4For Y = 0 To 4blockarray(i). _intblockarray(j, X, Y) = blockarray(i). _intblockarray((j - 1), 4 - Y, X)If blockarray(i).intblockarray(j, X, Y) = 1 Thenintcount = intcount + 1End IfIf intcount >= 4 Then Exit ForNext YIf intcount = 4 Then Exit ForNext XElseFor X = 0 To 4For Y = 0 To 4blockarray(i).intblockarray(j, X, Y) = _blockarray(i).intblockarray((j - 1), Y, 4 - X)If blockarray(i).intblockarray(j, X, Y) = 1 Thenintcount = intcout + 1End IfIf intcount >= 4 Then Exit ForNext YIf intcount >= 4 Then Exit ForNext XEnd IfNext jNext iEnd Sub'产生下一个方块图形Private Sub createnextblock()Dim intcount As Integernextblocktype = Rnd() * UBound(blockarray) '随机数产生方块形态'随机数产生方块图案nextblockpicture = Rnd() * (iglblockpicture.ListImages.Count - 1) + 1'第一次初始将组件动态新增至4个If imgnextblock.Count < 4 ThenDoLoad imgnextblock(imgnextblock.Count)Loop While imgnextblock.Count < 4End If'将下一个方块画在窗体上方intcount = 0For X = 0 To 4For Y = 1 To 2If blockarray(nextblocktype).intblockarray(0, X, Y) = 1 Then Set imgnextblock(intcount).Picture =iglblockpicture.ListImages(nextblockpicture).Pictureimgnextblock(intcount).Move (2000 + X * 195), (30 + Y * 195), 195, 195imgnextblock(intcount).Visible = Trueintcount = intcount + 1End IfIf intcount >= 4 Then Exit ForNext YIf intcount >= 4 Then Exit ForNext XEnd Sub'产生现在方块形状Private Sub createnowblock()Dim intcount As IntegerDim strgameover As Stringnowblocktype = nextblocktypenowblockpicture = nextblockpicturenowblockx = (mapxs - 5) / 2 - 1nowblocky = -1nowblockmode = 0'第一次初始将组件动态新增至4个If imgnowblock.Count < 4 ThenDoLoad imgnowblock(imgnowblock.Count)Loop While imgnowblock.Count < 4End If'检查新产生的方块是否可以放在地图中If checkput(nowblockx, nowblocky, nowblockmode) = False Thenstrgameover = MsgBox("你输了,继续玩吗?", vbQuestion + vbYesNo, "游戏结束")If strgameover = vbNo ThenEndElseDo While imgmapblock.Count > 1Unload imgmapblock(imgmapblock.Count - 1)LoopCall form_loadEnd IfElseCall drawblock '画出方块Call createnextblockEnd IfEnd Sub'键盘事件Private Sub form_keydown(keycode As Integer, shift As Integer)If Timer1.Enabled = True Or keycode = vbKeyPause ThenSelect Case keycodeCase vbKeyUpnowblockmode = nowblockmode + 1If nowblockmode > 3 Then nowblockmode = 0If checkput(nowblockx, nowblocky, nowblockmode) = False Then nowblockmode = nowblockmode - 1If nowblockmode < 0 Then nowblockmode = 3ElseCall drawblock '画出方块End IfCase vbKeyDownIf checkput(nowblockx, nowblocky + 1, nowblockmode) =True Thennowblocky = nowblocky + 1Call drawblockElseCall checkbottomEnd IfCase vbKeyLeftIf checkput(nowblockx - 1, nowblocky, nowblockmode) = True Thennowblockx = nowblockx - 1Call drawblockEnd IfCase vbKeyRightIf checkput(nowblockx + 1, nowblocky, nowblockmode) = True Thennowblockx = nowblockx + 1Call drawblockEnd IfCase vbKeySpaceDo While checkput(nowblockx, nowblocky + 1, nowblockmode) = Truenowblocky = nowblocky + 1LoopCall drawblockCall checkbottomCase vbKeyPauseTimer1.Enabled = Not Timer1.EnabledCase vbKeyEscapeUnload MeEnd SelectEnd IfEnd Sub'画出方块Private Sub drawblock()Dim intcount As Integerintcount = 0For X = nowblockx To (nowblockx + 4)For Y = nowblocky To (nowblocky + 4)If blockarray(nowblocktype).intblockarray(nowblockmode, (X - nowblockx), (Y - nowblocky)) = 1 ThenSet imgnowblock(intcount).Picture =iglblockpicture.ListImages(nowblockpicture).Pictureimgnowblock(intcount).Move (X * nowblockw + mapx), (Y * nowblockh + mapy), nowblockw, nowblockhimgnowblock(intcount).Visible = Trueintcount = intcount + 1End IfIf intcount >= 4 Then Exit ForNext YIf intcount >= 4 Then Exit ForNext XEnd Sub'检查方块是否可以放置Private Function checkput(cx As Integer, cy As Integer, cm As Integer) As Booleancheckput = TrueFor X = cx To (cx + 4)For Y = cy To (cy + 4)If blockarray(nowblocktype).intblockarray(cm, (X - cx), (Y - cy)) = 1 ThenIf X < 0 Or X > (mapxs - 1) Or _Y < 0 Or Y > (mapys - 1) Thencheckput = FalseElseIf maparray(X, Y) = 1 Thencheckput = FalseEnd IfEnd IfEnd IfIf intcount >= 4 Then Exit ForNext YIf checkput = False Then Exit ForNext XEnd Function'定时器Private Sub Timer1_Timer()If checkput(nowblockx, nowblocky + 1, nowblockmode) = True Then nowblocky = nowblocky + 1Call drawblockElseCall checkbottomEnd IfEnd Sub'方块到底检查Private Sub checkbottom()Timer1.Enabled = FalseCall Wirtemap '将到底的方块数据写入地图数组中Call deletefull '删除满行If delcount > 0 Then Call reloadmap '假如有刪除行则重新加载地图Call checkgamedata '检查游戏数据Call createnowblock '产生新方块Timer1.Enabled = TrueEnd Sub'将到底的方块数据写入地图数组中Private Sub Wirtemap()Dim intcount As Integer '方块计数器intcount = 0For X = 0 To 4For Y = 0 To 4If blockarray(nowblocktype).intblockarray(nowblockmode, X, Y) = 1 Then'读取到方块数组中的值为1时,方块计数器加1intcount = intcount + 1maparray(nowblockx + X, Y + nowblocky) = 1mappicturearray(X + nowblockx, Y + nowblocky) = nowblockpicture Set imgmapblock((nowblockx + X) + (nowblocky + Y) *mapxs).Picture = _iglblockpicture.ListImages(mappicturearray((nowblockx + X), (nowblocky + Y))).Pictureimgmapblock((nowblockx + X) + (nowblocky + Y) * mapxs).Move ((nowblockx + X) * nowblockw + mapx), _((nowblocky + Y) * nowblockh + mapy), nowblockw, nowblockhimgmapblock((nowblockx + X) + (nowblocky + Y) * mapxs).Visible = TrueEnd If'当方块计数器为4时表示已经将数组中有方块之值写入地图If intcount >= 4 Then Exit ForNext YIf intcount >= 4 Then Exit ForNext XEnd Sub'删除满行Private Sub deletefull()Dim blfull As Boolean '满行旗标delcount = 0 '删除行数计数器归0Dim reline(4) As Boolean '记录满行行数For Y = nowblocky To nowblocky + 4blfull = True '先将满行旗标设为TRUEIf Y < mapys And Y >= 0 ThenFor X = 0 To mapxs - 1If maparray(X, Y) = 0 Thenblfull = FalseEnd IfNext XElseblfull = FalseEnd Ifreline(Y - nowblocky) = blfullIf blfull = True Then delcount = delcount + 1Next Y'当有满行发生时If delcount > 0 ThenFor i = 1 To 4For yy = nowblocky To nowblocky + 4If reline(yy - nowblocky) = True ThenFor mxx = 0 To mapxs - 1imgmapblock(mxx + yy * mapxs).Visible = _Not imgmapblock(mxx + yy * mapxs).VisibleDoEventsNext mxxEnd IfNext yyIf i Mod 2 = 0 ThenSleep (50 / delcount)ElseSleep (10 / delcount)End IfNext i'移动地图数组数据For yyy = nowblocky To nowblocky + 4If reline(yyy - nowblocky) = True ThenFor my = yyy To 1 Step -1For mx = 0 To mapxs - 1maparray(mx, my) = maparray(mx, my - 1)mappicturearray(mx, my) = mappicturearray(mx, my - 1) Next mxNext my'将地图数组第0行设为0For mx = 0 To mapxs - 1maparray(mx, 0) = 0Next mxEnd IfNext yyyEnd IfEnd Sub'重新加载地图Private Sub reloadmap()For X = 0 To mapxs - 1For Y = 0 To mapys - 1If maparray(X, Y) = 1 ThenSet imgmapblock(X + Y * mapxs).Picture = _iglblockpicture.ListImages(mappicturearray(X,Y)).Pictureimgmapblock(X + Y * mapxs).Move (X * nowblockw + mapx), (Y * nowblockh + mapy), nowblockw, nowblockhimgmapblock(X + Y * mapxs).Visible = TrueElseimgmapblock(X + Y * mapxs).Visible = FalseEnd IfNext YNext XEnd Sub'检查游戏数据Private Sub checkgamedata()score = score + delcount * delcount * 100 '分数计算level = 1 + score \ 3000 '等级计算speed = speed - 1If speed <= 0 Then speed = 1lbscore(0).Caption = scorelblevel(0).Caption = levelEnd Sub'窗体移除Private Sub form_unload(cancel As Integer)'移除地图显示组件Do While imgmapblock.Count > 1Unload imgmapblock(imgmapblock.Count - 1)Loop'移除现在动作方块显示组件Do While imgnowblock.Count > 1Unload imgnowblock(imgnowblock.Count - 1)Loop'移除下一个动作方块显示组件Do While imgnextblock.Count > 1Unload imgnextblock(imgnextblock.Count - 1)LoopEnd Sub。

VB程序设计项目

VB程序设计项目

VB程序设计项目俄罗斯方块是一款经典的益智游戏,由于其简单而有趣的玩法,深受大众喜爱。

在这个项目中,我将使用VB程序设计语言来实现一个俄罗斯方块游戏。

首先,我需要创建一个窗口来展示游戏界面。

可以使用VB的窗体设计工具来创建一个适配屏幕大小的窗口。

在窗口中,我将设置一个固定大小的网格来展示游戏区域。

接下来,我将定义几个关键的类来实现游戏逻辑。

首先是方块类,用于表示俄罗斯方块中的每个方块的属性和行为。

该类应该包含方块的形状、位置、旋转等信息,并提供方法来移动方块、旋转方块等。

然后是游戏区域类,用于表示整个游戏区域的属性和行为。

该类应该包含游戏区域的大小、当前方块、已经落下的方块等信息,并提供方法来检测方块是否可以移动、旋转,以及方块落地后的处理。

在游戏区域类的基础上,我将定义一个游戏控制类来控制整个游戏的进行。

该类应该提供开始游戏、暂停游戏、结束游戏等方法,并处理游戏的计分、等级等逻辑。

为了使游戏更加有趣,我还可以添加一些特殊功能,比如消除满行的方块、不同形状的方块等。

这些功能可以在游戏区域类和方块类中进行实现,并在游戏控制类中进行调用和处理。

最后,我将在窗口中添加一些控件来实现游戏的交互。

比如开始按钮、暂停按钮、重新开始按钮等。

当玩家点击这些按钮时,我将调用游戏控制类中相应的方法来进行游戏的操作。

通过以上的设计和实现,我将成功地创建一个VB程序设计项目,俄罗斯方块游戏。

这个项目不仅可以提供给玩家娱乐,还可以帮助我学习和掌握VB程序设计的相关知识和技能。

俄罗斯方块设计思路

俄罗斯方块设计思路

俄罗斯方块设计思路1.方块类:每个方块都要记录自己的ID、形状。

形状采用4对整数坐标来表示,分别记录4个小方块的相对位置(以方块内或旁边任一点为中心,称为参考点)。

建议可以在方块类义一个或多个private static数组,将每种ID的方块的形状数据存储好(都是一些固定的数据),这样产生一个方块时只需要提供其ID即可。

为了处理方块的旋转,我们不能只记录上述7种方块,而应该把它们旋转后产生的每种形状都认为是一种不同的方块(因为它们的4对坐标都不同),然后在方块ID之间建立映射关系,即哪种ID的方块旋转后变成哪种ID 的方块,只要求处理一个方向的旋转。

这个映射关系也可以用private static数组来实现。

此外,方块类还要记录自己的参考点在指定的游戏区域中的位置。

方块类主要操作:(自行决定哪些为public哪些为private)构造函数:参数至少有:ID和参考点初始坐标。

填充:把自己填充到指定的游戏区域中。

返回填充成功或失败的信息。

清除:把自己从指定的游戏区域中清除。

移动:在指定的游戏区域中移动,包括向左、右、下移动,以1个单元格为单位。

如果可以移动,则修改参考点的位置,并在指定的游戏区域中重新填充自己(先清除、然后修改参考点位置,再填充)。

返回是否移动成功的信息。

旋转:在指定的游戏区域中旋转一次,此时参考点位置不变,但要改变自己的ID,然后在指定的游戏区域中重新填充自己(先清除、然后修改参考点位置,再填充)。

获得占用行:返回本方块4个小方块所占用的各行,可能有1~4行,要返回每一行的行号(1~20)。

这些数据可用参考点位置与自己的4对坐标计算出来。

2.游戏区域类其主要属性:游戏区域数据,可以用一个二维数组方便地实现。

状态:游戏未开始(初态)和游戏已开始。

主要操作为:(自行决定哪些为public哪些为private)游戏区域读写:指定游戏区域的一个单元格坐标后,返回或设置单元格的值。

绘制:清除屏幕后将游戏区域绘制出来。

vb俄罗斯方块游戏报告

vb俄罗斯方块游戏报告

北京电子科技学院计算机实习报告题目:设计俄罗斯方块游戏一、需求分析1.选题任务:设计俄罗斯方块游戏2.选题分析:●首先题目是设计游戏,所以游戏界面需要美观,因此选择用vb 实现。

Visual Basic 的图形信息处理功能通常借助于几个标准控件,包括图片框(PictureBox)控件、图像(Image)控件、直线(Line)控件和形状(Shape)控件。

图片框(PictureBox)控件可以用来显示图形,也可以用来在控件上输出图形(点、圆、矩形等)和用Print方法输出文本,还可以将图片框作为容器,将不同功能的控件包容在其中,从而实现分组功能。

图像(Image)控件和图片框(PictureBox)控件一样,也可以用来显示图像,但是它比图片框要少许多功能,图像控件不具有pSet,Line,Circle等绘图方法,也不能作为其他控件的载体。

虽然Image控件比PictureBox控件少了很多功能,但是它比图片框使用更少的系统资源,重画起来比图片框控件要快,所以在程序中仍要使用。

●熟悉游戏规则很重要,因为这是程序设计的基本要求,也是基本思路。

游戏规则如下:✓电脑随机产生4个小方块组成的不同形状的游戏块,从上往下降落。

✓游戏面板的宽度为12(以小方块的宽度为单位),高度为22,当一行被12个小方块填满时,此行便会被自动消除。

✓利用键盘上的左右箭头键可以控制游戏块的左移与右移。

✓利用键盘上的向上箭头键可以控制游戏块的旋转。

✓利用键盘上的向下箭头键可以控制游戏块的快速下落。

✓当游戏块无法下落时,游戏结束。

✓在屏幕上可以显示将出现的下一个游戏块。

二、程序设计1.要实现游戏中各种方块的图形,然后对其进行控制,如翻转、移动。

1)根据游戏规则,游戏块的运动有各种方式,如下降时左右移动和旋转,其中翻转又根据不同的方块有不同的翻转次数,因此必须在程序代码中很好地区分这些情况。

2)定义程序中常用的变量,包括目前方块的坐标,下一个方块的坐标。

vb俄罗斯方块课程设计

vb俄罗斯方块课程设计

vb俄罗斯方块课程设计一、课程目标知识目标:1. 学生能够理解vb编程的基本概念,掌握利用vb编写简单俄罗斯方块游戏的方法。

2. 学生能够运用vb编程中的循环、条件判断等基本语句,实现方块移动、旋转等功能。

3. 学生了解计算机编程解决问题的基本过程,培养逻辑思维能力。

技能目标:1. 学生能够运用vb编程软件,独立编写出具有基本功能的俄罗斯方块游戏。

2. 学生通过实践操作,提高解决问题的能力,培养动手实践能力。

3. 学生通过小组合作,培养团队协作能力和沟通能力。

情感态度价值观目标:1. 学生对计算机编程产生兴趣,激发学习主动性和积极性。

2. 学生在编程过程中,培养耐心、细心和勇于尝试的精神。

3. 学生通过编程解决实际问题,体会计算机编程的实用价值,增强自信心。

课程性质:本课程为信息技术学科vb编程模块的实践课程,旨在让学生通过动手实践,掌握vb编程的基本方法。

学生特点:六年级学生具有一定的计算机操作基础,对vb编程有一定了解,但实践能力较弱。

教学要求:教师需关注学生个体差异,提供有针对性的指导,引导学生通过自主探究、小组合作等方式完成课程目标。

同时,注重培养学生解决问题的能力和团队协作精神,提高学生的编程素养。

在教学过程中,将课程目标分解为具体的学习成果,便于教学设计和评估。

二、教学内容本节课教学内容围绕vb俄罗斯方块游戏的编写展开,主要包括以下几部分:1. vb编程基础知识回顾:变量、循环结构、条件判断语句等。

- 教材章节:第二章《vb编程基础》2. 俄罗斯方块游戏设计思路及功能模块划分:- 游戏界面设计:方块、背景、得分等元素的设计与布局。

- 方块操作:移动、旋转、消除等功能的实现。

- 游戏逻辑:方块的产生、移动、消行等规则的设计。

3. vb编程实现俄罗斯方块游戏:- 教材章节:第三章《vb控制结构》和第四章《vb数组》- 方块的绘制:使用vb绘图方法绘制方块。

- 方块的移动与旋转:运用循环结构和条件判断实现。

用Excel VBA编写俄罗斯方块游戏

用Excel VBA编写俄罗斯方块游戏
(1)方块初始位置数据的填充
万方数据
,。。‘。。。。。。’。。。。。。。。。。。。。。‘…
实用第一/智慧密集
每种方块共有4个小方块.位置分为行和列。所以将 BlockDataArea区域的8列分为两部分。前4列分别代表1、2、 3、4号小方块出现在游戏区域的行。后面4列分别代表各小 方块出现在游戏区域的列。
Color As Integer HasStopped As Boolean SmallBoxlnCurrentBIock(1 To 4)As SmallBoxPos SmallBoxlnNextPos(1 To 4)As SmallBoxPos CurrentRotateState As Integer RotateChangeData(1 To 4.1 To 4)As SmallBoxPos End Type
向上键时方块会回归原来的状态.第一种方块和第二种方块同
样适合此规律。如此周而复始。
根据上面的叙述.下面创建自定义数据类型TetrisBox来
表示俄罗斯方块。
·
(1)首先一个方块是由四个小方块组成的,所以TetrisBox 结构中应包括一个SmallBoxPos类型的数组。数组元素个数应
为4个。分别代表其包含的4个小方块。
圈1 F.xOol俄罗斯方块 首先打开Excel 2007.新建一个工作簿并将其保存为 Excel启用宏的工作簿.文件名为Excel俄罗斯方块.xlsm,并 将工作表。Sheetl”重命名为“TETRlS”。作为游戏界面并调 整此工作表中的列宽和行宽至合适大小并使其大小一致,因为 在游戏中单元格将被用来组成方块。如果大小不合适或不一致 对游戏的效果影响很大。本例中游戏区域的行宽和列宽都为 16像索大小。
Row As Integer

俄罗斯方块vb代码

俄罗斯方块vb代码

信阳农业高等专科学校《Visual Basic程序设计》课程设计报告报告题目:俄罗斯方块系别:计算机科学系专业:应用电子班级: 10级电子一班姓名:师艳霞辅导老师:侯丽萍完成时间:2011.12.10内容简介我设计的是一个游戏《俄罗斯方块》。

打开Visual Basic程序,创建一个工程,一、新建一个窗体form1,如图所示:二、新建窗体form2,设计窗体,如图所示:将这个窗体的caption属性改为“俄罗斯方块游戏设置”,关卡(速度)内的滑动条HScroll1的largechang属性为5,mas属性为10,min属性为1,smallchange属性为1,tabindex为2。

难度(高度)内的滑动条HScroll2属性同HScroll1,min属性为0,tabindex为4。

编写代码:Private Sub Command2_Click()Form2.HideForm3.ShowEnd SubPrivate Sub Command1_Click()Form2.HideForm3.ShowForm3.Text2.Text = HScroll1.Value Form3.Text1.Text = HScroll2.Value End SubPrivate Sub HScroll2_Change()Frame2.Caption = "难度(高度):" + Str(HScroll2.Value)Command1.SetFocusEnd SubPrivate Sub HScroll2_Scroll()Frame2.Caption = "难度(高度):" + Str(HScroll2.Value)Command1.SetFocusEnd SubPrivate Sub HScroll1_Change()Frame1.Caption = "关卡(速度):" + Str(HScroll1.Value)Command1.SetFocusEnd SubPrivate Sub HScroll1_Scroll()Frame1.Caption = "关卡(速度):" + Str(HScroll1.Value)Command1.SetFocusEnd Sub三、新建窗体form3,设计窗体,如图:窗体的caption属性为“俄罗斯方块”,picture属性添加icon图片。

vb俄罗斯方块代码

vb俄罗斯方块代码

经典俄罗斯方块演示:代码如下:Dim Type_Now As Integer '目前方块的类型Dim Type_Next As Integer '下个方块的类型Dim intRotate As Integer '方块旋转的状态Function Get_X_Value()If GetValue(1, 2) Then 'Get X ValueIf MaxX - MinX >= 2 ThenIf MaxX - CurX <= 1 ThenAdjust_Left = MaxX - 2 - 1ElseAdjust_Left = CurX - 1End IfGet_X_V alue = TrueExit FunctionEnd IfEnd IfGet_X_Value = FalseEnd FunctionFunction GetValue(nType As Integer, nWid As Integer)Call GetCoorOn Error Resume NextDim OKCount, EmptyCount As IntegerMinX = Xs(1).cXMaxX = Xs(1).cXMinY = Xs(1).cYMaxY = Xs(1).cYFor i = 2 To 4If MinX > Xs(i).cX Then MinX = Xs(i).cXIf MaxX < Xs(i).cX Then MaxX = Xs(i).cXIf MinY > Xs(i).cY Then MinY = Xs(i).cYIf MaxY < Xs(i).cY Then MaxY = Xs(i).cYNextFor i = MinX To MaxXFor j = MinY To MaxYIf Total(i, j) ThenGetValue = FalseExit FunctionEnd IfNextNextIf nType = 0 Then 'Get Y ValueEmptyCount = 0 'Get MinYOKCount = 0For i = MinY - 1 To MinY - (nWid - 1) Step -1For j = MinX To MaxXIf Total(j, i) = False Then OKCount = OKCount + 1NextIf OKCount >= picPictureNow.Width And OKCount >= picPictureNow.Height ThenEmptyCount = EmptyCount + 1OKCount = 0ElseExit ForEnd IfNextMinY = MinY - EmptyCountIf MinY < 1 Then MinY = 1EmptyCount = 0 'GetMaxYOKCount = 0For i = MaxY + 1 To MaxY + nWid - 1For j = MinX To MaxXIf Total(j, i) = False Then OKCount = OKCount + 1NextIf OKCount >= picPictureNow.Width And OKCount >= picPictureNow.Height ThenEmptyCount = EmptyCount + 1OKCount = 0ElseExit ForEnd IfNextMaxY = MaxY + EmptyCountIf MaxY > 20 Then MaxY = 20Else 'Get X ValueEmptyCount = 0 'Get MinXOKCount = 0For i = MinX - 1 To MinX - (nWid - 1) Step -1For j = MinY To MaxYIf Total(i, j) = False Then OKCount = OKCount + 1NextIf OKCount >= picPictureNow.Width And OKCount >= picPictureNow.Height ThenEmptyCount = EmptyCount + 1OKCount = 0ElseExit ForEnd IfNextMinX = MinX - EmptyCountIf MinX < 1 Then MinX = 1EmptyCount = 0 'GetMaxXOKCount = 0For i = MaxX + 1 To MaxX + (nWid - 1)For j = MinY To MaxYIf Total(i, j) = False Then OKCount = OKCount + 1NextIf OKCount >= picPictureNow.Width And OKCount >= picPictureNow.Height ThenEmptyCount = EmptyCount + 1OKCount = 0ElseExit ForEnd IfNextMaxX = MaxX + EmptyCountIf MaxX > 10 Then MaxX = 10End IfGetValue = TrueEnd FunctionFunction Get_Y_Value()If GetValue(0, 2) Then 'Get Y ValueIf MaxY - MinY >= 2 ThenIf MaxY - (picPictureNow.Top + 1) <= 1 ThenAdjust_Top = MinY - 1ElseAdjust_Top = picPictureNow.TopEnd IfGet_Y_Value = TrueExit FunctionEnd IfEnd IfGet_Y_Value = FalseEnd FunctionSub Global_Init()'全局初始化picBackGround.ClsimgPictureNext.Picture = LoadPicture("")picPictureNow.Visible = FalsetmrDrop.Enabled = FalseCommand1.Enabled = TrueCommand2.Enabled = FalseCall HScroll1_ChangetmrDrop.Interval = HScroll1.ValueLabel1.Caption = "速度:" + Str(600 - HScroll1.V alue) End SubSub Init()'每个方块的初始化过程picPictureNow.Visible = FalsetmrDrop.Enabled = FalseType_Now = Type_NextpicPictureNow.Picture = imgPictureNext.PictureimgPictureNowBackup.Picture = picPictureNow.PictureCall Sel_NextintRotate = 0picPictureNow.Left = 4picPictureNow.Top = 0picPictureNow.Visible = TruetmrDrop.Enabled = TruetmrDrop.Interval = HScroll1.ValueLabel1.Caption = "速度:" + Str(600 - HScroll1.V alue)Call HScroll1_ChangeEnd SubSub GetCoor()'获取一个方块的4 个点的坐标For i = 1 To 4 'initXs(i).cX = 0Xs(i).cY = 0Xs(i).cZ = FalseNextCurX = picPictureNow.Left + 1Select Case Type_NowCase 1 '长条If intRotate Mod 2 = 1 ThenXs(1).cX = CurXXs(1).cY = picPictureNow.Top + 1Xs(1).cZ = TrueFor i = 2 To 4Xs(i).cX = CurX + i - 1Xs(i).cY = picPictureNow.Top + 1Xs(i).cZ = TrueNextElseXs(1).cX = CurXXs(1).cY = picPictureNow.Top + 4Xs(1).cZ = TrueFor i = 2 To 4Xs(i).cX = CurXXs(i).cY = picPictureNow.Top + i - 1Xs(i).cZ = FalseNextEnd IfCase 2 '2字If intRotate Mod 2 = 1 ThenXs(1).cX = CurXXs(1).cY = picPictureNow.Top + 3Xs(1).cZ = TrueXs(2).cX = CurX + 1Xs(2).cY = picPictureNow.Top + 2Xs(2).cZ = TrueFor i = 3 To 4Xs(i).cX = CurX + i - 3Xs(i).cY = picPictureNow.Top + 5 - iXs(i).cZ = FalseNextElseXs(1).cX = CurXXs(1).cY = picPictureNow.Top + 1Xs(1).cZ = TrueXs(2).cX = CurX + 1Xs(2).cY = picPictureNow.Top + 2Xs(2).cZ = TrueXs(3).cX = CurX + 2Xs(3).cY = picPictureNow.Top + 2Xs(3).cZ = TrueXs(4).cX = CurX + 1Xs(4).cY = picPictureNow.Top + 1Xs(4).cZ = FalseEnd IfCase 3 '7字Select Case intRotate Mod 4Case 0Xs(1).cX = CurXXs(1).cY = picPictureNow.Top + 1Xs(1).cZ = TrueXs(2).cX = CurX + 1Xs(2).cY = picPictureNow.Top + 3Xs(2).cZ = TrueFor i = 3 To 4Xs(i).cX = CurX + 1Xs(i).cY = picPictureNow.Top + i - 2Xs(i).cZ = FalseNextCase 1Xs(1).cX = CurXXs(1).cY = picPictureNow.Top + 2Xs(1).cZ = TrueXs(2).cX = CurX + 1Xs(2).cY = picPictureNow.Top + 2Xs(2).cZ = TrueXs(3).cX = CurX + 2Xs(3).cY = picPictureNow.Top + 2Xs(3).cZ = TrueXs(4).cX = CurX + 2Xs(4).cY = picPictureNow.Top + 1Xs(4).cZ = FalseCase 2Xs(1).cX = CurXXs(1).cY = picPictureNow.Top + 3Xs(1).cZ = TrueXs(2).cX = CurX + 1Xs(2).cY = picPictureNow.Top + 3Xs(2).cZ = TrueFor i = 3 To 4Xs(i).cX = CurXXs(i).cY = picPictureNow.Top + i - 2Xs(i).cZ = FalseNextCase 3Xs(1).cX = CurXXs(1).cY = picPictureNow.Top + 2Xs(1).cZ = TrueXs(2).cX = CurX + 1Xs(2).cY = picPictureNow.Top + 1Xs(2).cZ = TrueXs(3).cX = CurX + 2Xs(3).cY = picPictureNow.Top + 1Xs(3).cZ = TrueXs(4).cX = CurXXs(4).cY = picPictureNow.Top + 1Xs(4).cZ = FalseEnd SelectCase 4 'T字Select Case intRotate Mod 4Case 0Xs(1).cX = CurXXs(1).cY = picPictureNow.Top + 2Xs(1).cZ = TrueXs(2).cX = CurX + 1Xs(2).cY = picPictureNow.Top + 2Xs(2).cZ = TrueXs(3).cX = CurX + 2Xs(3).cY = picPictureNow.Top + 2Xs(3).cZ = TrueXs(4).cX = CurX + 1Xs(4).cY = picPictureNow.Top + 1Xs(4).cZ = FalseCase 1Xs(1).cX = CurXXs(1).cY = picPictureNow.Top + 3Xs(1).cZ = TrueXs(2).cX = CurX + 1Xs(2).cY = picPictureNow.Top + 2Xs(2).cZ = TrueFor i = 3 To 4Xs(i).cX = CurXXs(i).cY = picPictureNow.Top + i - 2Xs(i).cZ = FalseNextCase 2Xs(1).cX = CurXXs(1).cY = picPictureNow.Top + 1Xs(1).cZ = TrueXs(2).cX = CurX + 1Xs(2).cY = picPictureNow.Top + 2Xs(2).cZ = TrueXs(3).cX = CurX + 2Xs(3).cY = picPictureNow.Top + 1Xs(3).cZ = TrueXs(4).cX = CurX + 1Xs(4).cY = picPictureNow.Top + 1Xs(4).cZ = FalseCase 3Xs(1).cX = CurXXs(1).cY = picPictureNow.Top + 2Xs(1).cZ = TrueXs(2).cX = CurX + 1Xs(2).cY = picPictureNow.Top + 3Xs(2).cZ = TrueFor i = 3 To 4Xs(i).cX = CurX + 1Xs(i).cY = picPictureNow.Top + i - 2Xs(i).cZ = FalseNextEnd SelectCase 5 '反7字Select Case intRotate Mod 4Case 0Xs(1).cX = CurXXs(1).cY = picPictureNow.Top + 3Xs(1).cZ = TrueXs(2).cX = CurX + 1Xs(2).cY = picPictureNow.Top + 1Xs(2).cZ = TrueFor i = 3 To 4Xs(i).cX = CurXXs(i).cY = picPictureNow.Top + i - 2Xs(i).cZ = FalseNextCase 1Xs(1).cX = CurXXs(1).cY = picPictureNow.Top + 1Xs(1).cZ = TrueXs(2).cX = CurX + 1Xs(2).cY = picPictureNow.Top + 1Xs(2).cZ = TrueXs(3).cX = CurX + 2Xs(3).cY = picPictureNow.Top + 2Xs(3).cZ = TrueXs(4).cX = CurX + 2Xs(4).cY = picPictureNow.Top + 1Xs(4).cZ = FalseCase 2Xs(1).cX = CurXXs(1).cY = picPictureNow.Top + 3Xs(1).cZ = TrueXs(2).cX = CurX + 1Xs(2).cY = picPictureNow.Top + 3Xs(2).cZ = TrueFor i = 3 To 4Xs(i).cX = CurX + 1Xs(i).cY = picPictureNow.Top + i - 2Xs(i).cZ = FalseNextCase 3Xs(1).cX = CurXXs(1).cY = picPictureNow.Top + 2Xs(1).cZ = TrueXs(2).cX = CurX + 1Xs(2).cY = picPictureNow.Top + 2Xs(2).cZ = TrueXs(3).cX = CurX + 2Xs(3).cY = picPictureNow.Top + 2Xs(3).cZ = TrueXs(4).cX = CurXXs(4).cY = picPictureNow.Top + 1Xs(4).cZ = FalseEnd SelectCase 6 '反2字If intRotate Mod 2 = 1 ThenXs(1).cX = CurXXs(1).cY = picPictureNow.Top + 2Xs(1).cZ = TrueXs(2).cX = CurX + 1Xs(2).cY = picPictureNow.Top + 3Xs(2).cZ = TrueFor i = 3 To 4Xs(i).cX = CurX + i - 3Xs(i).cY = picPictureNow.Top + i - 2Xs(i).cZ = FalseNextElseXs(1).cX = CurXXs(1).cY = picPictureNow.Top + 2Xs(1).cZ = TrueXs(2).cX = CurX + 1Xs(2).cY = picPictureNow.Top + 2Xs(2).cZ = TrueXs(3).cX = CurX + 2Xs(3).cY = picPictureNow.Top + 1Xs(3).cZ = TrueXs(4).cX = CurX + 1Xs(4).cY = picPictureNow.Top + 1Xs(4).cZ = FalseEnd IfCase 7 '田字Xs(1).cX = CurXXs(1).cY = picPictureNow.Top + 2Xs(1).cZ = TrueXs(2).cX = CurX + 1Xs(2).cY = picPictureNow.Top + 2Xs(2).cZ = TrueFor i = 3 To 4Xs(i).cX = CurX + i - 3Xs(i).cY = picPictureNow.Top + 1Xs(i).cZ = FalseNextEnd SelectEnd SubSub Judge_Full()'判断是否堆满R_V alue = picPictureNow.Top + 1 'MinYrx_value = picPictureNow.Top + picPictureNow.Height 'MaxYFor i = rx_value To R_Value Step -1If Total(1, i) And Total(2, i) And Total(3, i) And Total(4, i) And Total(5, i) And _Total(6, i) And Total(7, i) And Total(8, i) And Total(9, i) And Total(10, i) Then'如果一行已经堆满,则将此行上面的图象全部向下移动一点k = BitBlt(picBackGround.hDC, 0, 20, 200, (i - 1) * 20, picBackGround.hDC, 0, 0, vbSrcCopy)For j = i To 1 Step -1For k = 1 To 10Total(k, j) = Total(k, j - 1)Next kNext ji = i + 1End IfNext i'如果目前方块的顶点位置<=0 ,则表示全部堆满If picPictureNow.Top <= 1 ThenSelect Case MsgBox("你输了!想再试试吗?", 4 + 32)Case vbYesmnuGameNew_ClickCase ElseCall Global_InitEnd SelectEnd IfEnd Sub'判断方块能否翻转Function Judge_Rotate()Select Case Type_NowCase 1 '长条If intRotate Mod 2 = 1 ThenIf GetValue(0, 4) Then 'Get Y ValueIf MaxY - MinY >= 3 ThenAdjust_Top = MinY - 1Judge_Rotate = TrueExit FunctionEnd IfEnd IfJudge_Rotate = FalseExit FunctionElseIf GetValue(1, 4) Then 'Get X ValueIf MaxX - MinX >= 3 ThenIf MaxX - CurX <= 2 ThenAdjust_Left = MaxX - 3 - 1ElseIf CurX = MinX ThenAdjust_Left = CurX - 1ElseAdjust_Left = CurX - 1 - 1End IfEnd IfJudge_Rotate = TrueExit FunctionEnd IfEnd IfJudge_Rotate = FalseExit FunctionEnd IfCase 2 '2字If intRotate Mod 2 = 0 ThenJudge_Rotate = Get_Y_ValueExit FunctionElseJudge_Rotate = Get_X_ValueExit FunctionEnd IfCase 3 '7字Select Case intRotate Mod 4Case 0Judge_Rotate = Get_X_ValueExit FunctionCase 1Judge_Rotate = Get_Y_ValueExit FunctionCase 2Judge_Rotate = Get_X_ValueExit FunctionCase 3Judge_Rotate = Get_Y_ValueExit FunctionEnd SelectCase 4 'T字Select Case intRotate Mod 4Case 0Judge_Rotate = Get_Y_ValueExit FunctionCase 1Judge_Rotate = Get_X_ValueExit FunctionCase 2Judge_Rotate = Get_Y_ValueExit FunctionCase 3Judge_Rotate = Get_X_ValueExit FunctionEnd SelectCase 5 '反7字Select Case intRotate Mod 4Case 0Judge_Rotate = Get_X_ValueExit FunctionCase 1Judge_Rotate = Get_Y_ValueExit FunctionCase 2Judge_Rotate = Get_X_ValueExit FunctionCase 3Judge_Rotate = Get_Y_ValueExit FunctionEnd SelectCase 6 '反2字If intRotate Mod 2 = 0 ThenJudge_Rotate = Get_Y_ValueExit FunctionElseJudge_Rotate = Get_X_ValueExit FunctionEnd IfEnd SelectEnd FunctionFunction JudgeX_Left()'判断能否向左移动Call GetCoorFor i = 1 To 4On Error Resume NextIf Xs(i).cY > 0 ThenIf Total(Xs(i).cX - 1, Xs(i).cY) Or Xs(i).cX = 0 ThenJudgeX_Left = FalseExit FunctionEnd IfEnd IfNextJudgeX_Left = TrueEnd FunctionFunction JudgeX_Right()'判断能否向右移动GetCoorFor i = 1 To 4On Error Resume NextIf Xs(i).cY > 0 ThenIf Total(Xs(i).cX + 1, Xs(i).cY) Or Xs(i).cX = 10 ThenJudgeX_Right = FalseExit FunctionEnd IfEnd IfNextJudgeX_Right = TrueEnd Function'判断能否向下移动Sub JudgeY()GetCoorFor i = 1 To 4If Xs(i).cZ ThenOn Error Resume NextIf Xs(i).cY > 0 ThenIf Total(Xs(i).cX, Xs(i).cY + 1) Or Xs(i).cY = 20 Then'如果不能移动,将4点位置的坐标设置为True,并将图形固定下来For j = 1 To 4Total(Xs(j).cX, Xs(j).cY) = TrueNext jpicBackGround.PaintPicture picPictureNow.Picture, picPictureNow.Left, picPictureNow.Top, picPictureNow.Width, picPictureNow.Height, , , , , vbSrcAndJudge_FullIf picPictureNow.Visible Then InitExit SubEnd IfEnd IfEnd IfNextEnd SubSub Sel_Next()'随机从7 个放块中选择一个RandomizeType_Next = Int((7 * Rnd) + 1)Select Case Type_NextCase 1imgPictureNext.Picture = LoadResPicture(11, 0)Case 2imgPictureNext.Picture = LoadResPicture(13, 0)Case 3imgPictureNext.Picture = LoadResPicture(15, 0)Case 4imgPictureNext.Picture = LoadResPicture(19, 0)Case 5imgPictureNext.Picture = LoadResPicture(23, 0)Case 6imgPictureNext.Picture = LoadResPicture(27, 0)Case 7imgPictureNext.Picture = LoadResPicture(29, 0)End SelectimgPictureNext.Move (picPictureNextBackGround.Width - imgPictureNext.Width) \ 2 - 30, (picPictureNextBackGround.Height - imgPictureNext.Height) \ 2 - 30End SubPrivate Sub cmdDisplay_Click()imgPictureNext.Visible = Not (imgPictureNext.Visible)If imgPictureNext.Visible ThencmdDisplay.Caption = "隐藏(&D)"ElsecmdDisplay.Caption = "显示(&S)"End IfEnd SubPrivate Sub Command1_Click()mnuGameNew_ClickEnd SubPrivate Sub Command2_Click()tmrDrop.Interval = 0Command1.Enabled = TrueCommand2.Enabled = FalsefrmForm.ClsEnd SubPrivate Sub Command3_Click()EndEnd SubPrivate Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)'改变Case 的KeyCode 值就可以改变键盘控制按钮Select Case KeyCodeCase vbKeyLeftIf picPictureNow.Left - 1 >= 0 ThenJ_Value = JudgeX_LeftIf J_V alue ThenpicPictureNow.Picture = imgPictureNowBackup.Picturer = BitBlt(picPictureTemp.hDC, 0, 0, picPictureNow.Width * 20, picPictureNow.Height * 20, picBackGround.hDC, (picPictureNow.Left - 1) * 20, picPictureNow.Top * 20, vbSrcCopy)picPictureNow.Left = picPictureNow.Left - 1r = BitBlt(picPictureNow.hDC, 0, 0, picPictureNow.Width * 20, picPictureNow.Height * 20, picPictureTemp.hDC, 0, 0, vbSrcAnd)End IfEnd IfCase vbKeyRightIf picPictureNow.Left + picPictureNow.Width < picBackGround.ScaleWidth Then J_Value = JudgeX_RightIf J_V alue ThenpicPictureNow.Picture = imgPictureNowBackup.Picturer = BitBlt(picPictureTemp.hDC, 0, 0, picPictureNow.Width * 20, picPictureNow.Height * 20, picBackGround.hDC, (picPictureNow.Left + 1) * 20,picPictureNow.Top * 20, vbSrcCopy)picPictureNow.Left = picPictureNow.Left + 1r = BitBlt(picPictureNow.hDC, 0, 0, picPictureNow.Width * 20, picPictureNow.Height * 20, picPictureTemp.hDC, 0, 0, vbSrcAnd)End IfEnd IfCase vbKeyDownCall tmrDrop_TimerCase vbKeyUpIf Judge_Rotate ThenintRotate = intRotate + 1Select Case Type_NowCase 1 '长条If intRotate Mod 2 = 1 ThenpicPictureNow.Picture = LoadResPicture(12, 0)picPictureNow.Top = picPictureNow.Top + 3picPictureNow.Left = Adjust_LeftElsepicPictureNow.Picture = LoadResPicture(11, 0)picPictureNow.Top = Adjust_ToppicPictureNow.Left = picPictureNow.Left + 1End IfCase 2 '2字If intRotate Mod 2 = 1 ThenpicPictureNow.Picture = LoadResPicture(14, 0)picPictureNow.Top = Adjust_TopElsepicPictureNow.Picture = LoadResPicture(13, 0)picPictureNow.Top = picPictureNow.Top + 1picPictureNow.Left = Adjust_LeftEnd IfCase 3 '7字Select Case intRotate Mod 4Case 0picPictureNow.Picture = LoadResPicture(15, 0)picPictureNow.Top = Adjust_TopCase 1picPictureNow.Picture = LoadResPicture(16, 0)picPictureNow.Top = picPictureNow.Top + 1picPictureNow.Left = Adjust_LeftCase 2picPictureNow.Picture = LoadResPicture(17, 0)picPictureNow.Top = Adjust_TopCase 3picPictureNow.Picture = LoadResPicture(18, 0)picPictureNow.Top = picPictureNow.Top + 1picPictureNow.Left = Adjust_LeftEnd SelectCase 4 'T字Select Case intRotate Mod 4Case 0picPictureNow.Picture = LoadResPicture(19, 0)picPictureNow.Top = picPictureNow.Top + 1picPictureNow.Left = Adjust_LeftCase 1picPictureNow.Picture = LoadResPicture(20, 0)picPictureNow.Top = Adjust_TopCase 2picPictureNow.Picture = LoadResPicture(21, 0)picPictureNow.Top = picPictureNow.Top + 1picPictureNow.Left = Adjust_LeftCase 3picPictureNow.Picture = LoadResPicture(22, 0)picPictureNow.Top = Adjust_TopEnd SelectCase 5 '反7字Select Case intRotate Mod 4Case 0picPictureNow.Picture = LoadResPicture(23, 0)picPictureNow.Top = Adjust_TopCase 1picPictureNow.Picture = LoadResPicture(24, 0)picPictureNow.Top = picPictureNow.Top + 1picPictureNow.Left = Adjust_LeftCase 2picPictureNow.Picture = LoadResPicture(25, 0)picPictureNow.Top = Adjust_TopCase 3picPictureNow.Picture = LoadResPicture(26, 0)picPictureNow.Top = picPictureNow.Top + 1picPictureNow.Left = Adjust_LeftEnd SelectCase 6 '反2字If intRotate Mod 2 = 1 ThenpicPictureNow.Picture = LoadResPicture(28, 0)picPictureNow.Top = Adjust_TopElsepicPictureNow.Picture = LoadResPicture(27, 0)picPictureNow.Top = picPictureNow.Top + 1picPictureNow.Left = Adjust_LeftEnd IfEnd SelectimgPictureNowBackup.Picture = picPictureNow.PictureEnd IfEnd SelectEnd SubPrivate Sub HScroll1_Change()If tmrDrop.Interval <> 0 Then'改变tmrDrop 的Interval 值即可改变游戏速度tmrDrop.Interval = HScroll1.ValueLabel1.Caption = "速度:" + Str(600 - HScroll1.Value)End IfEnd SubPrivate Sub mnuGameAbout_Click()MsgBox "VB课程设计实例" + Chr$(13) + Chr$(10) + "——俄罗斯方块" + Chr$(13) + Chr$(10) + " 2006.8", 0, "关于俄罗斯方块"End SubPrivate Sub mnuGameExit_Click()EndEnd SubPrivate Sub mnuGameNew_Click()'将10x20 的坐标全部设置为空For i = 1 To 10For j = 0 To 20Total(i, j) = FalseNext jNext iCurX = 0picBackGround.ClsSel_NextInitCommand1.Enabled = FalseCommand2.Enabled = TrueEnd SubPrivate Sub mnuHelpKey_Click()'游戏规则MsgBox "←控制方块向左移动" + vbCrLf _+ "→控制方块向右移动" _+ vbCrLf + "↓控制方块向下快速移动" _+ vbCrLf + "↑控制方块的顺时针方向的翻转", 64, "游戏规则"End SubPrivate Sub tmrDrop_Timer()'方块下落Call JudgeYpicPictureNow.Picture = imgPictureNowBackup.Picturer = BitBlt(picPictureTemp.hDC, 0, 0, picPictureNow.Width * 20, picPictureNow.Height * 20, picBackGround.hDC, picPictureNow.Left * 20, (picPictureNow.Top + 1) * 20, vbSrcCopy) picPictureNow.Top = picPictureNow.Top + 1r = BitBlt(picPictureNow.hDC, 0, 0, picPictureNow.Width * 20, picPictureNow.Height * 20, picPictureTemp.hDC, 0, 0, vbSrcAnd)DoEventsIf picPictureNow.Top + picPictureNow.Height > picBackGround.ScaleHeight Then InitEnd Sub。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、课程设计的目的与要求 (2)1.1、俄罗斯方块的要求 (2)1.2、俄罗斯方块设计的目的 (3)二、题目分析 (4)2.1、概要设计 (4)2.2、详细设计 (4)游戏区模块的设计 (5)控制区模块的设计 (5)三、设计思路 (6)3.1、系统流程的总设计 (6)3.2、游戏区模块的设计 (7)3.2.1、Bitblt函数参数的意义与用法 (7)3.2.2、俄罗斯方块的旋转 (8)3.2.3、如何实现方自动消除满行的方块 (9)3.2.4、随机从 7 个方块中选择一个 (10)3.2.5、设置每个模块的测试计 (11)3.3、整体游戏程序的结构设计 (11)3.4、程序设计 (13)四、调试过程 (14)4.1、设计游戏界面 (14)4.2、完善与改善游戏界面 (15)五、运行结果 (18)六、课程设计总结 (20)附录 (22)一、课程设计的目的与要求1.1、俄罗斯方块的要求俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分,俄罗斯方块游戏是一款适合大众的游戏软件,它适合不同年龄的人玩。

本软件要实现的功能如下:(1)游戏区:玩家可以在游戏区中堆积方块,并能够在游戏过程中随时了解得分情况。

(2)游戏控制:玩家可以通过游戏控制功能来选择开始新的一局游戏,暂停或退出游戏。

(3)级别设置:玩家可以根据自己的需要自行设定游戏的开始级别,级别越高,游戏的速度越快,难度越大。

游戏规则如下:(1)电脑随机产生4个小方块组成的不同形状的游戏块,从上往下降落。

(2)游戏面板的宽度为12(以小方块的宽度为单位),高度为22,当一行被12个小方块填满时,此行便会被自动消除。

(3)利用键盘上的左右箭头键可以控制游戏块的左移与右移。

(4)利用键盘上的向上箭头键可以控制游戏块的旋转。

(5)利用键盘上的向下箭头键可以控制游戏块的快速下落。

(6)当游戏块无法下落时,游戏结束。

(7)在屏幕上可以显示将出现的下一个游戏块。

1.2、俄罗斯方块设计的目的无可争议,《俄罗斯方块》是有史以来最伟大的游戏之一。

它是永恒的娱乐经典,但它实际上又和那些传统的经典娱乐方式不同,因为它的本质是电子化的,所以它的确属于现代产物。

《俄罗斯方块》举世闻名的游戏性,在该游戏新鲜出炉时就显得非常直观。

某些与坠落的玩具碎片和它们的形状有关的东西,使得哪怕新手也会很自然地企图把它们排列起来,并加以适当组合,就好似《俄罗斯方块》触动了我们某些内在的感官,使得哪怕是我们当中最杂乱无章的人也要把事情整理妥当。

在曾经发布过的所有游戏中,《俄罗斯方块》还被认为是仅有的一个能够真正吸引广泛人群的作品。

某些批评家也许会声称,《俄罗斯方块》要比过去二十年间出现的任何东西都要浪费人们的时间。

至于我们,则要欣然提名它为GameSpot评选出的历史上最伟大游戏之一。

为了怀念经典,也为了能够给大多的计算机用户在工作之余找到一个休闲、娱乐的一个方式,我们小组开始着手用VB语言开发一个经典的俄罗斯方块游戏。

关键字:游戏,模块,多媒体。

二、题目分析2.1、概要设计设计一款游戏,必然少不了流程图,与整个开发的逻辑。

流程图如图1所示:图1 俄罗斯方块的设计流程图2.2、详细设计游戏区模块的设计游戏区的流程设计如图2所示:图2 游戏区模块的设计流程控制区模块的设计游戏区的流程设计如图3所示:图3游戏区模块的设计流程三、设计思路结合游戏区与控制去模板的设计流程,可以得出系统总流程,如图4所示:3.1、系统流程的总设计3.2、游戏区模块的设计游戏区模块总体上划分为三个模块,分别为游戏开始模块、游戏退出模块、帮助模块。

一个游戏必须是要有游戏规则的。

其中的帮助就是教会我的玩法,以及其中的规则3.2.1、Bitblt函数参数的意义与用法函数功能:该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境。

函数原型:BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop);参数:dcDest:指向目标设备环境的句柄。

nXDest:指定目标矩形区域左上角的X轴逻辑坐标。

nYDest:指定目标矩形区域左上角的Y轴逻辑坐标。

nWidth:指定源和目标矩形区域的逻辑宽度。

nHeight:指定源和目标矩形区域的逻辑高度。

hdcSrc:指向源设备环境的句柄。

nXSrc:指定源矩形区域左上角的X轴逻辑坐标。

nYSrc:指定源矩形区域左上角的Y轴逻辑坐标。

光栅操作代码:SrcCopy:将源矩形区域直接拷贝到目标矩形区域。

dwRop:指定光栅操作代码。

这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。

3.2.2、俄罗斯方块的旋转俄罗斯方块的旋转主要将方块的位置加以变换得到的,例如上述范例,长条型有两中样式,根据小方块的编号变动来实现整个造型的旋转,比如:If Judge_Rotate ThenintRotate = intRotate + 1Select Case Type_NowCase 1 '长条If intRotate Mod 2 = 1 ThenpicPictureNow.Picture = LoadResPicture(12, 0)picPictureNow.Top = picPictureNow.Top + 3picPictureNow.Left = Adjust_LeftElsepicPictureNow.Picture = LoadResPicture(11, 0)picPictureNow.Top = Adjust_ToppicPictureNow.Left = picPictureNow.Left + 1End If3.2.3、如何实现方自动消除满行的方块我们的这个俄罗斯方块游戏主要是利用command控件的visible属性完成效果的,其实在游戏区图形框可以看成是由许多的command小方块组成,方块运动的过程就是造型里方块显示或者隐藏,就像现在的霓虹灯效果一样,由时钟控件控制visible 属性改变的速度,上一层的消失,下一层的显示,这样,从视觉效果可以看到方块的下落运动效果。

方块在下落的过程中会自动判断每一行方块的visible属性,如果全部为true时,就会将这一行小方块的visible属性全部变成false,在将上面的小方块向下移动,利用for语句进行循环判断,将所有这样情况的行改变小方块visible属性。

当有多行同时出现这样情况时使用递归调用,实现连续消行。

具体程序代码如下:R_Value = picPictureNow.Top + 1 'MinYrx_value = picPictureNow.Top + picPictureNow.Height 'MaxYFor i = rx_value To R_Value Step -1If Total(1, i) And Total(2, i) And Total(3, i) And Total(4, i) And Total(5, i) And _Total(6, i) And Total(7, i) And Total(8, i) And Total(9, i) And Total(10, i) Then'如果一行已经堆满,则将此行上面的图象全部向下移动一点k = BitBlt(picBackGround.hDC, 0, 20, 200, (i - 1) * 20, picBackGround.hDC, 0, 0, vbSrcCopy)For j = i To 1 Step -1For k = 1 To 10Total(k, j) = Total(k, j - 1)Next kNext ji = i + 1End IfNext i3.2.4、随机从 7 个方块中选择一个使用Randomize函数来进行选择。

用number将Rnd函数的随机数生成器初始化,该随机数生成器给number一个新的种子值。

例如:RandomizeType_Next = Int((7 * Rnd) + 1)Select Case Type_NextCase 1imgPictureNext.Picture = LoadResPicture(11, 0) Case 2imgPictureNext.Picture = LoadResPicture(13, 0) Case 3imgPictureNext.Picture = LoadResPicture(15, 0) Case 4imgPictureNext.Picture = LoadResPicture(19, 0) Case 5imgPictureNext.Picture = LoadResPicture(23, 0) Case 6imgPictureNext.Picture = LoadResPicture(27, 0) Case 7imgPictureNext.Picture = LoadResPicture(29, 0)End Select3.2.5、设置每个模块的测试计在每个模块中的某个控件功能代码编写完成后,需要将他们分别测试,以便及时发现问题,并及时调整问题,在该模块中的所有控件的功能代码都完成之后,需要对它的总体功能进行测试。

如果出现问题,可以在该功能所在的代码区中进行修改,多次测试,直到没有错误为止。

3.3、整体游戏程序的结构设计1.进入游戏窗体——一进入此窗体中,在菜单中有“新游戏”“退出”“键盘”“关于”。

开始游戏了之后用户可一按上下左右键来进行游戏。

在帮助中有“键盘”和“关于”,可以帮助人们了解此游戏的方法与规则。

2模块——主要对空件和要用到的函数进行了定义。

如,BitBlt 函数。

3.相关文件——主要在外部把方块模型进行了绘制,在这里我们使用LoadResPicture( ) 来调用。

1.要实现游戏中各种方块的图形,然后对其进行控制,如翻转、移动。

1)根据游戏规则,游戏块的运动有各种方式,如下降时左右移动和旋转,其中翻转又根据不同的方块有不同的翻转次数,因此必须在程序代码中很好地区分这些情况。

2)定义程序中常用的变量,包括目前方块的坐标,下一个方块的坐标。

Dim t As Integer 't表示c(2)小方块纵坐标Dim l As Integer 'l表示c(2)小方块横坐标Dim tt As Integer 'tt表示cc(2)小方块纵坐标Dim ll As Integer 'll表示cc(2)小方块横坐标,均以方块的左上角坐标来描述方块位置。

相关文档
最新文档