当前位置:首页 » 课程大全 » vb俄罗斯方块课程设计

vb俄罗斯方块课程设计

发布时间: 2021-02-19 13:59:04

㈠ 怎么用vb制作俄罗斯方块游戏啊,简单点的。

罗斯方块的发明者,是当时还被称为"苏联"的联邦科学员阿莱克斯?帕吉托夫,该游版戏最初是作为权自我消遣的电脑游戏而被制作出来的。

现在制作如下
开始
同时全盘检测键盘
全局判断
扫描每行格式是否有满的
有就清除当行显示
将上面左边下一Y>0
加分
判断分值是否到升级速度阶段
到则加速下落

随机抽取方块
随机抽取下落地点
判断下落速度下落方块(TIMER控件)
如果按下则加快下落

㈡ 求一个vb做的俄罗斯方块程序 有注释的

PrivateSubcmdpause_Click()'编写暂定按钮的代码
SelectCasecmdpause.Caption
Case"暂停"
cmdpause.Caption="继续"
tmrmain.Enabled=False
cmdabout.Enabled=True
Case"继续"
cmdpause.Caption="暂停"
tmrmain.Enabled=True
cmdabout.Enabled=False
picmain.SetFocus
EndSelect
EndSub

PrivateSubcmdstart_Click()
Ifcmdstart.Caption="开始"Then
picmain.SetFocus
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
tmrmain.Interval=1000/Val(txtlevel.Text)'根据关卡系数设置方块下降速度
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Fori=19To20-Val(txthard.Text)Step-1'根据难度系数产生不同难度的地基
Forj=i*10Toi*10+9
IfRnd>=0.5Thencmdfang(j).Visible=True
Next
Next
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Fori=0To3'引用预览区已经产生的方块
n(i)=m(i)
Next
showfang0
situation=situation2
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
tmrmain.Enabled=True'设置一些控件的可用性
cmdpause.Enabled=True
cmdoption.Enabled=False
cmdabout.Enabled=False
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
hidefang1'清空预览区
loadfangkuai'继续在预览区产生方块
showfang1
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
cmdstart.Caption="结束"
Else
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
tmrmain.Enabled=False'设置一些控件的可用性
cmdpause.Enabled=False
cmdoption.Enabled=True
cmdabout.Enabled=True
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Fori=1To199
cmdfang(i).Visible=False
Next
cmdstart.Caption="开始"
txtscore.Text="0"
linenum=0
EndIf
EndSub


㈢ 用VB做的俄罗斯方块的论文怎么写

