从零开发CocosCreator+Nodejs麻将视频教程
30703 人在学
贪吃蛇作为一款经典游戏,获得了很多人的青睐,之所以能经久不衰,是因为贪吃蛇从游戏设计之始,就进行了全方位的考虑。这款游戏在设计的时候根据它的可行性,系统功能,进行开发设计,编程,使贪吃蛇成为经典。
DimqAsInteger:DimwAsInteger
DimsqAsInteger:DimswAsInteger
DimcqAsInteger:DimcwAsInteger
DimssAsLong
DimcAsInteger
DimaAsInteger
DimtAsInteger
Dimsh(350)AsInteger'为了偷懒而都弄成了全局变量
PrivateSubForm_Load()
Randomize'和随机函数配套的语句,为了刷新第一次的随机数,不然可能每次开始都是同一个数字
Form1.BackColor=RGB(999,999,999)'把背景颜色弄成白色
t=3'表示蛇头此时的方向为3(不是这个位置上的方向变量),也就是朝上,作为一直在进行的计时器用到的一个参数
ks'创建控件数组函数
sc'随机创建食物的函数
q=7:w=9'初始化刚开始时候蛇的位置,总共有三段,这个是蛇头
sq=9:sw=9'这个是蛇尾
sh(20*sq+sw)=3'设置蛇尾的方向变量为3,也就是朝上
sh(169)=3'设置蛇身的方向变量为3,朝上
Picture1(20*q+w).Visible=True'显示这三个控件
Picture1(20*q+w).Picture=LoadPicture(app.Path+"/园上.jpg")
Picture1(169).Visible=True
Picture1(169).Picture=LoadPicture(App.Path+"/园.jpg")
Picture1(20*sq+sw).Visible=True
Picture1(20*sq+sw).Picture=LoadPicture(App.Path+"/园.jpg")
EndSub
PublicSubks()'先把所有的数组都创建好
Picture1(0).Visible=False
DimiAsInteger
DimjAsInteger
DimcountAsInteger
Fori=1To17'17X20的尺寸
Forj=1To20
Ifi<>0Andj<>0Then
count=count+1
LoadPicture1(count)
Picture1(count).Left=400*j-400'400X400
Picture1(count).Top=400*i-400
Picture1(count).Visible=False'设置为不可见
Picture1(count).Picture=LoadPicture(App.Path+"/园上.jpg")'先全部调用一次图片
EndIf
Nextj
Nexti
EndSub
PublicSubsc()'随机创建一个食物的坐标
cq=Int((14)*Rnd+1):cw=Int((19)*Rnd+1)
Whilesh(20*cq+cw)>0'当食物创建在了蛇的身上时重新创建,sh表示蛇经过的方向,用1,2,3,4表示,所以它不为0时就表示这个位置有蛇,蛇正在经过
cq=Int((14)*Rnd+1):cw=Int((20)*Rnd+1)
Wend'while语句的结束语句
c=1'这个是表示没有吃到食物,下面会说到
Picture1(20*cq+cw).Visible=True'显示这个控件
Picture1(20*cq+cw).Picture=LoadPicture(App.Path+"/吃园.jpg")'调用食物这张图片
EndSub
PrivateSubPicture1_KeyDown(IndexAsInteger,KeyCodeAsInteger,ShiftAsInteger)'即时的更改变量t,来更改蛇头的方向
IfKeyCode=37Andt<>2Anda=0Then
t=1
a=1'设置这个变量的原因是保证在计时器中循环过一次操作后才能再次改变蛇头的方向,不然会出现蛇头还没移动就此处乱转的囧境
ElseIfKeyCode=39Andt<>1Anda=0Then
t=2
a=1
ElseIfKeyCode=38Andt<>4Anda=0Then
t=3
a=1
ElseIfKeyCode=40Andt<>3Anda=0Then
t=4
a=1
ElseIfKeyCode=83Then'如果按下‘a’就加速
Timer1.Interval=Timer1.Interval+50
ElseIfKeyCode=65Then'按下‘s’就减速
IfTimer1.Interval<>50Then'如果速度等于50了就不能再减了呵呵,速度的上限出于VB的原因倒是有上限的
Timer1.Interval=Timer1.Interval-50
EndIf
EndIf
EndSub
PrivateSubTimer1_Timer()
Ift=1Then'根据变量t来判断蛇头的方向
Picture1(20*q+w).Picture=LoadPicture(App.Path+"/园.jpg")
sh(20*q+w)=1'根据蛇头的方向设置他经过的空间的方向变量,为1,朝左的,
Ifw=0Then'如果坐标是最左边的控件,那他再往左就会撞墙了
PrintTab(20);"撞墙了额,你输了"
Timer1.Enabled=NotTimer1.Enabled'如果撞墙了,就停止计时器
EndIf
w=w-1'如果不是最左边的控件,那就把他再往左移一格
Ifsh(20*q+w)>0Then'前面说过,如果方向变量不为0,那说明此时蛇正经过,如果这里大于0,说明他咬了自己..
PrintTab(20);"你咬了自己,你输了"
Timer1.Enabled=NotTimer1.Enabled'停止计时器
EndIf
Picture1(20*q+w).Visible=True'一切正常的话,就显示新的蛇头控件
Picture1(20*q+w).Picture=LoadPicture(App.Path+"/园左.jpg")
a=0
Ifq=cqAndw=cwThen'这个是判断是否吃到食物,如果蛇头的坐标和食物的坐标重合,则c为0,表示吃到,不然的话一直重复上面的循环
c=0
Else
cy'进行一些更新蛇尾的操作
hh
EndIf
ElseIft=2Then
Picture1(20*q+w).Picture=LoadPicture(App.Path+"/园.jpg")
sh(20*q+w)=2
Ifw=20Then
PrintTab(20);"撞墙了额,你输了"
Timer1.Enabled=NotTimer1.Enabled
EndIf
w=w+1
Ifsh(20*q+w)>0Then
PrintTab(20);"你咬了自己,你输了"
Timer1.Enabled=NotTimer1.Enabled
EndIf
Picture1(20*q+w).Visible=True
Picture1(20*q+w).Picture=LoadPicture(App.Path+"/园右.jpg")
a=0
Ifq=cqAndw=cwThen
c=0
Else
cy
hh
EndIf
ElseIft=3Then
Picture1(20*q+w).Picture=LoadPicture(App.Path+"/园.jpg")
sh(20*q+w)=3
Ifq=1Then
PrintTab(20);"撞墙了额,你输了"
Timer1.Enabled=NotTimer1.Enabled
EndIf
q=q-1
Ifsh(20*q+w)>0Then
PrintTab(20);"你咬了自己,你输了"
Timer1.Enabled=NotTimer1.Enabled
EndIf
Picture1(20*q+w).Visible=True
Picture1(20*q+w).Picture=LoadPicture(App.Path+"/园上.jpg")
a=0
Ifq=cqAndw=cwThen
c=0
Else
cy
hh
EndIf
ElseIft=4Then
Picture1(20*q+w).Picture=LoadPicture(App.Path+"/园.jpg")
sh(20*q+w)=4
Ifq=14Then
PrintTab(20);"撞墙了额,你输了"
Timer1.Enabled=NotTimer1.Enabled
EndIf
q=q+1
Ifsh(20*q+w)>0Then
PrintTab(20);"你咬了自己,你输了"
Timer1.Enabled=NotTimer1.Enabled
EndIf
Picture1(20*q+w).Visible=True
Picture1(20*q+w).Picture=LoadPicture(App.Path+"/园下.jpg")
sh(20*q+w)=5
a=0
Ifq=cqAndw=cwThen
c=0
Else
cy
hh
EndIf
EndIf
Ifc=0Then'如果吃到的话,就重新初始化食物,并增加分数
sc
ss=ss+100000/Timer1.Interval*1.33'加分,公示里面加入了计时器的参数,所以蛇走的越快加的分数越高
EndIf
Label1.Caption="你的得分:"&ss'刷新分数
Label2.Caption="速度up按a,速度down按s:"&Int(200000/Timer1.Interval)'显示速度
EndSub
PublicSubcy()
Picture1(20*sq+sw).Visible=False'隐藏蛇尾
Picture1(20*sq+sw).Picture=LoadPicture(App.Path+"/园.jpg")
Picture1(20*cq+cw).Visible=True'初始化食物,不用担心食物会和身体重复,因为cq和cw坐标产生时都是调用了sc函数
Picture1(20*cq+cw).Picture=LoadPicture(App.Path+"/吃园.jpg")
EndSub
PublicSubhh()'根据蛇尾的方向变量设定下一个蛇尾的位置,然后把之前的方向变量清零
Ifsh(20*sq+sw)=3Then
sh(20*sq+sw)=0
sq=sq-1
ElseIfsh(20*sq+sw)=4Then
sh(20*sq+sw)=0
sq=sq+1
ElseIfsh(20*sq+sw)=1Then
sh(20*sq+sw)=0
sw=sw-1
ElseIfsh(20*sq+sw)=2Then
sh(20*sq+sw)=0
sw=sw+1
EndIf
EndSub
贪吃蛇是在不断的运动的,我们研究蛇的运动可以发现这样的特点:
1.蛇头由键盘控制,键盘不操作时,保持原有方向运动;(用intdirection;表示)
2.运动时,蛇身后面一节移动到前面一节的位置。当我们用nodes[0]表示蛇头的时候,nodes[1]运动到nodes[0]处;nodes[2]运动到nodes[1]处...。
3.吃到一个食物以后,蛇身会增加一节。即该数组中的有效数据个数加一。(用intlength;表示)