貪吃蛇遊戲開發詳解
注意以下問題:
1.蛇移動算法。
蛇所有節點存放到數組。每次移動的時候。把節點的坐标設為其前面節點的坐标。最後在把頭的坐标往前移動。坐标一直在往前移。
2.随機生成食物時,在蛇蛇身上時候,要重新生成(遞歸調用)。
3.把遊戲區域分成若幹個網格,蛇移動距離為網格單元大小,食物生成在網格中。
點選此試玩遊戲(csdn伺服器太垃圾。多重新整理幾次)
點選下載下傳源代碼
代碼如小:
一:遊戲開始
package com.lux![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ... {![]()
貪吃蛇V1.0 import flash.display.*;![]()
貪吃蛇V1.0 import flash.events.Event;![]()
貪吃蛇V1.0 import flash.events.MouseEvent;![]()
貪吃蛇V1.0 import fl.controls.*;![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 public class GameStart extends MovieClip![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ...{![]()
貪吃蛇V1.0 public static var gamestart:MovieClip ;![]()
貪吃蛇V1.0 private var _score:Number=0;![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 //=====遊戲所用時間![]()
貪吃蛇V1.0 private var time:Number ;![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 public function GameStart()![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ...{![]()
貪吃蛇V1.0 super();![]()
貪吃蛇V1.0 gamestart = this ;![]()
貪吃蛇V1.0 play_btn.addEventListener(MouseEvent.CLICK,playGame);![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 public function playGame(e:MouseEvent):void...{![]()
貪吃蛇V1.0 this.gotoAndStop("two_tag");![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 public function replayGame(e:MouseEvent):void...{![]()
貪吃蛇V1.0 score_mc.score_txt.text = "0" ;![]()
貪吃蛇V1.0 timer_mc.min_mc.text ="00" ;![]()
貪吃蛇V1.0 timer_mc.sec_mc.text ="00" ;![]()
貪吃蛇V1.0 this.gotoAndStop("two_tag");![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 public function addScore(_score:Number)...{![]()
貪吃蛇V1.0 this._score+=_score ;![]()
貪吃蛇V1.0 score_mc.score_txt.text = this._score.toString();![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 public function getScore():Number...{![]()
貪吃蛇V1.0 return this._score ;![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 // public function timerStop():void{![]()
貪吃蛇V1.0 // timer_mc.remove();![]()
貪吃蛇V1.0 // }![]()
貪吃蛇V1.0 //![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 }
二:蛇移動的管理
package com.lux![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ... {![]()
貪吃蛇V1.0 import de.polygonal.ds.NullIterator;![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 import flash.display.MovieClip;![]()
貪吃蛇V1.0 import flash.events.Event;![]()
貪吃蛇V1.0 import flash.events.KeyboardEvent;![]()
貪吃蛇V1.0 import flash.events.TimerEvent;![]()
貪吃蛇V1.0 import flash.filters.BevelFilter;![]()
貪吃蛇V1.0 import flash.ui.Keyboard;![]()
貪吃蛇V1.0 import flash.utils.Timer;![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 public class DaShe extends MovieClip ...{![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 //蛇節點數組![]()
貪吃蛇V1.0 private var a:Array ;![]()
貪吃蛇V1.0 //方向![]()
貪吃蛇V1.0 private var up:uint = 1 ;![]()
貪吃蛇V1.0 private var down:uint = 2 ;![]()
貪吃蛇V1.0 private var left:uint = 3 ;![]()
貪吃蛇V1.0 private var right:uint = 4 ;![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 //====儲存随機生成的蛇![]()
貪吃蛇V1.0 private var _newShe:XiaoShe ;![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 //====方向![]()
貪吃蛇V1.0 private var _dir:uint ;![]()
貪吃蛇V1.0 private var timer:Timer ;![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 private var _score:Number=0 ;![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 public function DaShe() ...{![]()
貪吃蛇V1.0 super();![]()
貪吃蛇V1.0 this._dir = this.right ;![]()
貪吃蛇V1.0 a = new Array();![]()
貪吃蛇V1.0 //蛇初始化為兩條小蛇的長度。![]()
貪吃蛇V1.0 var head:XiaoShe = new XiaoShe(30,30);![]()
貪吃蛇V1.0 a.push(head);![]()
貪吃蛇V1.0 this.addChild(head);![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 var head1:XiaoShe = new XiaoShe(head.x-head.width,head.y);![]()
貪吃蛇V1.0 a.push(head1);![]()
貪吃蛇V1.0 this.addChild(head1);![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 public function start():void...{![]()
貪吃蛇V1.0 timer = new Timer(100);![]()
貪吃蛇V1.0 timer.addEventListener(TimerEvent.TIMER,running);![]()
貪吃蛇V1.0 timer.start();![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 //===注冊方向控制![]()
貪吃蛇V1.0 this.stage.addEventListener(KeyboardEvent.KEY_DOWN,direction);![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 //===随機生成新蛇![]()
貪吃蛇V1.0 this.initFood();![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 private function running(e:Event):void...{![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 for(var i:uint=a.length-1;i>0;i--)...{![]()
貪吃蛇V1.0 a[i].x =a[i-1].x;![]()
貪吃蛇V1.0 a[i].y =a[i-1].y;![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 switch(_dir)...{![]()
貪吃蛇V1.0 case this.up:![]()
貪吃蛇V1.0 a[0].y-=this._SPEED;![]()
貪吃蛇V1.0 break;![]()
貪吃蛇V1.0 case this.left:![]()
貪吃蛇V1.0 a[0].x-=this._SPEED;![]()
貪吃蛇V1.0 break;![]()
貪吃蛇V1.0 case this.down:![]()
貪吃蛇V1.0 a[0].y+=this._SPEED;![]()
貪吃蛇V1.0 break;![]()
貪吃蛇V1.0 case this.right:![]()
貪吃蛇V1.0 a[0].x+=this._SPEED ;![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 //==========碰到食物![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 if(isEat())...{![]()
貪吃蛇V1.0 eatFood();![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 //增加積分![]()
貪吃蛇V1.0 // this.addScore();![]()
貪吃蛇V1.0 GameStart.gamestart.addScore(1);![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 if(isDead())...{![]()
貪吃蛇V1.0 this.gameOver() ;![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 //![]()
貪吃蛇V1.0 // private function addScore():void{![]()
貪吃蛇V1.0 // this._score++;![]()
貪吃蛇V1.0 // score_mc.score_txt.text = this._score.toString();![]()
貪吃蛇V1.0 // }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 private function isDead():Boolean ...{![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 if(a[0].x<=0||a[0].x>=this._ACTIVEWIDTH||a[0].y<=0||a[0].y>=this._ACTIVEHEIGHT)...{![]()
貪吃蛇V1.0 return true ;![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 for(var i:uint=1;i<a.length;i++)...{![]()
貪吃蛇V1.0 if((a[0].x==a[i].x) &&(a[0].y==a[i].y))![]()
貪吃蛇V1.0 return true ;![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 return false ;![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 public function gameOver():void...{![]()
貪吃蛇V1.0 trace("遊戲結束");![]()
貪吃蛇V1.0 timer.stop();![]()
貪吃蛇V1.0 timer.removeEventListener(TimerEvent.TIMER,running);![]()
貪吃蛇V1.0 this.stage.removeEventListener(KeyboardEvent.KEY_DOWN,direction);![]()
貪吃蛇V1.0 this.parent.removeChild(this);![]()
貪吃蛇V1.0 GameStart.gamestart.gotoAndStop("gameover_tag");![]()
貪吃蛇V1.0 // GameStart.gamestart.timerStop();![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 public function eatFood():void...{![]()
貪吃蛇V1.0 var _newshe:XiaoShe = new XiaoShe(a[a.length-1].x,a[a.length-1].y);![]()
貪吃蛇V1.0 a.push(_newshe);![]()
貪吃蛇V1.0 this.randomLocation();![]()
貪吃蛇V1.0 this.addChild(_newshe);![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 public function isEat():Boolean...{![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 if((a[0].x==this._newShe.x)&&(a[0].y==this._newShe.y))...{![]()
貪吃蛇V1.0 return true ;![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 return false ;![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 //==============方向控制![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 private function direction(e:KeyboardEvent):void...{![]()
貪吃蛇V1.0 trace("有按鍵事件");![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 switch(e.keyCode)...{![]()
貪吃蛇V1.0 case Keyboard.DOWN:![]()
貪吃蛇V1.0 if(_dir!=this.up)![]()
貪吃蛇V1.0 _dir = this.down ;![]()
貪吃蛇V1.0 break ;![]()
貪吃蛇V1.0 case Keyboard.RIGHT:![]()
貪吃蛇V1.0 if(_dir!=this.left)![]()
貪吃蛇V1.0 _dir = this.right ;![]()
貪吃蛇V1.0 break;![]()
貪吃蛇V1.0 case Keyboard.UP:![]()
貪吃蛇V1.0 if(_dir!=this.down)![]()
貪吃蛇V1.0 _dir =this.up ;![]()
貪吃蛇V1.0 break;![]()
貪吃蛇V1.0 case Keyboard.LEFT:![]()
貪吃蛇V1.0 if(_dir!=this.right)![]()
貪吃蛇V1.0 _dir =this.left ;![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 private function initFood():void...{![]()
貪吃蛇V1.0 _newShe = new XiaoShe(0,0);![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 //===随機生成位置![]()
貪吃蛇V1.0 this.randomLocation();![]()
貪吃蛇V1.0 this.addChild(_newShe);![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 //==============重新随機移動蛇的位置。![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 private function randomLocation():void...{![]()
貪吃蛇V1.0 var _x:Number = Math.floor(Math.random()*30)*10 ;![]()
貪吃蛇V1.0 var _y:Number = Math.floor(Math.random()*40)*10 ;![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 trace("x:"+_x+","+"y:"+_y);![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 if(check(_x,_y))...{![]()
貪吃蛇V1.0 trace("生成的小蛇和蛇身重合");![]()
貪吃蛇V1.0 this.randomLocation();![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 }else...{![]()
貪吃蛇V1.0 this._newShe.x=_x ;![]()
貪吃蛇V1.0 this._newShe.y=_y ;![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 private function check(_x:Number,_y:Number):Boolean...{![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 for(var i:uint;i<a.length;i++)...{![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 if((_x==a[i].x) && (_y==a[i].y)||(_x==0)||(_y==0)||(_x==300)||(_y==400))...{![]()
貪吃蛇V1.0 trace("x==="+_x+","+"y=="+_y);![]()
貪吃蛇V1.0 return true ;![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 return false ;![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 //====蛇移動速度![]()
貪吃蛇V1.0 private var _SPEED:uint =10 ;![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 //====食物的大小![]()
貪吃蛇V1.0 private var _FWIDTH = 10 ;![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 //====蛇活動視窗寬度![]()
貪吃蛇V1.0 private var _ACTIVEWIDTH = 300 ;![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 //====蛇活動視窗高度![]()
貪吃蛇V1.0 private var _ACTIVEHEIGHT = 400;![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 }
三:計時器
package com.lux![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ... {![]()
貪吃蛇V1.0 import flash.display.MovieClip;![]()
貪吃蛇V1.0 import flash.events.TimerEvent;![]()
貪吃蛇V1.0 import flash.text.TextField;![]()
貪吃蛇V1.0 import flash.utils.Timer;![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 public class TimerUtil extends MovieClip...{![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 private var _sec:Number=0 ;![]()
貪吃蛇V1.0 private var _min:Number=0![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 var time:Timer ;![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 public function TimerUtil()...{![]()
貪吃蛇V1.0 super();![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 public function start():void...{![]()
貪吃蛇V1.0 time = new Timer(1000) ;![]()
貪吃蛇V1.0 time.addEventListener(TimerEvent.TIMER,change);![]()
貪吃蛇V1.0 time.start();![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 public function remove():void...{![]()
貪吃蛇V1.0 time.stop();![]()
貪吃蛇V1.0 this.removeEventListener(TimerEvent.TIMER,change);![]()
貪吃蛇V1.0 this._sec =0;![]()
貪吃蛇V1.0 this._min =0;![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 private function change(e:TimerEvent):void...{![]()
貪吃蛇V1.0 //trace("計時器:"+_sec);![]()
貪吃蛇V1.0 _sec++;![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 if(_sec>60)...{![]()
貪吃蛇V1.0 _min++;![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 if(_min<10)...{![]()
貪吃蛇V1.0 min_mc.text = "0"+_min.toString();![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 else...{![]()
貪吃蛇V1.0 min_mc.text=_min.toString() ;![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 _sec=0 ;![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 if(_sec<10)...{![]()
貪吃蛇V1.0 sec_mc.text ="0"+_sec.toString() ;![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 }else...{![]()
貪吃蛇V1.0 sec_mc.text=_sec.toString() ;![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 }
四:節點,也叫食物
package com.lux![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ... {![]()
貪吃蛇V1.0 import flash.display.MovieClip;![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 public class XiaoShe extends MovieClip...{![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 //蛇的方向![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 ![]()
貪吃蛇V1.0 public function XiaoShe(x:Number,y:Number)...{![]()
貪吃蛇V1.0 super();![]()
貪吃蛇V1.0 this.x = x ;![]()
貪吃蛇V1.0 this.y = y ;![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0 }![]()
貪吃蛇V1.0