前 言
visual basic继承了basic语言易学易用的特点,特别适合于初学者学习windows系统编程。随着21世纪信息社会的到来,计算机在人们的工作和生活中的深入,要求我们越来越多地与计算机打交道,为了使用户在繁忙的日程工作中得到放松,于是出现了各种各样的休闲软件,如聊天工具,游戏等等。于是我们小组着手设计开始一个这样的游戏软件。通过这学期来Visual Basic的学习,我初步掌握了Visual Basic语言的最基本的知识,于是在牛荣和李鹏等老师的指导下动手用Visual Basic编写俄罗斯方块游戏。
我们之所以选择开发俄罗斯方块游戏,无可争议,《俄罗斯方块》是有史以来最伟大的游戏之一。 在曾经发布过的所有游戏中,《俄罗斯方块》还被认为是仅有的一个能够真正吸引广泛人群的作品。谁能说清楚,迄今为止人们究竟花了多少万个小时在这个游戏上?也许这些时间本来可以被花在更具生产力的活动上。某些批评家也许会声称,《俄罗斯方块》要比过去二十年间出现的任何东西都要浪费人们的时间。至于我们,则要欣然提名它为GameSpot评选出的历史上最伟大游戏之一。
为了怀念经典,也为了能够给大多的计算机用户在工作之余找到一个休闲、娱乐的一个方式,我们小组开始着手用VB语言开发一个经典的俄罗斯方块游戏。
工程概况
2.1 项目名称
俄罗斯方块游戏
2.2 设计平台
VB 全称Visual Basic,它是以Basic语言作为其基本语言的一种可视化编程工具。
Vb是microsoft公司于1991年退出的windows应用程序开发工具visual意思是“可视化的”。在它刚推出来时,自身还存在一些缺陷,功能也相对少一些。但是经过多年的开发研究。最近microsoft公司又推出了VB6.0版本
VB6.0运行环境:硬件,要求486以上的处理器、16MB以上内存,50MB 以上的硬盘,cd-rom驱动器,鼠标。软件:要求windows 95以上版本。
2.3程序设计思想
游戏是用来给大家娱乐的,所以要能在使用的过程中给大家带来快乐,消除大家的疲劳,所以我们在游戏中添加了漂亮的场景和动听的音乐,设置了过关升级的功能,激发大家的娱乐激情。
从游戏的基本玩法出发,主要就是俄罗斯方块的形状和旋转,我们在设计中在一个图片框中构造了一个4*4的网状小块,由这些小块组合成新的形状,每四个小块连接在一起就可以构造出一种造型,因此我们总共设计了7中造型,每种造型又可以通过旋转而变化出2到4种形状,利用随机函数在一个欲览窗体中提前展示形状供用户参考,然后将展示的形状复制到游戏窗体中进行摆放,在游戏窗体中用户就可以使用键盘的方向键来控制方块的运动,然后利用递归语句对每一行进行判断,如果有某行的方块是满的,则消除这行的方块,并且使上面的方块自由下落,其中,方块向下的速度是有时钟控件控制的,在游戏中,用户也可以使用向下键加快下落速度,定义一个变量,对消除的函数进行记录,最后就可以得出用户的分数,用if 语句对分数判断,达到一定的积分就可以升级到下一个档次。
俄罗斯方块游戏设计的主要步骤为以下10个方面:
(1)游戏界面的设计。
(2)俄罗斯方块的造型。
(3)俄罗斯方块的旋转。
(4)俄罗斯方块的运动情况(包括向左,向右和向下)。
(5)俄罗斯方块的自动消行功能。
(6)游戏级别的自由选择。
(7)游戏速度的自由选择。
(8)游戏得分的计算。
(9)游戏菜单选项的设计及功能实现。
(10)游戏的背景音乐及特效。
2.4运用的控件和主要对象
我们在设计过程中主要用到的控件有:command控件,image控件,picture控件,label控件,timer控件,text控件,windows media player控件等等。
2.5主要实现的功能
我们开发的俄罗斯方块游戏,主要实现了以下几种功能:
1.可以灵活控制方块在图形框中运动。
2.游戏过程中方块可以自由旋转。
3.当某一行的方块排列满时,将自动将这一行方块消除,然后将上面所有方块向下移动,可以支持连续消行。
4.游戏前可以选择游戏的速度和游戏的等级,游戏速度既为方块下落速度,游戏等级为初始游戏时在基层随机生成一定行数的无规律方块,生成的行数由你来选择,每行至少产生5个以上的无规律方块,这样增加了游戏难度,对于游戏高手来说,无疑不是一个新的挑战。
5.游戏的得分支持积分,并且按照公式:
得分 = 原来分数+ 100 * (2 ^ 同时消除的行数-1)
这样,你同一时间消除的行数越多,你的得分也就越高,当游戏积分到了一定时可以自动升级,这个升级指速度升级。
6.游戏中提供了一个漂亮的场景和动听的音乐,给你带来无限激情。
2.6开发人员
由于这次课程设计所选的题目太复杂,而时间又比较紧张,指导老师建议和同学分工完成。我们小组成员包括组长孙磊周,副组长邹海星,此游戏由我们两个人共同开发而成。
正文
3.1游戏设计的具体实现
在我们两个人共同努力下,此次设计,终于能够圆满完成。由于时间的紧促,在设计中,也许会有一些考虑不周之处,但其功能已经能够满足大多用户的需求,相信假以时日,一定能做出一个更经典,更完美的俄罗斯方块游戏,下面我们将对每一步的具体如何实现展示给大家。
3.1.1游戏界面的设计和背景音乐及特效的实现
俄罗斯方块游戏主要由两个界面构成,登陆界面和开始游戏界面,在登陆界面中我们可以首先看到圣诞节的晚上飘梅花的场景,梅花从窗体顶部做函数曲线的下落运动,在窗体中定义一个Image控件组,在通用中定义梅花X坐标变量动态数组,Y坐标变量动态数组,步距X的变量动态数组,步距Y的变量动态数组,以及振幅变量动态数组。然后在窗体form_load中可以定义梅花的数量,利用随机函数产生随机的梅花坐标,步距和振幅,Image控件在运行时候就调用梅花图片,Image控件就可以由时钟控件控制下落速度,可以自由调节,梅花按snow(i).Left = xp(i) + am(i) * Sin(dx(i))函数在做纵向的正玄函数轨迹运动,竖直方向上为自由下落运动,,有am(i)来控制梅花的左右移动振幅。因此,我们就可以看到一个梅花在空中自由飘舞的画面了。
背景画面是用photoshop软件处理的漂亮图案,原本画面中的动画效果都是由Image控件制作的,还有点击进入游戏的按钮是由Label控件实现的,因为Image控件没有置前置后功能,不能将下雪的场景体现完整性,所以将这些图案全部放在背景上,不影响雪花飘落的效果,当点击画面的时候一样可以进入游戏界面。
游戏的背景音乐是由一段代码调用系统播放器Windows Player播放背景音乐,由于本次设计主要是针对游戏如何设计的,所以在这里就不对播放背景音乐的功能做介绍了。
3.1.2俄罗斯方块的造型
相信朋友们都玩过俄罗斯方块,对这个游戏的玩法和方块形状都比较熟悉。我们这个游戏只选择了最基本的7中造型,包括长条型,正方型,正S型,反S型,正7型,反7型,T型。如果需要我们可以添加更多的造型。将游戏界面的游戏区图片框分割成10*20的小块,每个小块放置一个command控件,预览区图片框按同样比例分割成4*4的小块,同样有command控件构成,我们可以把预览区图片框看作是从游戏区图片框中选取的一个部分,游戏区的小方块编号和欲览区编号如下图:
0 1 2 3 4 5 6 7 8 9
… … … … … … … … … …
… … … … … … … … … …
90 91 92 93 94 95 96 97 98 99
3 4 5 6
13 14 15 16
23 24 25 26
33 34 35 36
游戏区编号 欲览区编号
利用Select将方块的7中造型列出,比如长条型的设计,在欲览区中分别有3.4.5.6和5.15.25.35四个方块构成两中形态,用数组为:
m(0) = 3: m(1) = 4: m(2) = 5: m(3) = 6: situation2 = 0
m(0) = 5: m(1) = 15: m(2) = 25: m(3) = 35: situation2 = 1
将它的形状编号为0和1,在后面方便调用,其他的方块造型同样的方法。
3.1.3俄罗斯方块的旋转
俄罗斯方块的旋转主要将方块的位置加以变换得到的,例如上述范例,长条型有两中样式,根据小方块的编号变动来实现整个造型的旋转,比如:
If n(0) - 18 >= 2 And n(3) + 9 <= 198 Then
If cmdfang(n(0) - 18).Visible = False And _
cmdfang(n(1) - 9).Visible = False And _
cmdfang(n(3) + 9).Visible = False Then
hidefang 0
n(0) = n(0) - 18
n(1) = n(1) - 9
n(3) = n(3) + 9
showfang 0
situation = 1
End If
End If
方块的造型在旋转的时候存在一个公式,当然首先要判断是否满足旋转的要求,以上是一个长条型由横着变成竖立状态的旋转,我们以它的造型中的第三个小方块n(3)为中心旋转,这样,在开始运动的时候,长条形要发生旋转最少要运动到第三行,才能由横着变成竖立状态,游戏区图形框中第三行的第一个方块的编号为20,所以长条造型的第一个小方块的编号n(0)必须要大于20。同样,长条型方块在下落到底部的时候也有限制。如果长条下落到最后一行也将无法由横着变成竖立状态。
3.1.4如何实现方块的运动和自动消除满行的方块
我们的这个俄罗斯方块游戏主要是利用command控件的visible属性完成效果的,其实在游戏区图形框可以看成是由许多的command小方块组成,方块运动的过程就是造型里方块显示或者隐藏,就像现在的霓虹灯效果一样,由时钟控件控制visible属性改变的速度,上一层的消失,下一层的显示,这样,从视觉效果可以看到方块的下落运动效果。
方块在下落的过程中会自动判断每一行方块的visible属性,如果全部为true时,就会将这一行小方块的visible属性全部变成false,在将上面的小方块向下移动,利用for语句进行循环判断,将所有这样情况的行改变小方块visible属性。当有多行同时出现这样情况时使用递归调用,实现连续消行。具体程序代码如下:
For i = 190 To 10 Step -10
If cmdfang(i).Visible = True And _
cmdfang(i + 1).Visible = True And _
cmdfang(i + 2).Visible = True And _
cmdfang(i + 3).Visible = 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 _
cmdfang(i + 8).Visible = True And _
cmdfang(i + 9).Visible = True Then
For j = i + 4 To i Step -1
t = 1
cmdfang(j).Visible = False
cmdfang(2 * i + 9 - j).Visible = False
For k = 1 To 4000
DoEvents
Next
t = 0
Next
linenum = linenum + 1
For j = i - 1 To 0 Step -1
If cmdfang(j).Visible = True Then
cmdfang(j).Visible = False
cmdfang(j + 10).Visible = True
End If
Next
clearline '为了实现连消数行,这里使用递归调用
End If
Next
3.1.5游戏速度和游戏级别自由选择
游戏速度的自由选择无非就是改变时钟控件的频率,我们在菜单中添加了选择速度的功能,还有添加了考验功能,将欲览窗中的方块造型隐藏,给玩家提高了难度,如果你不愿意接受考验也可以点击显示还原成原来状态。
游戏级别的自由选择是让用户选择游戏开始时候,游戏区底部出现一定行数的随机方块,同样给玩家增加了难度,功能代码如下:
For i = 19 To 20 - Val(txthard.Text) Step -1
For j = i * 10 To i * 10 + 9
If Rnd >= 0.5 Then cmdfang(j).Visible = True
Next
Next
可以根据你选择的难度系数在底层的每一行随机产生超过半数(即5个以上)以上的小方块,这样适合喜欢高难度的玩家。
3.1.6游戏得分的计算和游戏菜单的编辑
游戏得分的计算主要是根据消除的行数来决定的,当然每一次同时消除的行数不一样,每一行的得分也不一样,如果你每次消除的行数为1,则最后得分是100分,如果同时消除2行,则最后得分是300分,同时消除3行,得分为700分,同时消除4行,得分为1500分,这由公式:得分 = 原来分数+ 100 * (2 ^ 同时消除的行数-1)。
游戏的编辑,读者可以参照下面的功能介绍。
3.2 游戏功能的介绍
文件-------开始:开始游戏。
继续:继续游戏。
暂停:暂时停止游戏,点击继续的时候可以继续游戏。
退出:退出游戏。
设置-------选择游戏级别。
选择游戏速度。
考验-------显示:显示欲览去方块。
隐藏:隐藏欲览去方块。
帮助-------操作提示以及版本信息和作者资料。

用户界面具体如图:

图—登陆界面 图—游戏界面

