vb经典小游戏Word文件下载.docx
《vb经典小游戏Word文件下载.docx》由会员分享,可在线阅读,更多相关《vb经典小游戏Word文件下载.docx(55页珍藏版)》请在冰豆网上搜索。
IfX>
W-105ThenX=W-105
HitX=X
IfTimer1.Enabled=TrueThen
Line(16,H-5)-(W-6,H),&HC0C0C0,BF
Line(HitX,H)-(HitX+100,H-5),0,BF
EndIf
PrivateSubForm_Paint()
Cls
W=Int((ScaleWidth-140)/5)*5
H=Int((ScaleHeight-10)/5)*5
BackColor=&HC0C0C0
Line(10,10)-(15,H),0,BF
Line(W-5,10)-(W,H),0,BF
Line(10,10)-(W,15),0,BF
PrivateSubTimer1_Timer()
Form1.Circle(BallX,BallY),4,&HC0C0C0
BallX=BallX+AddX
BallY=BallY+AddY
Form1.Circle(BallX,BallY),4,0
IfBallX<
=20ThenAddX=-AddX
IfBallY<
=20ThenAddY=-AddY
IfBallX>
=W-10ThenAddX=-AddX
IfBallY>
=H-10Then
IfBallXHitX+100Then
Timer1.Enabled=False
AddY=-AddY
EndSub
一旦程序代码输入完毕,你就可以按F5开始执行它,或是在File菜单里选取Make来生成EXE执行文件了,瞧,小球已经在你的屏幕上蹦来蹦去了。
用VB6.0设计简易赛车游戏
简单的游戏往往更耐玩,就比如伴我度过高考的赛车游戏:
一切都是方块,所谓的赛车也只是四个方块。
第一步,绘制对象:
用函数drawcar()画赛车,drawway(n)画跑道的第n层。
第二步,接受控制:
Form的KeyPreview属性要设为true,在Form_KeyPress函数中通过改变全局变量cx来控制赛车的位置。
第三步,游戏循环:
作为即时游戏,必须要有一个Timer,并在其事件Timer1_Timer()中绘制所有对象和进行碰撞检测。
本例中,绘图部分写在了Timer1_Timer()中,碰撞测试放在了test()中。
……这也是所有即时游戏所共通的框架。
当然,我们往往还是根据具体的设计作一些变通,发挥一些技巧……比如这里设计的跑道是随机产生的的,这就要通过一点技巧以便既让玩家感到挑战,又不至于出现不可逾越的难关……
下面是全部源代码,窗体上只需放个按钮Command1就行了!
ConstD=100'
方格的宽度
ConstBT=3000'
跑道底部的y坐标
Diml1(22)AsInteger'
每层跑道左边有几个方块
Diml2(22)AsInteger'
每层跑道右边有几个方块
DimcxAsSingle'
赛车的在x轴的位置
cx=Width/2-3*D/2
cy=Height-D
drawcar
Fori=1To20
l1(i)=0
l2(i)=0
drawway(i)
Nexti
Timer1.Enabled=True
PrivateSubdrawcar()
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
PrivateSubdrawway(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
PrivateSubForm_KeyPress(KeyAsciiAsInteger)
SelectCaseKeyAscii
CaseAsc("
a"
),Asc("
A"
)
cx=cx-D
s"
S"
cx=cx+D
EndSelect
Randomize
Fori=1To19
l1(i)=l1(i+1)
l2(i)=l2(i+1)
Do
l1(20)=Int(Rnd*5)
l2(20)=Int(Rnd*5)
LoopUntil((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)
以上画出跑道
test
PrivateSubtest()
If3.5*D-Width/2+cx<
l1
(1)*DThenTimer1.Enabled=False
If3.5*D-Width/2+cx+D<
l1
(2)*DThenTimer1.Enabled=False
If3.5*D-(cx+3*D-Width/2)<
l2
(1)*DThenTimer1.Enabled=False
If3.5*D-(cx+2*D-Width/2)<
l2
(2)*DThenTimer1.Enabled=False
108将中你最喜欢谁,让电脑猜测你的心思
为了简化问题,我选择了其中的27将,将他们分成3组,每组9人。
如果你最喜欢其中的一个(比如史进),他在第一组出现了,那么就按下按钮“第一组”。
然后这27将会重新排列顺序,你再找史进在哪一组,比如发现他在第二组,就按下按钮“第二组”,画面中的人物次序会再次打乱,再找史进所在组别……最多3次,电脑将会猜出你心中的英雄!
知道了玩法,下面我将介绍程序是如何实现的:
一、猜测的奥妙——推算原理
猜测的原理其实也不复杂,我们来模拟一下猜测的过程大家就清楚了。
程序初始化时是把1~27将随机打乱分别放入PageControl控件的三个选项卡中,每个选项卡放9张图片。
点击一次按钮后其实不是盲目地将顺序打乱,而是进行了筛选,把有用的图片(就是点选的那组的9张图片)筛选出来平均分配到PageControl控件的三个选项卡中,再把不需要的图片集中起来平均分配到PageControl控件的三个选项卡中,最后在各个选项卡中把有用的、无用的图片随机打乱再次重新排列显示出来,从而完成猜测。
用表1来说明:
点击按钮的次数选项卡1选项卡2选项卡3
1333
2111
3000
具体讲,当第一次按下按钮时,表示你相中的图片在其中一个选项卡的9张图片内。
于是把这9张图片均分成3份,每份3张,分别送入3个选项卡,其余的图片就不做考虑了。
当第二次按下按钮时,表示你相中的图片在其中一个选项卡的3张图片内,于是把这3张图片均分成3份,每份1张,分别送入3个选项卡,当第三次按下按钮时,表示你相中的图片在其中一个选项卡的1张图片内,毫无疑问,这张图片就是你相中的图片,于是程序把这张图片显示出来。
打乱重排的算法
在程序中的很多地方要涉及打乱顺序重排的问题,下面我们就来先简单介绍一下打乱是如何实现的。
这里要实现的方法是比较简单的,也就是多次把数组的不同位置的值互换,就像读小学时老师让两个同学互换位置一样,老师不断随机抽两个同学互换位置,最后同学们的座位就都重新排了一遍。
举个例子:
intI,temp1,temp2,a[2],b[27]
for(i=1;
i<
=27;
i++)//先对数组赋初值
b[i]=I;
randomize();
=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();
i++)
Items->
Add(IntToStr(b[i]));
如上例所示,经过打乱,b[27]数组将不再是旧时容颜。
二、实现的关键——筛选算法的介绍
在整个实现的过程中,如何在每一次打乱后对人物进行筛选是程序的关键所在,处理不好,程序就不会有结果。
而且筛选很容易把你搅得头晕脑胀,所以涉及的各个数组之间的关系一定要先理顺,先用一个例子来解释如何进行筛选。
以点击按钮的次数是第一次并且点击的按钮是Button1为例加以介绍,其思路如下:
初始:
第一次执行按钮事件并且按下的是Button1时(表a的数组就是关键数组):
把表a打乱后平均拆分为3组分别送入内存缓冲区
把表b和表c打乱后也平均拆分为3组分别送入内存缓冲区(非重要的数组),然后将它们进行组合,分别把有用的和无用的搭配重新组合为三张表并显示出来:
把全部的筛选过程表述出来:
1.初始化:
把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]并打乱
temp2[1-3]+temp4[7-12]赋给second[1-9]并打乱
temp3[1-3]+temp4[13-18]赋给third[1-9]并打乱
3.第二次按钮事件(假设选中的是第二个选项卡)
temp2[1-3]打乱后赋给temp5[1]、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打乱后显示出来即可。
进行二次、多次筛选的方法都一样,只是要注意相中的好汉在哪个数组里面,千万别搞错就行了。
三、小结
最后的工作就比较简单了。
可以设计一个友好的界面,然后在程序启动的时候对数组赋初值,并显示出来;
对每个按钮分别先进行次数判断,然后进行前面讲述的处理,不断筛选直到剩下惟一的好汉后就可以显示在界面的正下方了。
VB游戏写作技巧
一开始,我想先从游戏的图形先讲起好了,毕竟游戏最重要的就是画面,一个没有漂亮图形的游戏,我连碰都不想去碰。
那该怎么处理游戏的图形呢?
VB提供了一个非常好用的控制项--PictureBox,有了这个控制项我们才能轻松的在程式中秀出图形,现在就来看看PictureBox有那些特性可以让我们在游戏中使用。
Picture属性:
只要将这个属性填入正常的图形档名,VB就会自动帮我们载入图形档。
Visible属性:
这个属性可以让图形消失或让图形出现在画面上。
用法:
Form1.Picture1.Visible=False'
消失
Form1.Picture1.Visible=True'
出现
Left属性:
表示图形的位置的X座标。
Top属性:
表示图形的位置的Y座标。
改变这两个属性就可以改变图形的位置。
ScaleMode属性:
设定PictureBox所使用的座标单位,一般都设为"
3-像素"
知道了PictureBox的特性後,要怎么样把它应用到游戏中呢?
举个例子好了,我现在要做一个打砖块的游戏,需要用到那些图片呢?
砖块、球、击球的板子,一共有三张图,所以我们就使用三个PictureBox,将图片载入到PictureBox里面,如下面所示:
Picture1砖块的图片
Picture2球的图片
Picture3板子的图片
接著我就可以写,当我按下方向键的右键时,Picture3的left属性+1,按下左键则-1,这样一来不就可以控制板子的左右移动了吗?
球也是一样,只要每隔一段时间更改一次Picture2的left和top属性,就可以做出球移动的效果了。
或许有人会觉得奇怪,一张图就要用到一个PictureBox,小游戏的图不多还没关系,如果是RPG的话不就要动用到几千个甚至几万个PictureBox?
岂不是麻烦死了?
所以如果图片很多的时候,我通常都是把图全部都放在同一个图形档里面,这样就只要用到一个PictureBox了,要用图片时从里面把它抓出来就好了,不过要怎么抓呢?
我建议使用函数BitBlt()来做图形的搬移。
使用BitBlt函数前要先宣告:
DeclareSubBitBltLib"
gdi32"
(ByValhDestDCAsLong,ByValXAsLong,ByValYAsLong,ByValnWidthAsLong,ByValnHeightAsLong,ByValhSrcDCAsLong,ByValxSrcAsLong,ByValySrcAsLong,ByValdwRopAsLong)
hDestDC目的地的DC
x目的地的座标x
y目的地的座标y
nWidth来源图片的宽度
nHight来源图片的高度
hSrcDC来源图片的DC
xsrc来源图片的座标x
ysrc来源图片的座标y
dwrop运算方法:
&
HCC0020PUT
H8800C6AND
HEE0086OR
H660046XOR
现在有两个PictureBox
Picture1AutoRedRaw属性设为Ture
ScaleMode属性设为"
Picture2AutoRedRaw属性设为Ture
若想将Picture2里(10,10)-(100,100)区域内的图形拷贝到Picture1的(0,0)
可以这样写:
BitBltPicture1.hdc,0,0,90,90,Picture2.hdc,10,10,&
HCC0020
这样子平常写游戏时就只要设两个PictureBox,一个专门用来显示,另一个则用来放图形资料,需要时再用BitBlt函数覆制过去就好了,不是很方便吗?
这一次写的是如何用VB来写网路程式的方法,你可不要以为这是什么深奥的程式,其实只要一个Winsock控制项就可以了,现在就来介绍一下Winsock的用法:
步骤一:
首先要先把控制项给叫出来,你只要按下Ctrl+T後选取WinsockControl5.0若是用VB6的就选WinsockControl6.0,这样就可以使用Winsock元件。
步骤二:
再来我们必须先确定程式是作Server端还是Client端的,要先设定一些属性:
Server写法:
winsock1.localPort=5400(数字可以随便设)
winsock1.Listen(等待连线)
Client写法:
winsock1.RemoteHost="
对方IP"
winsock1.RemoteProt=5400(必须要和Server端相同)
winsock1.LocalProt=0
winsock1.Connect(连线)
连线之前Client端要先知道Server端的IP,接著等到Server端等待连线时,Client端就可以呼叫Connect方法,双方连线成功後就可以传输资料。
步骤三:
当Client连线的时候Server端会引发ConnectionRequest事件,Server的程式要这样子写:
PrivateSubWinsock1_ConnectionRequest(ByValrequestIDAslong)
winsock1.Close
winsock1.AcceptrequestID
步骤四:
这样一来就可以传送资料了,传送和接受资料的方法如下:
传送资料:
mydata="
你好吗?
"
winsock1.sendDatamydata
这样就会把mydata给传到对方那里。
接受资料:
当有资料送到的时候会引发DataArrival事件。
PrivataSubWinsock1_DtatArrival(ByValbytesTotalAslong)
DimmydataAsString
winsock1.GetDatamydata 会把送到的资料给mydata
Winsock控制项就那么简单,只要会这些就可以写网路游戏了
贪吃蛇游戏
设计思路:
(一)开始新游戏
1.1获取并应用各个参数(当前级别,控制键等),初始化随机数(Randomize)。
1.2清除地图上的所有物品,各个统计数值置零。
1.3初始化地图:
布置食物,炸弹,蛇身位置以及蛇头的移动方向——在PictureBox上绘画图像并修改对应的地图格属性值(MapProperty()数组)。
1.4启动Timer定时器,游戏开始。
(二)游戏操作
2.1暂停\恢复——
修改表示游戏状态的Boolean型变量值;
显示\隐藏表示游戏状态的Label;
暂停\恢复Timer定时器。
2.2控制方向(根据Nokia贪吃蛇的操作方式)——
由于蛇头只能朝上下左右4个方向移动,但是方向键有8个,所以“斜线方向”的控制键和水平,垂直方向的控制键编码上有点不同
2.2.1斜线方向键(以“右上”方向键为例)——
如果当前蛇头朝着左边(水平方向)运动,则将水平方向的分量变为0,再将垂直方向的分量变为-1(向上运动);
如果当前蛇头朝着上方(垂直方向)运动,则将垂直方向的分量变为0,再将水平方向的分量变为1(向右运动)。
其余“左上,左下,右下”的方向键编码与上述雷同。
2.2.2“水平,垂直”方向键——
当蛇以水平方向移动时,“左”和“右”的按键无效;
(即不处理按键事件)
当蛇以垂直方向移动时,“上”和“下”的按键无效。
(三)移动蛇身
3.1根据运动方向,找出蛇头的新坐标;
3.2判断蛇头新坐标下的地图属性——
(1)如果蛇头的新坐标和当前蛇尾的坐标重合,那不算GameOver--因为随着蛇头的移动,蛇身各个节点都会向前跟进,使得当前蛇尾坐标下的网格在移动之后会变成空白地。
(2)如果当前蛇头位置的地图属性是“食物”——增加蛇身长度,统计玩家吃进的食物数量,增加分数,补充地图上的食物,记录(累加)当前吃进的物品,如果吃进的物品(curEatCount)达到一定数量(EatCountPerShowPrize)就在地图上显示奖品。
(3)如果当前蛇头位置的地图属性是“炸弹“(陷阱)——统计玩家吃进的炸弹数量,扣分(如果分数小于0,就GameOver),补充地图上的炸弹,记录(累加)当前吃进的物品,如果吃进的物品达到一定数量就显示奖品。
(4)如果当前蛇头位置的地图属性是“奖品”——加分,