小时候经典游戏用VB编的编写实例教程大全全

上传人:仙*** 文档编号:138978938 上传时间:2022-08-22 格式:DOC 页数:50 大小:122.50KB
返回 下载 相关 举报
小时候经典游戏用VB编的编写实例教程大全全_第1页
第1页 / 共50页
小时候经典游戏用VB编的编写实例教程大全全_第2页
第2页 / 共50页
小时候经典游戏用VB编的编写实例教程大全全_第3页
第3页 / 共50页
点击查看更多>>
资源描述
这些游戏此前玩过吧,快下载看它们是怎么编写的!目录:编写趣味撞球小游戏用VB6.0设计简易赛车游戏 Visual Basic小游戏:猜英雄 VB游戏写作技巧(1)秀图篇 VB游戏写作技巧(2)网络篇 VB 贪吃蛇 单人版游戏(一) VB 贪吃蛇 单人版游戏(二) VB 贪吃蛇 单人版游戏(三) VB 贪吃蛇 单人版游戏(四) 用VB开发即时战略游戏 正文:编写趣味撞球小游戏文章来源: 沐风典型 文章作者: 佚名 Visual Basic是一种功能强大的工具,它有一大特点就是易学易用,下面我们就通过写一种“趣味撞球” 的程序来初步体会一下。一方面启动VB5,新建一种原则的EXE工程。此时可以看到,工程涉及一种Form1框体。在Form1边框的右下角按住鼠标左键不放,拖动鼠标把Form1的面积改为合适大小,例如69304320。再在属性框中把Form1的ScaleMode 属性改为3Pixel,表白我们将以像素为我们的坐标计算单位,把Form1的StartUpPosition 属性设为2CenterScreen,使运营时窗体出目前屏幕正中。目前,在控件面板上选用CommandButton(命令按钮)控件,为Form1添加Command1和Command2两个按钮控件,把它们的大小设为12125,再在属性框中把Command1的Caption填为“GO”,把Command2的Caption填为“QUIT”,并把Command1放到框体的右上角,把Command2放到框体的右下角。然后,在控件面板上选用Timer(时钟)控件,为Form1添加一种Timer1时钟控件。再在属性框中把它的Enabled属性改为False,Interval属性改为50,前一种值表达该时钟控件与否激活,后一种值决定该时钟控件产生Timer事件的间隔时间,我们将用它来控制小球的移动频率。到此为止,我们已经完毕了所有的界面设计工作。接下来要做的所有工作就是填入程序代码了。 Dim BallX As IntegerDim BallY As IntegerDim AddX As IntegerDim AddY As IntegerDim HitX As IntegerDim W As IntegerDim H As IntegerPrivate Sub Command1_Click()BallX=Int(Rnd(1)Form1.ScaleWidth/10)525BallY=Int(Form1.ScaleHeight)/10)5AddX=5AddY=5Form_PaintTimer1.Enabled=TrueEnd SubPrivate Sub Command2_Click()EndEnd SubPrivate Sub Form_MouseMove(Button As Integer,Shift As Integer,X As Single,Y As Single)X=X50If XW105 Then X=W105HitX=XIf Timer1.Enabled=True ThenLine(16,H5)(W6,H),HC0C0C0,BFLine(HitX,H)(HitX100,H5),0,BFEnd IfEnd SubPrivate Sub Form_Paint()ClsW=Int(ScaleWidth140)/5)5H=Int(ScaleHeight10)/5)5BackColor=HC0C0C0Line(10,10)(15,H),0,BFLine(W5,10)(W,H),0,BFLine(10,10)(W,15),0,BFEnd SubPrivate Sub Timer1_Timer()Form1.Circle(BallX,BallY),4,HC0C0C0BallX=BallXAddXBallY=BallYAddYForm1.Circle(BallX,BallY),4,0If BallX=20 Then AddX=AddXIf BallY=W10 Then AddX=AddXIf BallY=H10 ThenIf BallXHitX100 ThenTimer1.Enabled=FalseForm_PaintEnd IfAddY=AddYEnd IfEnd Sub 一旦程序代码输入完毕,你就可以按F5开始执行它,或是在File菜单里选用Make来生成EXE执行文献了,瞧,小球已经在你的屏幕上蹦来蹦去了。本文来自编程入门网(.cn):用VB6.0设计简易赛车游戏文章来源: programfan 文章作者: yaozheng 简朴的游戏往往更耐玩,就例如伴我度过高考的赛车游戏:一切都是方块,所谓的赛车也只是四个方块。第一步,绘制对象:用函数drawcar()画赛车,drawway(n)画跑道的第n层。第二步,接受控制:Form的KeyPreview属性要设为true,在Form_KeyPress函数中通过变化全局变量cx来控制赛车的位置。第三步,游戏循环:作为即时游戏,必须要有一种Timer,并在其事件Timer1_Timer()中绘制所有对象和进行碰撞检测。本例中,绘图部分写在了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 / 2cy = Height - DdrawcarFor i = 1 To 20l1(i) = 0l2(i) = 0drawway (i)Next iTimer1.Enabled = TrueEnd SubPrivate Sub drawcar()Line (cx, BT - 100)-Step(3 * D, D), BackColor, BFLine (cx + D, BT - 200)-Step(D, D), BackColor, BF 先擦Line (cx, BT - 100)-Step(3 * D, D), RGB(225, 0, 0), BFLine (cx + D, BT - 200)-Step(D, D), RGB(225, 0, 0), BFEnd SubPrivate 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), ,BFLine (Width/2-3*D/2+5*D,BT-n*D)-Step(-l2(n)*D,D), ,BFEnd SubPrivate Sub Form_KeyPress(KeyAscii As Integer)Select Case KeyAsciiCase Asc(a), Asc(A)cx = cx - DCase Asc(s), Asc(S)cx = cx + DEnd SelectEnd SubPrivate Sub Timer1_Timer()RandomizeFor i = 1 To 19l1(i) = l1(i + 1)l2(i) = l2(i + 1)drawway (i)Next iDol1(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)以上画出跑道drawcartestEnd SubPrivate Sub test()If 3.5*D-Width/2+cxl1(1)*D Then Timer1.Enabled=FalseIf 3.5*D-Width/2+cx+Dl1(2)*D Then Timer1.Enabled=FalseIf 3.5*D-(cx+3*D-Width/2)l2(1)*D Then Timer1.Enabled=FalseIf 3.5*D-(cx+2*D-Width/2)l2(2)*D Then Timer1.Enabled=FalseEnd Sub本文来自编程入门网(.cn):相信不少读者都看过央视的水浒吧,林冲、武松、李逵等英雄好汉的音容笑貌仿佛还浮目前我的眼前,那么108将中你最喜欢谁呢?我做了一种小程序来让电脑猜想你的心思,程序界面如图所示。为了简化问题,我选择了其中的27将,将她们提成3组,每组9人。如果你最喜欢其中的一种(例如史进),她在第一组浮现了,那么就按下按钮“第一组”。然后这27将会重新排列顺序,你再找史进在哪一组,例如发现她在第二组,就按下按钮“第二组”,画面中的人物顺序会再次打乱,再找史进所在组别最多3次,电脑将会猜出你心中的英雄!懂得了玩法,下面我将简介程序是如何实现的:一、猜想的奥妙推算原理猜想的原理其实也不复杂,我们来模拟一下猜想的过程人们就清晰了。程序初始化时是把127将随机打乱分别放入PageControl控件的三个选项卡中,每个选项卡放9张图片。点击一次按钮后其实不是盲目地将顺序打乱,而是进行了筛选,把有用的图片(就是点选的那组的9张图片)筛选出来平均分派到PageControl控件的三个选项卡中,再把不需要的图片集中起来平均分派到PageControl控件的三个选项卡中,最后在各个选项卡中把有用的、无用的图片随机打乱再次重新排列显示出来,从而完毕猜想。用表1来阐明:点击按钮的次数 选项卡1 选项卡2 选项卡3 1 3 3 3 2 1 1 1 3 0 0 0 具体讲,当第一次按下按钮时,表达你相中的图片在其中一种选项卡的9张图片内。于是把这9张图片均提成3份,每份3张,分别送入3个选项卡,其他的图片就不做考虑了。当第二次按下按钮时,表达你相中的图片在其中一种选项卡的3张图片内,于是把这3张图片均提成3份,每份1张,分别送入3个选项卡,当第三次按下按钮时,表达你相中的图片在其中一种选项卡的1张图片内,毫无疑问,这张图片就是你相中的图片,于是程序把这张图片显示出来。打乱重排的算法在程序中的诸多地方要波及打乱顺序重排的问题,下面我们就来先简朴简介一下打乱是如何实现的。这里要实现的措施是比较简朴的,也就是多次把数组的不同位置的值互换,就像读小学时教师让两个同窗互换位置同样,教师不断随机抽两个同窗互换位置,最后同窗们的座位就都重新排了一遍。举个例子:int I,temp1,temp2,a2,b27for(i=1;i=27;i+)/先对数组赋初值bi=I;randomize();for(i=1;iClear();for(i=1;iItems-Add(IntToStr(bi); 如上例所示,通过打乱,b27数组将不再是旧时容颜。二、实现的核心筛选算法的简介在整个实现的过程中,如何在每一次打乱后对人物进行筛选是程序的核心所在,解决不好,程序就不会有成果。并且筛选很容易把你搅得头晕脑胀,因此波及的各个数组之间的关系一定要先理顺,先用一种例子来解释如何进行筛选。以点击按钮的次数是第一次并且点击的按钮是Button1为例加以简介,其思路如下:初始:第一次执行按钮事件并且按下的是Button1时(表a的数组就是核心数组):把表a打乱后平均拆分为3组分别送入内存缓冲区把表b和表c打乱后也平均拆分为3组分别送入内存缓冲区(非重要的数组),然后将它们进行组合,分别把有用的和无用的搭配重新组合为三张表并显示出来:把所有的筛选过程表述出来:1.初始化:把a1-27打乱并将a1-9 赋给first1-9a10-18 赋给second1-9a19-27 赋给third1-92.第一次按钮事件(假设选中的是第二个选项卡)second1-9打乱后赋给temp11-3、temp21-3、temp31-3a1-9+a19-27赋给temp41-18 并打乱temp11-3temp41-6赋给first1-9并打乱temp21-3temp47-12赋给second1-9 并打乱temp31-3temp413-18赋给third1-9 并打乱3.第二次按钮事件(假设选中的是第二个选项卡)temp21-3打乱后赋给temp51、 temp61 、temp71temp11-3+temp31-3+temp41-18赋给temp81-24并打乱temp51temp81-8赋给first1-9 并打乱temp52temp89-16赋给second1-9 并打乱temp53temp817-24赋给third1-9 并打乱4.第三次按钮事件(如果选中的是第二个选项卡)把temp52所相应的图片显示出来即可。最后分别把表a表c打乱后显示出来即可。 进行二次、多次筛选的措施都同样,只是要注意相中的好汉在哪个数组里面,千万别搞错就行了。三、小结最后的工作就比较简朴了。可以设计一种和谐的界面,然后在程序启动的时候对数组赋初值,并显示出来;对每个按钮分别先进行次数判断,然后进行前面讲述的解决,不断筛选直到剩余惟一的好汉后就可以显示在界面的正下方了。本文来自编程入门网(.cn):VB游戏写作技巧(1)秀图篇文章来源: 互联网 文章作者: 未知 一开始,我想先从游戏的图形先讲起好了,毕竟游戏最重要的就是画面,一种没有美丽图形的游戏,我连碰都不想去碰。那该怎么解决游戏的图形呢?VB提供了一种非常好用的控制项-PictureBox,有了这个控制项我们才干轻松的在程式中秀出图形,目前就来看看PictureBox有那些特性可以让我们在游戏中使用。Picture 属性:只要将这个属性填入正常的图形档名,VB就会自动帮我们载入图形档。Visible 属性:这个属性可以让图形消失或让图形出目前画面上。用法:Form1.Picture1.Visible = False 消失Form1.Picture1.Visible = True 浮现Left 属性:表达图形的位置的座标。Top 属性:表达图形的位置的座标。用法:变化这两个属性就可以变化图形的位置。ScaleMode 属性:设定PictureBox所使用的座标单位,一般都设为3-像素懂得了PictureBox的特性後,要怎么样把它应用到游戏中呢?举个例子好了,我目前要做一种打砖块的游戏,需要用到那些图片呢?砖块、球、击球的板子,一共有三张图,因此我们就使用三个PictureBox,将图片载入到PictureBox里面,如下面所示:Picture1 砖块的图片Picture2 球的图片Picture3 板子的图片接著我就可以写,当我按下方向键的右键时,Picture3的left属性+1,按下左键则-1,这样一来不就可以控制板子的左右移动了吗?球也是同样,只要每隔一段时间更改一次Picture2的left和top 属性,就可以做出球移动的效果了。或许有人会觉得奇怪,一张图就要用到一种PictureBox,小游戏的图不多还没关系,如果是的话不就要动用到几千个甚至几万个PictureBox?岂不是麻烦死了?因此如果图片诸多的时候,我一般都是把图所有都放在同一种图形档里面,这样就只要用到一种PictureBox了,要用图片时从里面把它抓出来就好了,但是要怎么抓呢?我建议使用函数BitBlt()来做图形的搬移。使用BitBlt函数前要先宣布:Declare Sub BitBlt Lib gdi32 (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, 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 目的地的DCx 目的地的座标xy 目的地的座标ynWidth 来源图片的宽度nHight 来源图片的高度hSrcDC 来源图片的DCxsrc 来源图片的座标xysrc 来源图片的座标ydwrop 运算措施:&HCC0020 PUT&H8800C6 AND&HEE0086 OR&H660046 XOR目前有两个PictureBoxPicture1 AutoRedRaw 属性设为TureScaleMode 属性设为3-像素Picture2 AutoRedRaw 属性设为TureScaleMode 属性设为3-像素若想将Picture2里(10,10)-(100,100)区域内的图形拷贝到Picture1的(0,0)可以这样写:BitBlt Picture1.hdc,0,0,90,90,Picture2.hdc,10,10,&HCC0020这样子平常写游戏时就只要设两个PictureBox,一种专门用来显示,另一种则用来放图形资料,需要时再用BitBlt函数覆制过去就好了,不是很以便吗? 本文来自编程入门网(.cn): VB游戏写作技巧(2)网络篇文章来源: 互联网 文章作者: 未知 这一次写的是如何用VB来写网路程式的措施,你可不要觉得这是什么深奥的程式,其实只要一种Winsock 控制项就可以了,目前就来简介一下Winsock 的用法:环节一:一方面要先把控制项给叫出来,你只要按下Ctrl+T後选用Winsock Control 5.0若是用VB6 的就选Winsock Control 6.0,这样就可以使用Winsock元件。环节二:再来我们必须先拟定程式是作Server端还是Client端的,要先设定某些属性:Server写法:winsock1.localPort = 5400 (数字可以随便设)winsock1.Listen (等待连线)Client写法:winsock1.RemoteHost = 对方IPwinsock1.RemoteProt = 5400 (必须要和Server端相似)winsock1.LocalProt = 0winsock1.Connect (连线)连线之前Client端要先懂得Server端的IP,接著等到Server端等待连线时,Client端就可以呼喊Connect措施,双方连线成功後就可以传播资料。环节三:当Client连线的时候Server端会引起ConnectionRequest事件,Server的程式要这样子写:Private Sub Winsock1_ConnectionRequest(ByVal requestID As long)winsock1.Closewinsock1.Accept requestIDEnd Sub环节四:这样一来就可以传送资料了,传送和接受资料的措施如下:传送资料:mydata = 你好吗?winsock1.sendData mydata这样就会把mydata给传到对方那里。接受资料:当有资料送到的时候会引起DataArrival事件。Privata Sub Winsock1_DtatArrival(ByVal bytesTotal As long)Dim mydata As Stringwinsock1.GetData mydata会把送到的资料给mydataEnd SubWinsock 控制项就那么简朴,只要会这些就可以写网路游戏了,有关的程式你可以参照网路五子棋(54K)。 本文来自编程入门网(.cn):本文简介编制贪吃蛇游戏的一般措施, 其中不含什么高深的算法,只使用了初级的VB编程措施,通俗易懂。各位如有任何见解,请不吝赐教。本人QQ : (请在身份验证里面写上“CSDN”)邮箱 需要本程序VB源码文献的朋友,请留下你的 E-mail,我会尽快寄出。设计思路:(一)开始新游戏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)如果目前蛇头位置的地图属性是“奖品”加分,重新合计 吃进的物品数(curEatCount = 0)3.3 刷新蛇身坐标,更新 地图网格属性 以及画面(1)在更新蛇身坐标之前,保存本来的 蛇尾坐标;(2)先在地图上 擦除旧的的蛇头,然后在地图上 绘画出新的蛇头;(3)修变化量值,标记蛇头新坐标下的地图格属性为:蛇身;(4)要先更新 蛇身除了蛇头外其他部分的坐标;(5)之后才更新 蛇头的坐标;(6)判断与否需要 增长蛇身长度如果要增长长度:旧蛇尾的坐标不变,蛇身长度 + 1;否则(无需增长蛇身长度):如果蛇头的新坐标与旧蛇尾的坐标重叠,就不用在旧蛇尾的坐标下 绘画空白地的图案(由于该网格属性已经是 蛇头,而不是空白地)(7)在地图上擦除旧蛇尾,绘画空白地;(8)在地图上把 旧蛇尾坐标 下的地图格的属性设立为 空白地;原则模块 Module1 代码Option Explicit全局 常量 Public Enum MAP_PROPERTY 地图属性MAP_EMPTY = 0 空白地MAP_FOOD 食物MAP_BOMB 炸弹,陷阱MAP_PRIZE 加分奖品MAP_SNAKE 蛇身End EnumPublic Const MAP_SCALE As Integer = 15 地图放大倍数地图网格数(Index值,首值为0)Public Const MAX_COL_INDEX As Integer = 19Public Const MAX_ROW_INDEX As Integer = 10Public Const START_SNAKE_LENGTH As Integer = 8 蛇身初始长度Public Const SPEED_LV1 As Integer = 200 第一级(最慢)的速度(Timer.Interval,最快第9级40)Public Const SPEED_CHANGE As Integer = 20 前后2个级别之间的 Interval差值(毫秒)定义控制键Public Const KEY_PAUSE As Integer = vbKeyNumpad5Public Const KEY_UP As Integer = vbKeyNumpad8Public Const KEY_DN As Integer = vbKeyNumpad2Public Const KEY_LF As Integer = vbKeyNumpad4Public Const KEY_RT As Integer = vbKeyNumpad6Public Const KEY_LFUP As Integer = vbKeyNumpad7Public Const KEY_LFDN As Integer = vbKeyNumpad1Public Const KEY_RTUP As Integer = vbKeyNumpad9Public 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 3Public Const RECORD_FILE_NAME As String = record.dat 记录得分榜的 文献名Public Const MAX_PRIZE As Integer = 50 起始 奖励分数的 上限Public Const MIN_PRIZE As Integer = 20 起始 奖励分数的 下限全局 变量 记录玩家的有关信息和设立值:Public Type thePlayerInfoScore 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,1)X_Way As IntegerY_Way As Integer控制键(8个)临时省略(采用默认控制键)End Type记录 玩家的得分和名字Type theRecordName As String * 15Score As IntegerEnd Type用于表达二维坐标值Public Type thePositionX As IntegerY As IntegerEnd TypePublic 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()frmPlay.ShowfrmScoreList.Show 第一次运营时先显示得分榜End Sub本文来自编程入门网(.cn):VB 贪吃蛇 单人版游戏(二)文章来源: CSDN 文章作者: Bugs1984 主窗体 FrmPlay 代码Private blnStartGame As Boolean 标记与否已经开始 新游戏(T游戏已经开始)Private blnPause As Boolean 标记目前与否处在暂停状态(T暂停)Private blnThroughWall As Boolean 标记与否为穿墙模式(T可以穿墙)Private blnOnKeyEvents As Boolean 标记与否可以 接受键盘事件(T可以接受),此变量可避免 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 记录 每次浮现奖品之前,一共吃进多少物品(涉及食物和炸弹,奖品不计),当奖品浮现后,此变量值变为 零0,然后进入下一次记录Private curLevel As Integer 目前级别Private P1 As thePlayerInfo 记录Player1 的信息Private Snake_P1() As thePosition 记录蛇身坐标Private PrizePos As thePosition 记录奖品的坐标Private Record(9) As theRecord 寄存前十名的 得分记录信息Option ExplicitPrivate Sub cmdHelp_Click() If blnPause = False Then Call Form_KeyDown(KEY_PAUSE, 0) 如果游戏正在进行,则发送“暂停”按键事件,暂停游戏 frmHelp.Show End Sub开始新游戏Private Sub cmdNewGame_Click() Dim i As Integer Randomize 重新生成随机数列 blnStartGame = Not blnStartGame If blnStartGame Then cmdNewGame.Caption = 停止 Else cmdNewGame.Caption = 新游戏 End If 中断游戏 If blnStartGame = False Then 如果上一次的奖品还没有消失(以 PrizeRemain 0 为标志),就先清除旧的奖品,然后才显示新的奖品 If PrizeRemain 0 Then Call ShowPrize(False) picDisplay.Cls P1.Score = 0 玩家的初始分数 P1.Food = 0 P1.Bomb = 0 curEatCount = 0 PrizeRemain = 0 blnPause = False lblPause.Visible = False lblScore.Caption = P1.Score lblFoodCount.Caption = P1.Food lblBombCount.Caption = P1.Bomb P1.blnGameOver = True HscrLevel.Enabled = True tmrMove.Enabled = False Exit Sub End If blnThroughWall = True 穿墙模式 blnOnKeyEvents = True 临时使用默认填充色 Map_Bomb_Color = BOMB_COLOR Map_Empty_Color = EMPTY_COLOR Map_Food_Color = FOOD_COLOR P1.BodyColor = BODY_COLOR P1.HeadColor = HEAD_COLOR 地图初始化 ReDim MapProperty(MAX_COL_INDEX, MAX_ROW_INDEX) Map_Width = (MAX_COL_INDEX + 1) * MAP_SCALE Map_Height = (MAX_ROW_INDEX + 1) * MAP_SCALE picDisplay.Cls picDisplay.Width = Map_Width + 2 picDisplay.Height = Map_Height + 2 picDisplay.Line (0, 0)-Step(Map_Width, Map_Height), Map_Empty_Color, BF FoodCount_AtOneTime = 2 地图上同步存在的 食物数量 BombCount_AtOneTime = 1 地图上同步存在的 炸弹数量 EatCountPerShowPrize = 5 设立 蛇每吃进多少物品(涉及食物和炸弹,奖品不计)才显示一次奖品 curLevel = HscrLevel.Value AddScorePerFood = curLevel 每吃进一种 食物,所增长的分数目前的级别值 AddScorePerBomb = -curLevel * 2 每吃进一种 炸弹,所扣掉的分数 P1.Score = Abs(AddScorePerBomb) + 1 玩家的初始分数每吃进一种 炸弹,所扣掉的分数1 P1.Food = 0 P1.Bomb = 0 PrizeRemain = 0 P1.blnGameOver = False lblScore.Caption = P1.Score lblFoodCount.Caption = P1.Food lblBombCount.Caption = P1.Bomb 初始化P1蛇身 ReDim Snake_P1(START_SNAKE_LENGTH) For i = 0 To UBound(Snake_P1) 设定蛇身各段的起始位置 Snake_P1(i).X = MAX_COL_INDEX - UBound(Snake_P1) + i Snake_P1(i).Y = MAX_ROW_INDEX 初始化移动方向 P1.X_Way = -1 P1.Y_Way = 0 MapProperty(Snake_P1(i).X, Snake_P1(i).Y) = MAP_SNAKE picDisplay.Line (Snake_P1(i).X * MAP_SCALE, Snake_P1(i).Y * MAP_SCALE)-Step(MAP_SCALE, MAP_SCALE), BODY_COLOR, BF Next 使用蛇头颜色 重新绘画蛇头 picDisplay.Line (Snake_P1(0).X * MAP_SCALE, Snake_P1(0).Y * MAP_SCALE)-Step(MAP_SCALE, MAP_SCALE), HEAD_COLOR, BF 放置食物 For i = 1 To FoodCount_AtOneTime Call AddFood Next 放置炸弹 For i = 1 To BombCount_AtOneTime Call AddBomb Next lblPause.Visible = False lblScore.Caption = P1.Score lblFoodCount.Caption = P1.Food lblBombCount.Caption = P1.Bomb P1.blnGameOver = False HscrLevel.Enabled = False 游戏进行期间不能变化级别 tmrMove.Enabled = TrueEnd Sub显示得分榜Private Sub cmdShowScoreList_Click() If blnPause = False Then Call Form_KeyDown(KEY_PAUSE, 0) 如果游戏正在进行,则发送“暂停”按键事件,暂停游戏 frmScoreList.Show End SubPrivate Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If P1.blnGameOver Or blnStartGame = False Or blnOnKeyEvents = False Then Exit Sub 如下状况(游戏结束、游戏还没有开始、禁用击键事件)不接受按键操作。 按“Numpad 5”键暂停/继续 If KeyCode = KEY_PAUSE Then blnPause = Not blnPause lblPause.Visible = blnPause tmrMove.Enabled = Not blnPause Exit Sub End If If blnPause Then Exit Sub 在暂停状态下不接受“ESC”外的其他按键 Select Case KeyCode Case KEY_LFUP blnOnKeyEvents = False If P1.X_Way 0 Then P1.X_Way = 0 P1.Y_Way = -1 ElseIf P1.Y_Way 0 Then P1.X_Way = -1 P1.Y_Way = 0 End If Case KEY_LFDN blnOnKeyEvents = False If P1.X_Way 0 Then P1.X_Way = 0 P1.Y_Way = 1 ElseIf P1.Y_Way 0 Then P1.X_Way = -1 P1.Y_Way = 0 End If Case KEY_RTUP blnOnKeyEvents = False If P1.X_Way 0 Then P1.X_Way = 0 P1.Y_Way = -1 ElseIf P1.Y_Way 0 Then P1.X_Way = 1 P1.Y_Way = 0 End If Case KEY_RTDN blnOnKeyEvents = False If P1.X_Way 0 Then P1.X_Way = 0 P1.Y_Way = 1 ElseIf P1.Y_Way 0 Then P1.X_Way = 1 P1.Y_Way = 0 End If 当蛇以 水平 方向移动时,LF 和 RT 按键无效 Case KEY_LF blnOnKeyEvents = False If P1.X_Way = 0 Then P1.X_Way = -1 P1.Y_Way = 0 End If Case KEY_RT
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!