图—菜单编辑界面 图—游戏帮助界面
有关说明
经过两个多星期的设计和开发,俄罗斯方块游戏已经成功。其功能基本符合用户需求,能够完成游戏的控制,方块的变换以及消层等功能。并提供游戏设置,对于一些技术性比较过硬的玩家,可以调游戏级别、以及游戏速度,使得玩家能够充分的发挥竞技游戏的特色,可以不断的挑战自我,挑战极限。
4.1游戏设计中的不足之处
但是由于课程设计时间较短,所以该游戏还有许多不尽如人意的地方,比如方块类型太少,退出游戏不能存储进度等多方面问题。这些都有待进一步改善,我们在游戏中还可以更换背景音乐,以适合不同的玩家,在每通过一关可以给玩家播放一段flash,吸引玩家去挑战极限,不断提高玩家的兴趣,相信在以后的制作过程中我们将给大家带来一个更新功能更全面的游戏。
4.2VB与C语言之间的不同之处
我们这个小游戏也可以用C语言来实现,在程序的编程上没有VB语言方便实用,C语言和VB语言之间存在很多的共同点,虽然语法方面有点差异,但是在编程思路上完全一样,VB能够实现很多C#不能做到的功能,如When语句、Optional参数、局部Static变量、对象实例访问静态方法、Handles绑定事件、On Error处理异常、Object直接后期绑定等等。VB和C#语言,编译出来的是同样的CIL,但为什么VB支持很多有趣的特性呢。我们一起来探究一下。
4.21局部静态变量
VB支持用Static关键字声明局部变量,这样在过程结束的时候可以保持变量的数值:
Public Sub Test1()
Static i As Integer
i += 1 '实现一个过程调用计数器
End Sub
我们实现了一个简单的过程计数器。每调用一次Test,计数器的数值就增加1。其实还有很多情况我们希望保持变量的数值。而C#的static是不能用在过程内部的。因此要实现过程计数器,我们必须声明一个类级别的变量。这样做明显不如VB好。因为无法防止其他过程修改计数器变量。这就和对象封装一个道理,本来应该是一个方法的局部变量,现在我要被迫把它独立出来,显然是不好的设计。那么VB是怎么生成局部静态变量的呢?将上述代码返汇编,我们可以清楚地看到在VB生成的CIL中,i不是作为局部变量,而是作为类的Field出现的: .field private specialname int32 $STATIC$Test1$2001$i
也就是说,i被改名作为一个类的字段,但被冠以specialname。在代码中试图访问$STATIC$Test1$2001$i是不可能的,因为它不是一个有效的标识符。但是在IL中,将这个变量加一的代码却与一般的类字段完全一样,是通过ldfld加载的。我觉得这个方法十分聪明,把静态变量变成生命周期一样的类字段,但是又由编译器来控制访问的权限,让它成为一个局部变量。同时也解释了VB为什么要用两个不同的关键字来声明静态变量——Static和Shared。由于局部静态变量的实质是类的字段,所以它和真正的局部变量还是有所不同的。比如在多线程条件下,对局部静态变量的访问就和访问字段相同。
4.2.2Handles和WithEvents
VB除了可以用C#那样的方法来处理事件响应以外,还有从VB5继承下来的独特的事件处理方式——WithEvents。
我喜欢称这种事件处理方式为静态的事件处理,书写响应事件的方法时就已经决定该方法响应的是哪一个事件,而C#则是在代码中绑定事件的。VB中WithEvents静态方法是非常有用的,它可以显著增强代码可读性,同时也让VB.net中的事件处理非常方便,不像C#那样离开了窗体设计器就必须手工绑定事件。
4.2.3类型转换运算符
在Visual Basic 2005中将加入一个新的运算符——TryCast,相当于C#的as运算符。我一直希望VB有这样一个运算符。VB目前的类型转换运算符主要有CType和DirectCast。他们的用法几乎一样。我详细比较了一下这两个运算符,得出以下结论:
1.在转换成引用类型时,两者没有什么区别,都是直接调用castclass指令,除非重载了类型转换运算符CType。DirectCast运算符是不能重载的。
2.转换成值类型时,CType会调用VB指定的类型转换函数(如果有的话),比如将String转换为Int32时,就会自动调用。
4.2.4默认属性和属性参数
在原先的VB6里,有一项奇特的功能——默认属性。在VB6中,对象的名称可以直接表示该对象的默认属性。
4.2.5可选参数和按名传递
VB从4.0开始支持“可选参数”这一特性。就是说,函数或子程序的参数有些是可选的,调用的时候可以不输入。其实VB从1.0开始就有一些函数带有可选参数,只不过到了4.0才让用户自己开发这样的过程。在VB4里,可选参数可以不带默认值,而在VB里,如果使用可选参数,则必须带有默认值。在调用的时候,VB若发现参数被省略,则自动读取.param部分的默认值,并显式传递给过程。这一部分完全由编译器处理,而且没有任何性能损失,和手工传递所有参数是完全一样的。至于按名传递,VB会自动调整参数的顺序,其结果与传统方式的传递也没有任何的不同。这说明我们可以放心地使用这项便利。而且带有可选参数的过程拿到C#中,顶多变成不可选参数,也不会造成什么其他的麻烦。
PS.很多COM组件都使用了默认参数,而且有些过程的参数列表非常长,在VB里可以轻松地处理它们,而在C#中经常让开发者传参数传到吐血。
4.2.6在经过对比之后可得以下一个结论:
1.目前的主流编程语言没有简单的,如果你想学精通的话。
2.VB的门槛比较低,编程思想较容易接受。
3.学习C不能短期内见到成效。
4.据用户调查69%的考生觉得VB更容易接受

致谢
在本次课程设计中,我从指导老师牛荣和李鹏身上学到了很多东西。老师认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我收益匪浅。他无论在理论上还是在实践中,都给与我很大的帮助,使我得到不少的提高这对于我以后的工作和学习都有一种巨大的帮助,感谢他耐心的辅导。
另外,在游戏开发过程中化希耀老师和杜义君老师也给于我们很大的帮助,帮助解决了不少的难点,使得游戏能及时开发完成,还有所有的同学同样给与我不少帮助,这里一并表示感。

参考文献:
[1]Vsual Basic 程序设计教程 作者:龚沛曾,陆慰民,杨志强 高等教育出版社出版
[2]Vsual Basic 6.0程序设计 作者:刘新民,蔡琼,白糠生 清华大学出版社出版
[3]80例上手 VB6 编程 作者:唐凯军,汤惠莉 山东电子音像出版社
[4]Vsual Basic 实例教程 作者:卢毅 科学出版社出版
[5]Vsual Basic 经典范例50讲 作者:赵欣胜,亢慧娟,刘晟宏 科学出版社出版

㈣ 如何用VB制作俄罗斯方块游戏

BAIDU一下俄罗斯源代码,有好多个吧..

㈤ VB 俄罗斯方块设计程序代码 VB程序做的 俄罗斯方块 要有窗体,控键,代码整套的那种!

Moudle1:

Public NowY() As Integer
Public NowX() As Integer
Public NowShape As Integer
Public block() As Boolean

Private Sub Cmd1_Click() '开始/重新开始

ReDim block(Int(Text1.Text) + 1, Int(Text2.Text) + 1) '定义2维数组

For i = 1 To Int(Text1.Text) '以下9行是初始化数组,令可操作(Pic1以内)的部分为,Pic1以外的边缘部分为True
For j = 1 To Int(Text2.Text)
block(i, j) = False
block(0, j) = True
block(i, 0) = True
block(Int(Text1.Text) + 1, j) = True
block(i, Int(Text2.Text) + 1) = True
Next j
Next i
Text1.Enabled = False
Text2.Enabled = False
Cmd2.Enabled = True

Call MakeBlock '产生方块
Timer1.Enabled = True '开始
Cmd1.Caption = "重新开始"
Text3.Text = 0
Pic1.SetFocus '令Pic1接收键盘

End Sub

Private Sub Cmd2_Click() '暂停/继续

If Cmd2.Caption = "暂停" Then
Timer1.Enabled = False
Cmd2.Caption = "继续"
Else
Timer1.Enabled = True
Cmd2.Caption = "暂停"
End If

