小时候经典游戏用VB编的编写实例教程大全全!
-
这些游戏以前玩过吧,快下载看它们
是怎么编
写的!
目录
:
·编写趣味撞球小游戏
·用
VB6.0
设计简易赛车游戏
·
Visual
Basic
小游戏:猜英雄
·
VB
游戏写作技巧(
1
)秀图篇
·
VB
游戏写作技巧(
2
)网络篇
·
VB
贪吃蛇
单人版游戏
< br>(
一
)
·
VB
贪吃蛇
单人版游戏
< br>(
二
)
·
VB
贪吃蛇
单人版游戏
< br>(
三
)
·
VB
贪吃蛇
单人版游戏
< br>(
四
)
·用
VB
开发即时战略游戏
正文
:
编写趣味撞球小游戏
文章来源:
沐风经典
文章作者:
佚名
Visual
Basic
是一个功能
强大的工具,它有一大特点就是易学易用,下面我们就通过写
一个“趣味撞球”
的程序来初步体会一下。
首先启
动
VB5
,
新建一个标准的
EXE
工程。
此时可以看到,
工程包括一个
Form1
框体。
在
Form1
边框的右下角按住鼠标左键不放,拖动鼠标把
Form1
的面积改为适当大小,比如
693
0
×
4320
。再在属性框中把
Form1
的
ScaleMode
属性改为
3
-
Pixe
l
,表明我们将以像素
为我们的坐标计算单位,把
Form1
的
StartUpPosition <
/p>
属性设为
2
-
C
enterScreen
,使运行时
窗体出现在屏幕正中。
p>
现在,
在控件面板上选取
CommandBut
ton
(命令按钮)
控件,
为
Form1
添加
Command1
和
Command2
两个按钮控件,把它们的大小设
为
121
×
25
,再在属性框中把
Command1
的
Caption
填为“&
GO
”
p>
,把
Command2
的
< br>Caption
填为“&
QUIT
”
,并把
Command1
放到框<
/p>
体的右上角,把
Command2
放到框
体的右下角。
然后,在控件面板上选取
Timer
(时钟)控件,为
Form1
添加一个
Timer1
时钟控件。
再在属性框中
把它的
Enabled
属性改为
Fal
se
,
Interval
属性改为
p>
50
,前一个值表示该时钟控
件是否激活,
后一个值决定该时钟控件产生
Tim
er
事件的间隔时间,
我们将用它来控制小球
< br>的移动频率。
到此为止,
我们已经完成了全部的界
面设计工作。
接下来要做的全部工作就是填入程序
代码了。
p>
Dim
BallX As Integer
Dim BallY As Integer
Dim AddX As Integer
Dim AddY
As Integer
Dim HitX As Integer
Dim W As Integer
Dim H As
Integer
Private Sub Command1_Click()
p>
BallX=Int(Rnd(1)
*
id
th/10)
*
5
+
< br>25
BallY=Int((eight)/10)
*
5
AddX=
-
5
AddY=
-
5
Form_Paint
d=True
End Sub
Private Sub
Command2_Click()
End
End Sub
Private Sub Form_MouseMove(Button As
Integer,Shift As Integer,X As Single,Y As Single)
X=X
-
50
If X<15 Then X=15
If
X>W
-
105 Then
X=W
-
105
HitX=X
If d=True Then
Line(16,H
-
5)
-
(W
-
6,H),
&
HC0
C0C0,BF
Line(HitX,H)
-
(HitX
+
100,H
-<
/p>
5),0,BF
End If
End
Sub
Private Sub Form_Paint()
Cls
W=Int((ScaleWidth
-
140)/5)
*
5
p>
H=Int((ScaleHeight
-
10)/5)
*
5
BackColo
r=
&
HC0C0C0
Line(1
0,10)
-
(15,H),0,BF
Line(W
-
5,10)
-
(W,H),0,BF
Line(10,
10)
-
(W,15),0,BF
End Sub
Private
Sub Timer1_Timer()
(BallX,BallY),4,
&
HC0C0C0
BallX=BallX
+
AddX
BallY=BallY
+
AddY
(BallX,BallY),4,0
If
BallX<=20 Then AddX=
-
AddX
If BallY<=20 Then
AddY=
-
AddY
If
BallX>=W
-
10 Then
AddX=
-
AddX
If
BallY>=H
-
10 Then
If BallXHitX
+
100
Then
d=False
Form_Paint
End If
AddY=
-
AddY
End If
End Sub
一旦程
序代码输入完毕,你就可以按
F5
开始执行它,或是在
File
菜单里选取
Make
< br>来生成
EXE
执行文件了,瞧,小球已经在你的屏幕上蹦
来蹦去了。
本文来自编程入门网
()
:
/VB
jc/vbyx/
用
VB6.0
设计简易赛车游戏
文章来源:
programfan
文章作者:
yaozheng
简单的
游戏往往更耐玩,
就比如伴我度过高考的赛车游戏:
一切都是方
块,
所谓的赛车
也只是四个方块。
第一步
,绘制对象:用函数
drawcar()
画赛车,
drawway(n)
画跑道的第
n
层。
第二步,接受控制:
Form
的
KeyPreview
属性要设为
true
,在
Form_KeyPress
p>
函数中通
过改变全局变量
cx
来控制赛车的位置。
第三步,游戏循环:作为即时游戏,必须要有一个
Timer
,并在其事件
Timer1_Time
r()
中绘制所有对象和进行碰撞检测。本例中,绘图部分写在了
Timer1_Timer()
中,碰撞测试放
在了
test()
中。
„„这
也是所有即时游戏所共通的框架。
当然,
我们往往还是根据具体
的设计作一些变
通,
发挥一些技巧„„比如这里设计的跑道是随
机产生的的,
这就要通过一点技巧以便既让
玩家感到挑战,又不
至于出现不可逾越的难关„„
下面是全部源代码,窗体上只需放个按钮
Command1
就行了!
Const D = 100
'
方格的宽度
Const BT =
3000 '
跑道底部的
y
坐标
Dim l1(22) As Integer
'
每层跑道左边有几个方块
Dim
l2(22) As Integer
'
每层跑道右边有几个方块
Dim
cx As Single '
赛车的在
x
轴的位置
Private
Sub Command1_Click()
cx = Width / 2 - 3 * D / 2
cy = Height - D
drawcar
For i =
1 To 20
l1(i) =
0
l2(i) = 0
drawway (i)
Next i
d = True
End Sub
Private Sub drawcar()
Line (cx, BT -
100)-Step(3 * D, D), BackColor, BF
Line (cx + D, BT - 200)-Step(D, D),
BackColor, BF '
先擦
Line (cx, BT - 100)-Step(3
* D, D), RGB(225, 0, 0), BF
Line (cx + D, BT - 200)-Step(D, D),
RGB(225, 0, 0), BF
End Sub
Private Sub drawway(n)
Line
(Width/2-3*D/2-2*D,BT-n*D)-Step(7*D,D),BackColor,
BF
'
先擦后画
Line
(Width/2-3*D/2-2*D,BT-n*D)-Step(l1(n)*D, D), ,BF
Line
(Width/2-3*D/2+5*D,BT-n*D)-Step(-l2(n)*D,D), ,BF
End Sub
Private Sub
Form_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case
Asc(
cx = cx - D
Case Asc(
cx = cx + D
End Select
End
Sub
Private Sub
Timer1_Timer()
Randomize
For i = 1 To 19
l1(i) = l1(i + 1)
l2(i) = l2(i +
1)
drawway (i)
Next i
Do
l1(20) = Int(Rnd * 5)
l2(20) = Int(Rnd * 5)
Loop Until ((l1(20) +
l2(20) <= 4) And (l1(20) - l1(19) <= 1) And _
(l2(20) - l2(19) <= 1) And (l1(19) +
l2(20) <= 4) And _
(l1(20) + l2(19) <=
4)) '
这里生成新一层跑道,
'
注意要筛去玩家不可能通过的情况!
drawway (20)
'
以上画出跑道
drawcar
test
End Sub
Private Sub test()
If
3.5*D-Width/2+cx
If 3.5*D-Width/2+cx+D
If
3.5*D-(cx+3*D-Width/2)
If
3.5*D-(cx+2*D-Width/2)
End Sub
本文来自编程入门网
()
:
/VBjc/vbyx/
相信不少读者都看过央视的《水浒》吧,林冲、武松、李逵等
英雄好汉的音容笑貌仿佛还浮
现在我的眼前,
那么
108
将中你最喜欢谁呢?我做了一个小程序来让电脑猜测你的心思,
程
序界面如图所示。
为了简化问题,我选择了其中的
27
将,将他们分成
3
组,每组
9
人。如果你最喜欢其
中的一个(比如史进)
p>
,他在第一组出现了,那么就按下按钮“第一组”
。然后这
27
将会重
新排列顺序,你再找史进在哪一组,
比如发现他在第二组,就按下按钮“第二组”
,画面中
的人物次
序会再次打乱,再找史进所在组别„„最多
3
次,电脑将会猜出
你心中的英雄!
知道了玩法,下面我将介绍程序是如何实现的:
一、猜测的奥妙——推算原理
猜测的原理其实也不复杂,
我们来模拟一下猜测的过程大家就清楚了。
程序初始化时是
把
1
~
27
将随机打乱分别放入
PageControl
控件的
三个选项卡中,每个选项卡放
9
张图片。
点击一次按钮后其实不是盲目地将顺序打乱,
而是进行了筛选,
把有用的图片
(就是点选的
那组的
9
张图片)筛选出来平均分配到
PageControl
控件的三个选项卡中,再把不需要的图
片集中起来平均分配到
PageControl
控件的三个选项卡中,最后在各个选项卡中把有用
的、
无用的图片随机打乱再次重新排列显示出来,从而完成猜测。用表
< br>1
来说明:
点击按钮的次数
选项卡
1
选项卡
2
选项卡
3
1
3
3 3
2 1 1 1
3 0 0 0
具体讲
,
当第一次按下按钮时,
表示你相中的图片在其中一个选项卡的
9
张图片内。
于
是把这
9
张图片均分成
3
份,每份
3
张,分别送入
3
个选项卡,其余的图片就不做考虑了。
当第二次按下按钮时,
表示你相中的图片在其中一个选项卡的
3
张图片内,
于是把这
3
张图
片均分成
3
份,
每份<
/p>
1
张,分别送入
3
个选项卡,
当第三次按下按钮时,表示你相中的图片
在其中一
个选项卡的
1
张图片内,
毫无疑问,<
/p>
这张图片就是你相中的图片,
于是程序把这张
图片显示出来。
打乱重排的算法
在程序中的很多地方要涉及打乱顺
序重排的问题,
下面我们就来先简单介绍一下打乱是
如何实现的
。
<
/p>
这里要实现的方法是比较简单的,
也就是多次把数组的不同位置的
值互换,
就像读小学
时老师让两个同学互换位置一样,
老师不断随机抽两个同学互换位置,
最后同学们的座位就
都重新排了一遍。
举个例子:
int
I,temp1,temp2,a[2],b[27]
for(i=1;i<=27;
i++)//
先对数组赋初值
b[i]=I;
randomize();
for(i=1;i<=500;i++)//i
的大小决定打乱的程度,循环
次数越多,打乱程度越高
{
temp1=random(27)+1;
temp2=random(27)+1;
a[1]=b[temp1];
b[temp1]=b[temp[2];
b[temp2]=a[1];
}
//
输出
ListBox1->Clear();
for(i=1;i<=27;i++)
ListBox1->Items->Add(IntToStr(b[i]));
如上例所示,经过打乱,
b[27]
数组将不再是旧时容颜。
二、实现的关键——筛选算法的介绍
在整个实现的过程中,
如何在每一次打乱后对人物进行筛选是程序的关键所在,
处理不
好,
程序就不会有结果。
而且筛选很容易把你搅得
头晕脑胀,
所以涉及的各个数组之间的关
系一定要先理顺,
p>
先用一个例子来解释如何进行筛选。
以点击按钮的次数是第一次并且
点击
的按钮是
Button1
为例加以
介绍,其思路如下:
初始:
第一次执行按钮事件并且按下的是
Button1
时
(
< br>表
a
的数组就是关键数组
)
p>
:
把表
a
打乱
后平均拆分为
3
组分别送入内存缓冲区
p>
把表
b
和表
c
p>
打乱后也平均拆分为
3
组分别送入内存缓冲
区(非重要的数组)
,然后将
它们进行组合,分别把有用的和无
用的搭配重新组合为三张表并显示出来:
把全部的筛选过程表述出来:
1.
初始化:
把
p>
a[1-27]
打乱并将
a[1-9]
赋给
first[1-9]
a[10-18]
赋给
second[1-9]
a[19-27]
赋给
third[1-9]
2.
第一
次按钮事件(假设选中的是第二个选项卡)
second[1-9]
打乱后赋给
temp1[1-3]
、
temp2[1-3]
、
temp3[1-3]
a[1-9]+a[19-27]
赋给
temp4[1-18]
并打乱
temp1[1-3]
+
temp4[
1-6]
赋给
first[1-9]
并
打乱
t
emp2[1-3]
+
temp4[7-12]
赋给
second[1-9]
并打乱
temp3[1-3]
+
temp4[
13-18]
赋给
third[1-9]
并打乱
3.
第二
次按钮事件(假设选中的是第二个选项卡)
temp2[1-3]
打乱后赋给
temp5[1]
、
< br>
temp6[1]
、
temp7[1]
temp1[1-3]+temp3[1-3]+temp4
[1-18]
赋给
temp8[1-24]
并打乱
temp5[1]
+
temp8[1-8]
赋给
first[1-9]
并打乱
temp5[2]
+
temp8[9-
16]
赋给
second[1-9]
并打乱
temp5[3]
+
temp8[17
-24]
赋给
third[1-9]
并打乱
4.
第三次按钮事件(如果选中的是
第二个选项卡)
把
temp5[2]
所对应的图片显示出来即可。
最后分别把表
a
—表
c
打乱后显示出来即可。<
/p>
进行二次、多次筛选的方法都一样,只
是要注意相中的好汉在哪个数组里面,千万别搞错就行了。
三、小结
最后的
工作就比较简单了。
可以设计一个友好的界面,
然后在程序启动
的时候对数组赋
初值,
并显示出来;
对
每个按钮分别先进行次数判断,然后进行前面讲述的处理,
不断筛选
直到剩下惟一的好汉后就可以显示在界面的正下方了。
本文来自编程入门网
()
:
/VBjc/vbyx/
VB
游戏
写作技巧(
1
)秀图篇
文章来源:
互联网
文章作者:
未知
一开始,
我想先从游戏的图形先讲起
好了,
毕竟游戏最重要的就是画面,
一个没有漂亮
图形的游戏,我连碰都不想去碰。那该怎么处理游戏的图形呢?
VB
提供了一个非常好用的
控制项
--Pictur
eBox
,有了这个控制项我们才能轻松的在程式中秀出图形,现在就来看看
PictureBox
有那些特性可以让我们在游戏中使用。
Picture
属性
:只要将这个属性填入正常的图形档名,
VB
就会自动帮我们载
入图形档。
Visible
属性:这个属性可以让图形消失或让图形出现在画面上。
用法:
e = False
'
消失
e = True
'
出现
Left
属性:表示图形的位置的X座标。
Top
属性:表示图形的位置的Y座标。
用法:改变这两个属性就可以改变图形的位置。
ScaleMode
属性:设定<
/p>
PictureBox
所使用的座标单位,一般都设为
像素
< br>知道了
PictureBox
的特性後,
要怎么样把它应用到游戏中呢?举个例子好了,
我现在要做一
< br>个打砖块的游戏,需要用到那些图片呢?砖块、球、击球的板子,一共有三张图,所以我们
就使用三个
PictureBox
,将图片载入到
p>
PictureBox
里面,如下面所示:
Picture1
砖块的图片
Picture2
球的图片
Picture3
板子的图片
接著我就可以写,当我按下方向键的右键时,
Picture3
的
left
属性
+1
,按下左键则
-1
,这样
一来
不就可以控制板子的左右移动了吗?球也是一样,只要每隔一段时间更改一次
Pictu
re2
的
left
和
< br>top
属性,就可以做出球移动的效果了。
或许有人会觉得奇怪,一张图就要用到一个
< br>PictureBox
,小游戏的图不多还没关系,如果是
RPG的话不就要动用到几千个甚至几万个
PictureBox
?岂不是麻烦死了?所以如果图片
很多的时候,我通常都是把图全部都
放在同一个图形档里面,这样就只要用到一个
PictureBox
了,要用图片时从里面把它抓出来就好了,不过要怎么抓呢?我建议使用函数
BitBlt()
来做图形的搬移。
使用
BitBlt
< br>函数前要先宣告:
Declare Sub BitBlt Lib
ByVal nWidth As Long, ByVal nHeight As
Long, ByVal hSrcDC As Long, ByVal xSrc As Long,
ByVal ySrc As Long, ByVal dwRop As
Long)
hDestDC
目的地的
DC
x
目的地的座标
x
y
目的地的座标
y
nWidth
来源图片的宽度
nHight
来源图片的高度
hSrcDC
来源图片的
DC
xsrc
来源图片的座标
x
ysrc
来源图片的座标
y
dwrop
运算方法:
&HCC0020 PUT
&H8800C6 AND
&HEE0086 OR
&H660046 XOR
现在有两个
PictureBox
Picture1 AutoRedRaw
属性设为
Ture
ScaleMode
属性设为
像素
Picture2
AutoRedRaw
属性设为
Ture
ScaleMode
属性设为
像素
若想将
Picture2
里
(10,10)-(10
0,100)
区域内的图形拷贝到
Picture1
的
(0,0)
可以这样写:
BitBlt ,0,0,90,90,,10,10,&HCC0020
这样子平常写游戏时就只要设两个
P
ictureBox
,一个专门用来显示,另一个则用来放图形资
料,需要时再用
BitBlt
函数覆制过去就好了,不是很方
便吗?
本文来自编程入门网
()
:
/VBjc/vbyx/
p>
VB
游戏写作技巧(
2
)网络篇
文章来源:
互联网
文章作者:
未知
这一次写的是如何用
VB
来写网路程式的方法,
你可不要以为这是什么深奥的程式,
其实只
要一个
Winsock
控制项就可以了,现在就来介绍一下
Winsock
的用法:
步骤一:
首先要先把控制项给叫出来,
你只要按下
Ctrl+T
後选取
Winsock
Control 5.0
若是用
VB6
的就选
Winsock
Control 6.0
,这样就可以使用
Winsock
p>
元件。
步骤二
:再来我们必须先确定程式是作
Server
端还是
Client
端的,要先设定一些属性:
Server
写法:
ort =
5400 (
数字可以随便设
)
(
等待连线
)
Client
写法:
Host =
对方
IP
Prot = 5400 (
必须要和
Server
端相同
)
rot = 0
t
(
连线
)
连线之前
Client
端要先知道
Se
rver
端的
IP
,
< br>接著等到
Server
端等待连线时,
< br>Client
端就可以
呼叫
Co
nnect
方法,双方连线成功後就可以传输资料。
步骤三:当
Client
连线的时候
Server
端会引发
ConnectionRequest
事件,
Serv
er
的程式要这
样子写:
Private Sub
Winsock1_ConnectionRequest(ByVal requestID As
long)
requestID
End Sub
步骤四:这样一来
就可以传送资料了,传送和接受资料的方法如下:
传送资料:
mydata =
你好吗
?
ta mydata
这样就会把
mydata
给传到对方那里。<
/p>
接受资料:当有资料送到的时候会引
发
DataArrival
事件。
Privata Sub
Winsock1_DtatArrival(ByVal bytesTotal As long)
Dim mydata As String
a
mydata
会把送到的资料给
mydata
End Sub
Winsock
控
制项就那么简单,
只要会这些就可以写网路游戏了,
相关的程式
你可以参考网路
五子棋
(54K)/?id=119
。
p>
本文来自编程入门网
()
:
/VBjc/vbyx/
本文介绍编制贪吃蛇游戏的一般方法,
其中不含什么高深的算法,只使用了初级的
VB
编
程方法,通俗易懂。
各位如有任何见解,请不吝赐教。
本人
QQ
:
190317890 (
请在身份验证里面写上“
CSDN
”
)
邮箱
bugs1984@
需要本程序
VB
源码文件的朋友,请留下你的
E-mail
,我会尽快寄出。
设计思路:
(一)开始新游戏
1.1
获取并应用各个参数(当前级别,控制键等)
,初始化随机数(
Randomize
)
。
1.2
清除地图上的所有物品,各个统计数值置零。
1.3
初始化地图:布置食物,炸弹,蛇身位置以及蛇头的移
动方向——在
PictureBox
上绘画
图像
并修改对应的地图格属性值(
MapProperty()
数组)
。
1.4
启动
Timer
定时器,游戏开始。
(二)游戏操作
2.1
暂停
恢复——
修改表示游戏状态的
Boolean
型
变量值;
显示
隐藏
<
/p>
表示游戏状态的
Label
;
暂停
恢复
Timer
定时器。
2.2
控制方向(根据
Nokia
贪吃蛇的操作方式)——
由于蛇头只能朝上下左右
4
个方向移动,
但是方向键有
8
个,所以“斜线方向”
的控制键和
水平,垂直方向的控制键编码上有点不同
2.2.1
斜线方向键(以“右上”方向键为例)——
< br>如果当前蛇头朝着左边(水平方向)运动,则将水平方向的分量变为
0
,再将垂直方向的分
量变为
-1
< br>(向上运动)
;
如果当前蛇头
朝着上方(垂直方向)运动,则将垂直方向的分量变为
0
,再将
水平方向的分
量变为
1
(向右运动)
。
其余“左上,左下,右下”的方向键编码与上述雷同。
2.2.2
“水平,垂直”方向键——
当蛇以
水平
方向移动时,
“左”和“右”的按键无效;
(即不处理按键事件)
当蛇以
垂直
方向移动时,
< br>“上”和“下”的按键无效。
(三)移动蛇身
3.1
根据运动方向,找出蛇头的新坐标;
3.2
判断蛇头新坐标下的
地图属性——
(
1
)如果蛇头的新坐标
和当前
蛇尾
的坐标重合,那不算
GameOver
--因为随着蛇头的
移动,蛇身各个节点都会向前跟进,使得当前
蛇尾
坐标下的网格在移动之后会变成
空白
地。
(
2
)如果当前蛇头位置的地图属性是“食物”——增加蛇身长度
,统计玩家吃进的食物数
量,增加分数,补充地图上的食物,记录(累加)当前吃进的物
品,如果吃进的物品
(
curEatCount
)
达到一定数量(
EatC
ountPerShowPrize
)就在地图上显示奖品。
(
3
)如果当前蛇头位置的地图属性是
“炸弹“
(陷阱)——统计玩家吃进的炸弹数量,扣分
(如果分
数小于
0
,就
GameOver
)
,补充地图上的炸弹,记录(累加)当前吃进的物品,如
果吃进的物品达到一定数量就显示奖品。
(
p>
4
)如果当前蛇头位置的地图属性是“奖品”——加分,重新累计<
/p>
吃进的物品数
(
curEatCount = 0
)
3.3
刷新蛇身坐标,更新
地图网格属性
以及画面
(
1
)在更新蛇身坐标之前,保存原来的
蛇尾坐标;
(
2
)先在地图上
擦除旧的的蛇头,然后在地图上
绘画出新的蛇头;
(
3
)修改变量值,标记蛇头新坐标下的地图格属性为:蛇身;
< br>
(
4
)要先更新
蛇身除了蛇头外其余部分的坐标;
(
5
)之后才更新
蛇头的坐标;
(
6
)
判断是否需要
增加蛇身长度——如果要增加长度:
旧蛇尾的坐标不变,
蛇身长度
+
1
;
否则(无需增加蛇身长度)
p>
:如果蛇头的新坐标与旧蛇尾的坐标重合,就不用在旧蛇尾的坐
标下
绘画空白地的图案(因为该网格属性已经是
蛇头,而不是空白地)
(
7
)在地图上擦除旧蛇尾,绘画空白地;
(
8
)在地图上把
旧蛇尾坐标
下的地图格的属性设置为
空白地;
《标准模块
Module1
代码》——
Option Explicit
'
全局
常量
Public Enum MAP_PROPERTY
'
地图属性
MAP_EMPTY =
0 '
空白地
MAP_FOOD
'
食物
MAP_BOMB
'
炸弹,陷阱
MAP_PRIZE
'
加分奖品
MAP_SNAKE
'
蛇身
End Enum
Public Const MAP_SCALE As
Integer = 15 '
地图放大倍数
'
地图网格数(
Index
值,首值为
0
)
Public Const MAX_COL_INDEX As
Integer = 19
Public Const MAX_ROW_INDEX
As Integer = 10
Public
Const START_SNAKE_LENGTH As Integer = 8
'
蛇身初始长度
Public Const SPEED_LV1 As Integer = 200
'
第一级(最慢)的速度(
al
,最快
第
9
级=
40
)
Public Const SPEED_CHANGE As Integer =
20 '
前后
2
个等级之间的
Interval
差值(毫秒)
'
定义控制键
Public Const KEY_PAUSE As Integer =
vbKeyNumpad5
Public Const
KEY_UP As Integer = vbKeyNumpad8
Public
Const KEY_DN As Integer = vbKeyNumpad2
Public Const KEY_LF As Integer =
vbKeyNumpad4
Public Const KEY_RT As
Integer = vbKeyNumpad6
Public Const KEY_LFUP As Integer =
vbKeyNumpad7
Public Const KEY_LFDN As
Integer = vbKeyNumpad1
Public Const
KEY_RTUP As Integer = vbKeyNumpad9
Public Const KEY_RTDN As Integer =
vbKeyNumpad3
'
定义填充色
Public Const HEAD_COLOR As Long =
&H80FF '
蛇头颜色
Public Const BODY_COLOR As Long =
vbGreen '
蛇身颜色
Public Const EMPTY_COLOR As Long =
&HE0E0E0 '
空白地颜色
Public Const FOOD_COLOR As Long =
vbBlue '
食物颜色
Public Const BOMB_COLOR As Long = vbRed
'
炸弹颜色
Public
Const FULL_COLOR As Long = 255 ^ 3
Public Const RECORD_FILE_NAME As String
=
记录得分榜的
文件名
Public Const MAX_PRIZE As Integer = 50
'
起始
奖励分数的
上限
Public Const
MIN_PRIZE As Integer = 20
'
起始
奖励分数的
下限
'
全局
变量
'
记录玩家的相关信息和设置值:
Public Type thePlayerInfo
Score As Integer
'
记录得分
HeadColor
As Long '
蛇头填充色
BodyColor As Long
'
蛇身填充色
Food As
Integer '
记录吃进的
食物数量
Bomb As
Integer '
记录吃进的
炸弹数量
blnGameOver
As Boolean '
标记该玩家是否已经
game
over
' SnakeColor As Long
'
绘画蛇身使用的填充色„„暂时省略„„
SnakeLength As Integer
'
蛇身长度
'
蛇头移动方向(值为
-
1
,
0
< br>,
1
)
X_Way As Integer
Y_Way As
Integer
'
控制键(
8
个)„„暂时省略(采用默认控制键)
End Type
'
记录
玩家的得分和名字
Type
theRecord
Name As String * 15
Score As Integer
End Type
'
用于表示二维坐标值
Public Type thePosition
X As
Integer
Y As Integer
End
Type
Public
FoodCount_AtOneTime As Integer
'
地图上同时出现的
食物数量
Public
BombCount_AtOneTime As Integer
'
地图上同时出现的
炸弹数量
Public PrizeRemain As Integer
'
当前剩余的
奖励分数
Public
EatCountPerShowPrize
'
记录
蛇每
吃进多少物品(包括食物和炸弹,奖品不计)才显
示一次奖品
Public AddScorePerFood As
Integer '
每吃进一个
食物,所增加的分数
Public
AddScorePerBomb As Integer
'
每吃进一个
炸弹,所扣掉的分数
Sub Main()
'
第一次运行时先显示得分榜
End Sub
本文来自编程入门网
()
:
/VBjc/vbyx/
VB
贪吃蛇
单人版游戏
< br>(
二
)
文章来源:
CSDN
文章作者:
Bugs1984
《主窗体
FrmPlay
代码》——
Private blnStartGame As
Boolean '
标记是否已经开始
新游戏(
T
=游戏已经开始)
Private blnPause As Boolean '
标记当前是否处于暂停状态(
T
=暂停)
Private blnThroughWall As Boolean '<
/p>
标记是否为穿墙模式(
T
=可以穿墙)<
/p>
Private blnOnKeyEvents As
Boolean '
标记是否能够
接
收键盘事件
(
T
=可以接收)
,
此变量可
防止
p>
Form_KeyDown()
事件重复执行
Private Map_Width As
Integer '
地图宽度(象素)
Private Map_Height As Integer
'
地图高度(象素)
Private
Map_Empty_Color '
地图-空白地颜色
Private Map_Bomb_Color
'
地图-炸弹颜色
Private
Map_Food_Color '
地图-食物颜色
Private MapProperty() As Integer
'
记录地图各个网格的属性
Private curEatCount As Integer
'
记录
每次出现奖品之前,一共吃进
多少物品(包括食物和炸
弹,奖品不计)
,当奖品出现后,此变
量值变为
零
,然后进入下一次统计
Private curLevel
As Integer '
当前级别
Private P1 As thePlayerInfo
'
记录
Player1
的信息
Private Snake_P1() As thePosition
'
记录蛇身坐标
Private
PrizePos As thePosition
'
记录奖品的坐标
Private Record(9) As
theRecord '
存放前十名的
得分记录信息
Option Explicit
Private Sub cmdHelp_Click()
If
blnPause = False Then Call Form_KeyDown(KEY_PAUSE,
0) '
如果游戏正在进行,则发
送“暂停”按键事件,暂停游
戏
End
Sub
'
开始新游戏
Private Sub cmdNewGame_Click()
Dim i As Integer
Randomize
'
重新生成随机数列
blnStartGame = Not blnStartGame
If blnStartGame Then
n =
停止
Else
n =
新游戏
End If
'
中止游戏
If
blnStartGame = False Then
'
如果上
一次的奖品还没有消失
(以
PrizeRemain > 0
为标志)
< br>,
就先清除旧的奖品,
然后才显示新的奖品
If PrizeRemain > 0 Then
Call ShowPrize(False)
= 0
'
玩家的初始分数
=
0
= 0
curEatCount = 0
PrizeRemain = 0
blnPause =
False
e = False
n =
n =
n =
eOver = True