下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

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

作者:课课家教育     来源: http://www.kokojia.com点击数:2758发布时间: 2019-04-03 09:33:38

标签: 贪吃蛇游戏游戏设计设计思路设计代码

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

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

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

赞(24)
踩(4)
分享到:
华为认证网络工程师 HCIE直播课视频教程