Pic1.SetFocus '令Pic1接收键盘

End Sub

Private Sub Cmd3_Click()
End
End Sub

Private Sub Form_Load()
Randomize '随机种子

ReDim NowX(3)
ReDim NowY(3) '定义数组来记录当前的4个方块的坐标
Image1(0).Width = 300
Image1(0).Height = 300
Image2(0).Width = 300
Image2(0).Height = 300
Image2(0).Picture = Image1(0).Picture '对相关Image的描述

For i = 1 To 3
Load Image2(i)
Image2(i).Visible = True
Next i '装载所需的Image2,并设置为可见
Image2(0).Visible = True

End Sub

Sub MakeBlock() '随机产生方块图形
Static NextShape As Integer '定义静态变量NextShape,用来存储下一个图形的样式。

NowX(0) = Int(Text1.Text) \ 2
NowY(0) = 1 '先定义第一个方块的坐标

NowShape = IIf(NextShape = 0, Fix(7 * Rnd) + 1, NextShape) '当前形状根据“下一个”而定

NextShape = Fix(7 * Rnd) + 1 '得到下一个即将出现的类型

Select Case NowShape '以下Case是按照事先规定的编号给相应的点赋予坐标值

Case 1 '方形
NowX(1) = NowX(0) + 1
NowY(1) = 1

NowX(2) = NowX(0)
NowY(2) = 2

NowX(3) = NowX(0) + 1
NowY(3) = 2

Case 2 'L形
NowX(1) = NowX(0) + 1
NowY(1) = 1

NowX(2) = NowX(0) + 1
NowY(2) = 2

NowX(3) = NowX(0) + 1
NowY(3) = 3

Case 3 '反L形
NowX(1) = NowX(0) + 1
NowY(1) = 1

NowX(2) = NowX(0)
NowY(2) = 2

NowX(3) = NowX(0)
NowY(3) = 3

Case 4 '长条形
For i = 1 To 3
NowX(i) = NowX(0)
NowY(i) = i + 1
Next i

Case 5 'Z形
NowX(1) = NowX(0) - 1
NowY(1) = 2

NowX(2) = NowX(0)
NowY(2) = 2

NowX(3) = NowX(0) - 1
NowY(3) = 3

Case 6 '反Z形
NowX(1) = NowX(0)
NowY(1) = 2

NowX(2) = NowX(0) + 1
NowY(2) = 2

NowX(3) = NowX(0) + 1
NowY(3) = 3

Case 7 'T形
NowX(1) = NowX(0) - 1
NowY(1) = 2

NowX(2) = NowX(0)
NowY(2) = 2

NowX(3) = NowX(0) + 1
NowY(3) = 2

End Select
For i = 0 To 3
If block(NowX(i), NowY(i)) = True Then '如果在即将产生的点中出现了已存在点(堆满)
Timer1.Enabled = False
Cmd2.Enabled = False
MsgBox "游戏结束", vbOKOnly, "gameover" '则游戏结束
Exit Sub
Else
block(NowX(i), NowY(i)) = True '如果没有堆满,则产生相应的点
End If
Next i

Image2(0).Left = 600
Image2(0).Top = 400

Select Case NextShape '以下Case是绘制“下一个”中的图形
Case 1
Image2(1).Left = 900
Image2(1).Top = 400
Image2(2).Left = 600
Image2(2).Top = 700
Image2(3).Left = 900
Image2(3).Top = 700
Case 2
Image2(1).Left = 900
Image2(1).Top = 400
Image2(2).Left = 900
Image2(2).Top = 700
Image2(3).Left = 900
Image2(3).Top = 1000
Case 3
Image2(1).Left = 900
Image2(1).Top = 400
Image2(2).Left = 600
Image2(2).Top = 700
Image2(3).Left = 600
Image2(3).Top = 1000
Case 4
Image2(1).Left = 600
Image2(1).Top = 700
Image2(2).Left = 600
Image2(2).Top = 1000
Image2(3).Left = 600
Image2(3).Top = 1300
Case 5
Image2(1).Left = 300
Image2(1).Top = 700
Image2(2).Left = 600
Image2(2).Top = 700
Image2(3).Left = 300
Image2(3).Top = 1000
Case 6
Image2(1).Left = 600
Image2(1).Top = 700
Image2(2).Left = 900
Image2(2).Top = 700
Image2(3).Left = 900
Image2(3).Top = 1000
Case 7
Image2(1).Left = 300
Image2(1).Top = 700
Image2(2).Left = 600
Image2(2).Top = 700
Image2(3).Left = 900
Image2(3).Top = 700
End Select

Call DrawBlock '重画所有方块

End Sub

Private Sub Pic1_KeyDown(KeyCode As Integer, Shift As Integer) '根据按键执行相应动作

Select Case KeyCode
Case 37 '左
Call MoveBlock(-1, 0)

Case 40 '下
Call MoveBlock(0, 1)

Case 39 '右
Call MoveBlock(1, 0)

Case 38 '上(旋转)
Call Eddy

End Select

End Sub

Private Sub Timer1_Timer()
Call MoveBlock(0, 1) '定时向下移动
End Sub

Sub MoveBlock(MoveX As Integer, MoveY As Integer) '在3个方向上平移方块

ReDim NewX(3) As Integer
ReDim NewY(3) As Integer

For i = 0 To 3
block(NowX(i), NowY(i)) = False '先令当前的4个方块所在点为False,便于判断是否可移动
NewX(i) = NowX(i) + MoveX
NewY(i) = NowY(i) + MoveY '算出移动后新点所在坐标,并赋给新点坐标组NewX(),NewY()
Next i

If AllowChange(NewX(), NewY()) = False Then '如果不可移动

For i = 0 To 3
block(NowX(i), NowY(i)) = True '因为不可移动,所以将暂时变为False的方块所在点改为True
Next i

If MoveY = 1 Then '如果是向下移动
Call Clear '判断是否可执行或执行消除整行的动作
Call MakeBlock '产生新的方块图形
End If

Else '如果可以移动

For i = 0 To 3
block(NewX(i), NewY(i)) = True '令新点坐标的值为True
NowX(i) = NewX(i)
NowY(i) = NewY(i) '将新点坐标赋给当前点坐标
Next i

End If

Call DrawBlock '重画所有方块

End Sub
Sub DrawBlock() '重画所有方块
For i = 1 To Image1.Count - 1
Unload Image1(i) '先卸载之前的所有方块
Next i

For i = 1 To Int(Text1.Text)
For j = 1 To Int(Text2.Text)
If block(i, j) = True Then '如果遇到True的点
Load Image1(Image1.Count) '加载新的Image1
Image1(Image1.Count - 1).Left = (i - 1) * 300
Image1(Image1.Count - 1).Top = (j - 1) * 300 '确定新Image1的位置,因为是从1开始算,所以要i-1,j-1
Image1(Image1.Count - 1).Visible = True
End If
Next j
Next i

End Sub

Sub Eddy() '旋转,以图(文末处)中2号点为旋转中心

ReDim NewX(3) As Integer
ReDim NewY(3) As Integer '定义即将旋转到新坐标的数组

If NowShape = 1 Then Exit Sub '如果是方块则退出Sub

For i = 0 To 3
block(NowX(i), NowY(i)) = False '把旋转前所有点都变成False,以便判断是否可以旋转。
NewX(i) = NowY(2) - NowY(i) + NowX(2)
NewY(i) = NowX(i) - NowX(2) + NowY(2) '利用坐标运算确定新坐标的位置,并赋给数组NewX(),NewY()
Next i '

