天天看點

貪吃蛇V1.0

貪吃蛇遊戲開發詳解

注意以下問題:

1.蛇移動算法。

蛇所有節點存放到數組。每次移動的時候。把節點的坐标設為其前面節點的坐标。最後在把頭的坐标往前移動。坐标一直在往前移。

2.随機生成食物時,在蛇蛇身上時候,要重新生成(遞歸調用)。

3.把遊戲區域分成若幹個網格,蛇移動距離為網格單元大小,食物生成在網格中。

點選此試玩遊戲(csdn伺服器太垃圾。多重新整理幾次)

點選下載下傳源代碼

 代碼如小:

一:遊戲開始

貪吃蛇V1.0
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
}

繼續閱讀