关于贪吃蛇游戏设计的思路

    作者:课课家教育更新于: 2019-04-02 23:35:37

      贪吃蛇作为一款经典游戏,获得了很多人的青睐,之所以能经久不衰,是因为贪吃蛇从游戏设计之始,就进行了全方位的考虑。这款游戏在设计的时候根据它的可行性,系统功能,进行开发设计,编程,使贪吃蛇成为经典。

      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;表示)

    贪吃蛇游戏_游戏设计_设计思路_课课家教育

课课家教育

未登录

1