If AllowChange(NewX(), NewY()) = True Then '如果可以变化
For i = 0 To 3
block(NewX(i), NewY(i)) = True '把新坐标的点都变为True
NowX(i) = NewX(i)
NowY(i) = NewY(i) '把所有新点坐标赋给当前坐标
Next i
Else '如果不能变化
For i = 0 To 3
block(NowX(i), NowY(i)) = True
Next i '把刚才改成False的点都变成True,相当于无变化
End If

Call DrawBlock '重画所有方块

End Sub
Function AllowChange(NewX() As Integer, NewY() As Integer) As Boolean '根据坐标判断是否能变化(包括翻转和移动)
On Error Resume Next
For i = 0 To 3
If block(NewX(i), NewY(i)) = True Then
AllowChange = False '如果有一个点已经存在(值为True),返回值则为False,即不可变化。
Exit Function '防止多于的循环造成错误,所以离开函数。
Else
AllowChange = True '否则可以变化。
End If
Next i

End Function
Sub Clear() '判断并执行销掉整排方块的动作

Dim Xn As Integer
Dim row As Boolean

For j = 0 To 3
Xn = 0
Do While Xn < Int(Text1.Text)
Xn = Xn + 1
row = True
row = row And block(Xn, NowY(j)) '和同一排的点做And运算。
If row = False Then Exit Do '如果发现有False值,则证明同一排有空缺点,则不再循环。
Loop

If row = True Then '经过循环,如果同一排的点都是True(存在),那么开始销去
Text3.Text = Text3.Text + 100 '加100分
For i = 1 To Int(Text1.Text)
block(i, NowY(j)) = False '通过循环把该排(Y=Now(j))的方块销去(令对应的数组值为False)
Next i

'接下来就该把该排上面堆积的方块向下移动一个格

For k = NowY(j) - 1 To 1 Step -1 '从该排的上一层开始,先动下层,再动上层。如果从上到下就会在移动下层时覆盖掉上层移动完的结果
For l = 1 To Int(Text1.Text) '从左到右,这个顺序倒没关系
If block(l, k) = True Then '如果在移动范围内发现有方块
block(l, k) = False '先销掉该方块(如果先动上层则会把上层移动后的点变成False,就相当于令上层移动的点消失)
block(l, k + 1) = True '在该方块的下面产生一个新的方块(相当于向下移)
End If
Next l
Next k

End If

Next j

Call DrawBlock '画出所有方块
End Sub

㈥ VB写俄罗斯方块!VB 高手进。

Public Class Form1
Dim new_p, old_p As ToolStripMenuItem '设置级别
Public interval As Integer
Public check(7, 15) As Boolean
Dim panel2(4) As Point
Dim intSquareStyle As Integer
Dim oldSquareStyle As IntegerPrivate Sub mypanel1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles mypanel1.Paint
Dim i As Integer
Dim j As Integer
For i = 0 To 7
For j = 0 To 15
If check(i, j) Then
DrawSquare(i, j, mypanel1)
End If
Next
Next
End SubPrivate Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
Dim intResponse As Integer
Timer1.Enabled = False
intResponse = MessageBox.Show("是否要保存应用程序?", "俄罗斯方块", MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1)
If intResponse = vbYes Then
Dim i, j As Integer
WritePrivateProfileString("俄罗斯方块", "Score", Label2.Text, Application.StartupPath & "\app.ini")
For i = 0 To 7
For j = 0 To 15
WritePrivateProfileString("俄罗斯方块", "check" & CStr(i) & CStr(j), IIf(check(i, j), "1", "0").ToString, Application.StartupPath & "\app.ini")
Next
Next
WritePrivateProfileString("俄罗斯方块", "jibie", old_p.Tag.ToString, Application.StartupPath & "\app.ini")
For i = 0 To 3
WritePrivateProfileString("俄罗斯方块", "NewSquares" & CStr(i) & "X", SquresBase.Squares(i).X.ToString, Application.StartupPath & "\app.ini")
WritePrivateProfileString("俄罗斯方块", "NewSquares" & CStr(i) & "Y", SquresBase.Squares(i).Y.ToString, Application.StartupPath & "\app.ini")
Next i
WritePrivateProfileString("俄罗斯方块", "symmetryX", SquresBase.symmetry.X.ToString, Application.StartupPath & "\App.ini")
WritePrivateProfileString("俄罗斯方块", "symmetryY", SquresBase.symmetry.Y.ToString, Application.StartupPath & "\App.ini")
WritePrivateProfileString("俄罗斯方块", "SquareStyle", oldSquareStyle.ToString, Application.StartupPath & "\App.ini")
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
frmStart.ShowDialog()
If frmStart.newGame Then
interval = 400
Timer1.Interval = interval
old_p = 低级ToolStripMenuItem
old_p.Checked = True
Label2.Text = "0"
Else
' the score is 0
Dim i, j As Integer
Dim s As String = "10"
' GetPrivateProfileString("abc", "Score", "0", Label2.Text, 256, Application.StartupPath & "\App.ini")
GetPrivateProfileString("俄罗斯方块", "Score", "10", s, 256, Application.StartupPath & "\App.ini")Label2.Text = s
For i = 0 To 7
For j = 0 To 15
GetPrivateProfileString("俄罗斯方块", "check" & CStr(i) & CStr(j), "0", s, 256, Application.StartupPath & "\app.ini")
check(i, j) = CBool(IIf(CInt(s) = 1, True, False))
Next
Next
buttom = mypanel1.Height()
Dim jibie As String = " "
GetPrivateProfileString("俄罗斯方块", "jibie", "3", jibie, 256, Application.StartupPath & "\App.ini")
Dim TSM As ToolStripMenuItem
For Each TSM In GameToolStripMenuItem.DropDownItems
If TSM.Tag.ToString = CInt(Trim(jibie)).ToString Then
old_p = TSM
Exit For
Else
old_p = 低级ToolStripMenuItem
End If
Next
Dim Strinterval As String = " "
GetPrivateProfileString("俄罗斯方块", "inteval", "400", Strinterval, 256, Application.StartupPath & "\App.ini")
interval = CInt(Trim(Strinterval))
Timer1.Interval = interval
If Not old_p Is 低级ToolStripMenuItem Then
低级ToolStripMenuItem.Checked = False
End If
old_p.Checked = True
'构造方块
newSquares = New SquresBase
Dim str As String
For i = 0 To 3
str = " "
GetPrivateProfileString("俄罗斯方块", "NewSquares" & CStr(i) & "X", "2", str, 256, Application.StartupPath & "\App.ini")
SquresBase.Squares(i).X = CInt(Trim(str))
str = " "
GetPrivateProfileString("俄罗斯方块", "NewSquares" & CStr(i) & "Y", "0", str, 256, Application.StartupPath & "\App.ini")
SquresBase.Squares(i).Y = CInt(Trim(str))
Next
str = " "
GetPrivateProfileString("俄罗斯方块", "symmetryX", "0", str, 256, Application.StartupPath & "\App.ini")
SquresBase.symmetry.X = CInt(Trim(str))
str = " "
GetPrivateProfileString("俄罗斯方块", "symmetryY", "0", str, 256, Application.StartupPath & "\App.ini")
SquresBase.symmetry.Y = CInt(Trim(str))
str = " "
GetPrivateProfileString("俄罗斯方块", "SquareStyle", "0", str, 256, Application.StartupPath & "\App.ini")
oldSquareStyle = CInt(Trim(str))
End IfEnd SubPrivate Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Timer1.Stop()
mypanel1.Focus()
newSquares.MoveDown()
Timer1.Start()
End Sub
Private Sub ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 开始ToolStripMenuItem.Click, 低级ToolStripMenuItem.Click, 高级ToolStripMenuItem.Click, ToolStripMenuItem2.Click, 中级ToolStripMenuItem1.Click
Dim tempMenuItem As ToolStripMenuItem
tempMenuItem = CType(sender, ToolStripMenuItem)
Dim temp As Int32
temp = CInt(tempMenuItem.Tag)
Select Case temp
Case 0
'advance
new_p = tempMenuItem
Timer1.Interval = 100
Case 1
'normal
new_p = tempMenuItem
Timer1.Interval = 300
Case 2
'easy
new_p = tempMenuItem
Timer1.Interval = 400
Case 3
'start
Dim i, j As Integer
For j = 0 To 15
For i = 0 To 7
If check(i, j) Then
Timer1.Start()
createpanel2()
Exit Sub
End If
Next
Next
Start()
Exit Sub
Case 4
'restarted
restarted()
Exit Sub
End Select
inteval = Timer1.Interval
old_p.Checked = False
new_p.Checked = True
old_p = new_p
End SubPrivate Sub DrawSquare(ByVal x As Integer, ByVal y As Integer, ByVal panel As Panel)
Randomize()
Dim myBrush As New System.Drawing.SolidBrush(Color.AliceBlue)
Dim panelGraphics As System.Drawing.Graphics
panelGraphics = panel.CreateGraphics
panelGraphics.FillRectangle(myBrush, New Rectangle(x * IntSize, y * IntSize, IntSize, IntSize))
panelGraphics.DrawRectangle(Pens.LightBlue, New Rectangle(x * IntSize, y * IntSize, 16, 16))
panelGraphics.DrawRectangle(Pens.Blue, New Rectangle(x * IntSize + 2, y * IntSize + 2, 12, 12))
panelGraphics.DrawRectangle(Pens.DarkBlue, New Rectangle(x * IntSize + 4, y * IntSize + 4, 8, 8))
panelGraphics.FillRectangle(New System.Drawing.SolidBrush(Color.SkyBlue), New Rectangle(x * IntSize + 4, y * IntSize + 4, 8, 8))
myBrush.Dispose()
panelGraphics.Dispose()
If panel Is mypanel1 Then
check(x, y) = True
End If
End Sub
Private Sub DrawSquares(ByVal panel As Panel)
Dim i As Integer
For i = 0 To 3
DrawSquare(Squares(i).X, Squares(i).Y, panel)
Next
End Sub

㈦ 请问有哪本书很详细得讲解了怎么用VB制作俄罗斯方块

《visual
basic程序设计》
忘了哪个出版社的了,书上有从入门开始到基本的编程
俄罗斯方块是书中一个实例,你可以找找

㈧ 如何用VB做课程设计(俄罗斯方块或计算机一二级考试系统)

市面上有专来门讲如何用源VB做游戏的书,一个典型例子就是俄罗斯方块。
至于想学怎么用VB,先把VB的基础学好吧。我是搞VB的,曾经一个人用VB和SQL Server给单位做ERP,但自身水平一般。我自己做过俄罗斯方块,不是很成功,如果需要,给我你的邮箱,我把我的代码给你。

㈨ vb做俄罗斯方块论文和程序

前 言
visual basic继承了basic语言易学易用的特点,特别适合于初学者学习系统编程。随着21世纪信息社会的到来,计算机在人们的工作和生活中的深入,要求我们越来越多地与计算机打交道,为了使用户在繁忙的日程工作中得到放松,于是出现了各种各样的休闲软件,如聊天工具,游戏等等。于是我们小组着手设计开始一个这样的游戏软件。通过这学期来Visual Basic的学习,我初步掌握了Visual Basic语言的最基本的知识,于是在牛荣和李鹏等老师的指导下动手用Visual Basic编写俄罗斯方块游戏。
我们之所以选择开发俄罗斯方块游戏,无可争议,《俄罗斯方块》是有史以来最伟大的游戏之一。 在曾经发布过的所有游戏中,《俄罗斯方块》还被认为是仅有的一个能够真正吸引广泛人群的作品。谁能说清楚,迄今为止人们究竟花了多少万个小时在这个游戏上?也许这些时间本来可以被花在更具生产力的活动上。某些批评家也许会声称,《俄罗斯方块》要比过去二十年间出现的任何东西都要浪费人们的时间。至于我们,则要欣然提名它为GameSpot评选出的历史上最伟大游戏之一。
为了怀念经典,也为了能够给大多的计算机用户在工作之余找到一个休闲、娱乐的一个方式,我们小组开始着手用VB语言开发一个经典的俄罗斯方块游戏。
工程概况
2.1 项目名称
俄罗斯方块游戏
2.2 设计平台
VB 全称Visual Basic,它是以Basic语言作为其基本语言的一种可视化编程工具。
Vb是microsoft公司于1991年退出的windows应用程序开发工具visual意思是“可视化的”。在它刚推出来时,自身还存在一些缺陷,功能也相对少一些。但是经过多年的开发研究。最近microsoft公司又推出了VB6.0版本
VB6.0运行环境:硬件,要求486以上的处理器、16MB以上内存,50MB 以上的硬盘,cd-rom驱动器,鼠标。软件:要求windows 95以上版本。
2.3程序设计思想
游戏是用来给大家娱乐的,所以要能在使用的过程中给大家带来快乐,消除大家的疲劳,所以我们在游戏中添加了漂亮的场景和动听的音乐,设置了过关升级的功能,激发大家的娱乐激情。
从游戏的基本玩法出发,主要就是俄罗斯方块的形状和旋转,我们在设计中在一个图片框中构造了一个4*4的网状小块,由这些小块组合成新的形状,每四个小块连接在一起就可以构造出一种造型,因此我们总共设计了7中造型,每种造型又可以通过旋转而变化出2到4种形状,利用随机函数在一个欲览窗体中提前展示形状供用户参考,然后将展示的形状复制到游戏窗体中进行摆放,在游戏窗体中用户就可以使用键盘的方向键来控制方块的运动,然后利用递归语句对每一行进行判断,如果有某行的方块是满的,则消除这行的方块,并且使上面的方块自由下落,其中,方块向下的速度是有时钟控件控制的,在游戏中,用户也可以使用向下键加快下落速度,定义一个变量,对消除的函数进行记录,最后就可以得出用户的分数,用if 语句对分数判断,达到一定的积分就可以升级到下一个档次。
俄罗斯方块游戏设计的主要步骤为以下10个方面:
(1)游戏界面的设计。
(2)俄罗斯方块的造型。
(3)俄罗斯方块的旋转。
(4)俄罗斯方块的运动情况(包括向左,向右和向下)。
(5)俄罗斯方块的自动消行功能。
(6)游戏级别的自由选择。
(7)游戏速度的自由选择。
(8)游戏得分的计算。
(9)游戏菜单选项的设计及功能实现。
(10)游戏的背景音乐及特效。
2.4运用的控件和主要对象
我们在设计过程中主要用到的控件有:command控件,image控件,picture控件,label控件,timer控件,text控件,windows media player控件等等。
2.5主要实现的功能
我们开发的俄罗斯方块游戏,主要实现了以下几种功能:
1.可以灵活控制方块在图形框中运动。
2.游戏过程中方块可以自由旋转。
3.当某一行的方块排列满时,将自动将这一行方块消除,然后将上面所有方块向下移动,可以支持连续消行。
4.游戏前可以选择游戏的速度和游戏的等级,游戏速度既为方块下落速度,游戏等级为初始游戏时在基层随机生成一定行数的无规律方块,生成的行数由你来选择,每行至少产生5个以上的无规律方块,这样增加了游戏难度,对于游戏高手来说,无疑不是一个新的挑战。
5.游戏的得分支持积分,并且按照公式:
得分 = 原来分数+ 100 * (2 ^ 同时消除的行数-1)
这样,你同一时间消除的行数越多,你的得分也就越高,当游戏积分到了一定时可以自动升级,这个升级指速度升级。
6.游戏中提供了一个漂亮的场景和动听的音乐,给你带来无限激情。
2.6开发人员
由于这次课程设计所选的题目太复杂,而时间又比较紧张,指导老师建议和同学分工完成。我们小组成员包括组长孙磊周,副组长邹海星,此游戏由我们两个人共同开发而成。
正文
3.1游戏设计的具体实现
在我们两个人共同努力下,此次设计,终于能够圆满完成。由于时间的紧促,在设计中,也许会有一些考虑不周之处,但其功能已经能够满足大多用户的需求,相信假以时日,一定能做出一个更经典,更完美的俄罗斯方块游戏,下面我们将对每一步的具体如何实现展示给大家。
3.1.1游戏界面的设计和背景音乐及特效的实现
俄罗斯方块游戏主要由两个界面构成,登陆界面和开始游戏界面,在登陆界面中我们可以首先看到圣诞节的晚上飘梅花的场景,梅花从窗体顶部做函数曲线的下落运动,在窗体中定义一个Image控件组,在通用中定义梅花X坐标变量动态数组,Y坐标变量动态数组,步距X的变量动态数组,步距Y的变量动态数组,以及振幅变量动态数组。然后在窗体form_load中可以定义梅花的数量,利用随机函数产生随机的梅花坐标,步距和振幅,Image控件在运行时候就调用梅花图片,Image控件就可以由时钟控件控制下落速度,可以自由调节,梅花按snow(i).Left = xp(i) + am(i) * Sin(dx(i))函数在做纵向的正玄函数轨迹运动,竖直方向上为自由下落运动,,有am(i)来控制梅花的左右移动振幅。因此,我们就可以看到一个梅花在空中自由飘舞的画面了。
背景画面是用photoshop软件处理的漂亮图案,原本画面中的动画效果都是由Image控件制作的,还有点击进入游戏的按钮是由Label控件实现的,因为Image控件没有置前置后功能,不能将下雪的场景体现完整性,所以将这些图案全部放在背景上,不影响雪花飘落的效果,当点击画面的时候一样可以进入游戏界面。
游戏的背景音乐是由一段代码调用系统播放器Windows Player播放背景音乐,由于本次设计主要是针对游戏如何设计的,所以在这里就不对播放背景音乐的功能做介绍了。
3.1.2俄罗斯方块的造型
相信朋友们都玩过俄罗斯方块,对这个游戏的玩法和方块形状都比较熟悉。我们这个游戏只选择了最基本的7中造型,包括长条型,正方型,正S型,反S型,正7型,反7型,T型。如果需要我们可以添加更多的造型。将游戏界面的游戏区图片框分割成10*20的小块,每个小块放置一个command控件,预览区图片框按同样比例分割成4*4的小块,同样有command控件构成,我们可以把预览区图片框看作是从游戏区图片框中选取的一个部分,游戏区的小方块编号和欲览区编号如下图:
0 1 2 3 4 5 6 7 8 9
… … … … … … … … … …
… … … … … … … … … …
90 91 92 93 94 95 96 97 98 99
3 4 5 6
13 14 15 16
23 24 25 26
33 34 35 36
游戏区编号 欲览区编号
利用Select将方块的7中造型列出,比如长条型的设计,在欲览区中分别有3.4.5.6和5.15.25.35四个方块构成两中形态,用数组为:
m(0) = 3: m(1) = 4: m(2) = 5: m(3) = 6: situation2 = 0
m(0) = 5: m(1) = 15: m(2) = 25: m(3) = 35: situation2 = 1
将它的形状编号为0和1,在后面方便调用,其他的方块造型同样的方法。
3.1.3俄罗斯方块的旋转
俄罗斯方块的旋转主要将方块的位置加以变换得到的,例如上述范例,长条型有两中样式,根据小方块的编号变动来实现整个造型的旋转,比如:
If n(0) - 18 >= 2 And n(3) + 9 <= 198 Then
If cmdfang(n(0) - 18).Visible = False And _
cmdfang(n(1) - 9).Visible = False And _
cmdfang(n(3) + 9).Visible = False Then
hidefang 0
n(0) = n(0) - 18
n(1) = n(1) - 9
n(3) = n(3) + 9
showfang 0
situation = 1
End If
End If
方块的造型在旋转的时候存在一个公式,当然首先要判断是否满足旋转的要求,以上是一个长条型由横着变成竖立状态的旋转,我们以它的造型中的第三个小方块n(3)为中心旋转,这样,在开始运动的时候,长条形要发生旋转最少要运动到第三行,才能由横着变成竖立状态,游戏区图形框中第三行的第一个方块的编号为20,所以长条造型的第一个小方块的编号n(0)必须要大于20。同样,长条型方块在下落到底部的时候也有限制。如果长条下落到最后一行也将无法由横着变成竖立状态。
3.1.4如何实现方块的运动和自动消除满行的方块
我们的这个俄罗斯方块游戏主要是利用command控件的visible属性完成效果的,其实在游戏区图形框可以看成是由许多的command小方块组成,方块运动的过程就是造型里方块显示或者隐藏,就像现在的霓虹灯效果一样,由时钟控件控制visible属性改变的速度,上一层的消失,下一层的显示,这样,从视觉效果可以看到方块的下落运动效果。
方块在下落的过程中会自动判断每一行方块的visible属性,如果全部为true时,就会将这一行小方块的visible属性全部变成false,在将上面的小方块向下移动,利用for语句进行循环判断,将所有这样情况的行改变小方块visible属性。当有多行同时出现这样情况时使用递归调用,实现连续消行。具体程序代码如下:
For i = 190 To 10 Step -10
If cmdfang(i).Visible = True And _
cmdfang(i + 1).Visible = True And _
cmdfang(i + 2).Visible = True And _
cmdfang(i + 3).Visible = 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 _
cmdfang(i + 8).Visible = True And _
cmdfang(i + 9).Visible = True Then
For j = i + 4 To i Step -1
t = 1
cmdfang(j).Visible = False
cmdfang(2 * i + 9 - j).Visible = False
For k = 1 To 4000
DoEvents
Next
t = 0
Next
linenum = linenum + 1
For j = i - 1 To 0 Step -1
If cmdfang(j).Visible = True Then
cmdfang(j).Visible = False
cmdfang(j + 10).Visible = True
End If
Next
clearline '为了实现连消数行,这里使用递归调用
End If
Next
3.1.5游戏速度和游戏级别自由选择
游戏速度的自由选择无非就是改变时钟控件的频率,我们在菜单中添加了选择速度的功能,还有添加了考验功能,将欲览窗中的方块造型隐藏,给玩家提高了难度,如果你不愿意接受考验也可以点击显示还原成原来状态。
游戏级别的自由选择是让用户选择游戏开始时候,游戏区底部出现一定行数的随机方块,同样给玩家增加了难度,功能代码如下:
For i = 19 To 20 - Val(txthard.Text) Step -1
For j = i * 10 To i * 10 + 9
If Rnd >= 0.5 Then cmdfang(j).Visible = True
Next
Next
可以根据你选择的难度系数在底层的每一行随机产生超过半数(即5个以上)以上的小方块,这样适合喜欢高难度的玩家。
3.1.6游戏得分的计算和游戏菜单的编辑
游戏得分的计算主要是根据消除的行数来决定的,当然每一次同时消除的行数不一样,每一行的得分也不一样,如果你每次消除的行数为1,则最后得分是100分,如果同时消除2行,则最后得分是300分,同时消除3行,得分为700分,同时消除4行,得分为1500分,这由公式:得分 = 原来分数+ 100 * (2 ^ 同时消除的行数-1)。
游戏的编辑,读者可以参照下面的功能介绍。
3.2 游戏功能的介绍
文件-------开始:开始游戏。
继续:继续游戏。
暂停:暂时停止游戏,点击继续的时候可以继续游戏。
退出:退出游戏。
设置-------选择游戏级别。
选择游戏速度。
考验-------显示:显示欲览去方块。
隐藏:隐藏欲览去方块。
帮助-------操作提示以及版本信息和作者资料。

用户界面具体如图:

图—登陆界面 图—游戏界面

图—菜单编辑界面 图—游戏帮助界面
有关说明
经过两个多星期的设计和开发,俄罗斯方块游戏已经成功。其功能基本符合用户需求,能够完成游戏的控制,方块的变换以及消层等功能。并提供游戏设置,对于一些技术性比较过硬的玩家,可以调游戏级别、以及游戏速度,使得玩家能够充分的发挥竞技游戏的特色,可以不断的挑战自我,挑战极限。
4.1游戏设计中的不足之处
但是由于课程设计时间较短,所以该游戏还有许多不尽如人意的地方,比如方块类型太少,退出游戏不能存储进度等多方面问题。这些都有待进一步改善,我们在游戏中还可以更换背景音乐,以适合不同的玩家,在每通过一关可以给玩家播放一段flash,吸引玩家去挑战极限,不断提高玩家的兴趣,相信在以后的制作过程中我们将给大家带来一个更新功能更全面的游戏。
4.2VB与C语言之间的不同之处
我们这个小游戏也可以用C语言来实现,在程序的编程上没有VB语言方便实用,C语言和VB语言之间存在很多的共同点,虽然语法方面有点差异,但是在编程思路上完全一样,VB能够实现很多C#不能做到的功能,如When语句、Optional参数、局部Static变量、对象实例访问静态方法、Handles绑定事件、On Error处理异常、Object直接后期绑定等等。VB和C#语言,编译出来的是同样的CIL,但为什么VB支持很多有趣的特性呢。我们一起来探究一下。
4.21局部静态变量
VB支持用Static关键字声明局部变量,这样在过程结束的时候可以保持变量的数值:
Public Sub Test1()
Static i As Integer
i += 1 '实现一个过程调用计数器
End Sub
我们实现了一个简单的过程计数器。每调用一次Test,计数器的数值就增加1。其实还有很多情况我们希望保持变量的数值。而C#的static是不能用在过程内部的。因此要实现过程计数器,我们必须声明一个类级别的变量。这样做明显不如VB好。因为无法防止其他过程修改计数器变量。这就和对象封装一个道理,本来应该是一个方法的局部变量,现在我要被迫把它独立出来,显然是不好的设计。那么VB是怎么生成局部静态变量的呢?将上述代码返汇编,我们可以清楚地看到在VB生成的CIL中,i不是作为局部变量,而是作为类的Field出现的: .field private specialname int32 $STATIC$Test1$2001$i
也就是说,i被改名作为一个类的字段,但被冠以specialname。在代码中试图访问$STATIC$Test1$2001$i是不可能的,因为它不是一个有效的标识符。但是在IL中,将这个变量加一的代码却与一般的类字段完全一样,是通过ldfld加载的。我觉得这个方法十分聪明,把静态变量变成生命周期一样的类字段,但是又由编译器来控制访问的权限,让它成为一个局部变量。同时也解释了VB为什么要用两个不同的关键字来声明静态变量——Static和Shared。由于局部静态变量的实质是类的字段,所以它和真正的局部变量还是有所不同的。比如在多线程条件下,对局部静态变量的访问就和访问字段相同。
4.2.2Handles和WithEvents
VB除了可以用C#那样的方法来处理事件响应以外,还有从VB5继承下来的独特的事件处理方式——WithEvents。
我喜欢称这种事件处理方式为静态的事件处理,书写响应事件的方法时就已经决定该方法响应的是哪一个事件,而C#则是在代码中绑定事件的。VB中WithEvents静态方法是非常有用的,它可以显著增强代码可读性,同时也让VB.net中的事件处理非常方便,不像C#那样离开了窗体设计器就必须手工绑定事件。
4.2.3类型转换运算符
在Visual Basic 2005中将加入一个新的运算符——TryCast,相当于C#的as运算符。我一直希望VB有这样一个运算符。VB目前的类型转换运算符主要有CType和DirectCast。他们的用法几乎一样。我详细比较了一下这两个运算符,得出以下结论:
1.在转换成引用类型时,两者没有什么区别,都是直接调用castclass指令,除非重载了类型转换运算符CType。DirectCast运算符是不能重载的。
2.转换成值类型时,CType会调用VB指定的类型转换函数(如果有的话),比如将String转换为Int32时,就会自动调用。
4.2.4默认属性和属性参数
在原先的VB6里,有一项奇特的功能——默认属性。在VB6中,对象的名称可以直接表示该对象的默认属性。
4.2.5可选参数和按名传递
VB从4.0开始支持“可选参数”这一特性。就是说,函数或子程序的参数有些是可选的,调用的时候可以不输入。其实VB从1.0开始就有一些函数带有可选参数,只不过到了4.0才让用户自己开发这样的过程。在VB4里,可选参数可以不带默认值,而在VB里,如果使用可选参数,则必须带有默认值。在调用的时候,VB若发现参数被省略,则自动读取.param部分的默认值,并显式传递给过程。这一部分完全由编译器处理,而且没有任何性能损失,和手工传递所有参数是完全一样的。至于按名传递,VB会自动调整参数的顺序,其结果与传统方式的传递也没有任何的不同。这说明我们可以放心地使用这项便利。而且带有可选参数的过程拿到C#中,顶多变成不可选参数,也不会造成什么其他的麻烦。
PS.很多COM组件都使用了默认参数,而且有些过程的参数列表非常长,在VB里可以轻松地处理它们,而在C#中经常让开发者传参数传到吐血。
4.2.6在经过对比之后可得以下一个结论:
1.目前的主流编程语言没有简单的,如果你想学精通的话。
2.VB的门槛比较低,编程思想较容易接受。
3.学习C不能短期内见到成效。
4.据用户调查69%的考生觉得VB更容易接受

致谢
在本次课程设计中,我从指导老师牛荣和李鹏身上学到了很多东西。老师认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我收益匪浅。他无论在理论上还是在实践中,都给与我很大的帮助,使我得到不少的提高这对于我以后的工作和学习都有一种巨大的帮助,感谢他耐心的辅导。
另外,在游戏开发过程中化希耀老师和杜义君老师也给于我们很大的帮助,帮助解决了不少的难点,使得游戏能及时开发完成,还有所有的同学同样给与我不少帮助,这里一并表示感。

参考文献:
[1]Vsual Basic 程序设计教程 作者:龚沛曾,陆慰民,杨志强 高等教育出版社出版
[2]Vsual Basic 6.0程序设计 作者:刘新民,蔡琼,白糠生 清华大学出版社出版
[3]80例上手 VB6 编程 作者:唐凯军,汤惠莉 山东电子音像出版社
[4]Vsual Basic 实例教程 作者:卢毅 科学出版社出版
[5]Vsual Basic 经典范例50讲 作者:赵欣胜,亢慧娟,刘晟宏 科学出版社出版

㈩ vb的课程设计 我做了俄罗斯方块,但还要写1.数学模型 2. 程序流程 3.出现的问题及解决办法

我上学时,有一问课程是专教写这个的,如果没记错的话,叫软件工程。你可以翻翻这本书。

热点内容
武汉大学学生会辅导员寄语 发布:2021-03-16 21:44:16 浏览:612
七年级学生作文辅导学案 发布:2021-03-16 21:42:09 浏览:1
不屑弟高考成绩 发布:2021-03-16 21:40:59 浏览:754
大学毕业证会有成绩单 发布:2021-03-16 21:40:07 浏览:756
2017信阳学院辅导员招聘名单 发布:2021-03-16 21:40:02 浏览:800
查询重庆2018中考成绩查询 发布:2021-03-16 21:39:58 浏览:21
结业考试成绩怎么查询 发布:2021-03-16 21:28:40 浏览:679
14中医医师资格笔试考试成绩查分 发布:2021-03-16 21:28:39 浏览:655
名著赏析课程标准 发布:2021-03-16 21:27:57 浏览:881
北京大学商业领袖高端培训课程 发布:2021-03-16 21:27:41 浏览:919