AS3 张伟

来源:互联网 发布:企业网站做优化 编辑:程序博客网 时间:2024/04/28 17:39
package{import flash.display.Sprite;import flash.events.Event;import flash.events.KeyboardEvent;import flash.events.TimerEvent;import flash.geom.Point;import flash.ui.Keyboard;import flash.utils.Timer;/** * 这只是个贪食蛇游戏而已~ * @author flashZero *  */[SWF(width="800",height="600")]public class SnakeGame extends Sprite{/** * 食物  */private var food:Cell;/** * 蛇 *///private var snake:Vector.<Cell>;private var timer:Timer;/** * 刷新速度 */private var timeSpeed:Number=150;//蛇的容器private var snakeContainer:Sprite;//食物容器private var foodContainer:Sprite;//行数private const ROW:int=20;//列数private const LINE:int=15;//方框间距private const DISTANCE:int=30;//静止按的keyCodeprivate var forbidKeyCode:int;private var snake:Snake;public function SnakeGame(){if(stage)init();else this.addEventListener(Event.ADDED_TO_STAGE,init)}private function init(event:Event=null):void{this.removeEventListener(Event.ADDED_TO_STAGE,init);drawGrid();addChild(snakeContainer=new Sprite);addChild(foodContainer=new Sprite());initSnake();drawSnake();food=createFood();drawFood();stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDownHandler);timer=new Timer(timeSpeed);timer.addEventListener(TimerEvent.TIMER,onTimerHandler);timer.start();}/** * 画个食物在食物容器上,好让snake去吃个饱 *  */private function drawFood():void{// TODO Auto Generated method stubfoodContainer.graphics.clear();foodContainer.graphics.beginFill(0xff0000);foodContainer.graphics.drawRect(food.x,food.y,DISTANCE,DISTANCE);foodContainer.graphics.endFill();}/** * 创造一个蛇的食物来让蛇变得更长= =|| * @return 一个蛇的cell *  */private function createFood():Cell{// TODO Auto Generated method stubvar tx:Number;var ty:Number;//判断一下生成的位置是否在蛇身上,//假如有的话直接跳出false掉,再来一次//当检查了所有之后,冇问题了,就返回一个食物吧!while(true){var r:Boolean=true;tx=Math.floor(Math.random()*ROW)*DISTANCE;ty=Math.floor(Math.random()*LINE)*DISTANCE;var len:int=snake.cells.length;for(var i:int=0;i<len;i++){var c:Cell=snake.cells[i];if(c.x==tx&&c.y==ty){r=false;break;}}if(r)break;}return new Cell(tx,ty);}protected function onTimerHandler(event:TimerEvent):void{moveSnake();drawSnake();}/** * 移动蛇 *  */private function moveSnake():void{// TODO Auto Generated method stubsnake.changeDirection();var vx:Number=snake.vx;var vy:Number=snake.vy;//蛇头var head:Cell=snake.cells[0];//蛇头将要移动的x轴坐标var tx:Number=head.x+(vx*DISTANCE);//蛇头将要移动的y轴坐标var ty:Number=head.y+(vy*DISTANCE);//判断一下蛇头有没有撞墙和撞到自己了if(check(tx,ty)){//判断吃了食物没有if(checkEatFood(tx,ty)){snake.cells.unshift(food);food=createFood();drawFood();return;}snake.move(tx,ty);}else{timer.stop();return;}}/** *检查蛇头吃了食物没有  * @param tx * @param ty * @return  *  */private function checkEatFood(tx:Number,ty:Number):Boolean{// TODO Auto Generated method stubif(food.x==tx&&food.y==ty)return true;return false;}/** *检查撞到东东没有  * @param tx x坐标 * @param ty y坐标 * @return  *  */private function check(tx:Number,ty:Number):Boolean{// TODO Auto Generated method stubif(tx<0||ty<0||tx>DISTANCE*(ROW-1)||ty>DISTANCE*(LINE-1))return false;var len:int=snake.cells.length;for(var i:int=1;i<len;i++){if(tx==snake.cells[i].x&&ty==snake.cells[i].y)return false;}return true;}protected function onKeyDownHandler(event:KeyboardEvent):void{// TODO Auto-generated method stubvar kc:uint=event.keyCode;//这个判断是防止自己撞自己了if(forbidKeyCode==kc||kc==snake.direction)return;switch(kc){case Keyboard.UP:snake.direction=Snake.UP;forbidKeyCode=Snake.DOWN;break;case Keyboard.DOWN:snake.direction=Snake.DOWN;forbidKeyCode=Snake.UP;break;case Keyboard.LEFT:snake.direction=Snake.LEFT;forbidKeyCode=Snake.RIGHT;break;case Keyboard.RIGHT:snake.direction=Snake.RIGHT;forbidKeyCode=Snake.LEFT;break;}}/** *用来画蛇的方法来的!!  *  */private function drawSnake():void{// TODO Auto Generated method stubsnakeContainer.graphics.clear();snakeContainer.graphics.beginFill(0x00ff00,1);var snakeLen:int=snake.cells.length;for(var i:int=0;i<snakeLen;i++){var c:Cell=this.snake.cells[i];snakeContainer.graphics.drawRect(c.x,c.y,DISTANCE,DISTANCE);}snakeContainer.graphics.endFill();}private function initSnake():void{// TODO Auto Generated method stubif(!this.snake)this.snake=new Snake(Snake.RIGHT);for(var i:int=5;i>0;i--){var c:Cell=new Cell((i-1)*DISTANCE,0);snake.cells.push(c);}forbidKeyCode=Snake.LEFT;}private function drawGrid():void{// TODO Auto Generated method stubthis.graphics.lineStyle(.5,0);for(var i:int=0;i<ROW;i++){for(var j:int=0;j<LINE;j++){this.graphics.drawRect(i*DISTANCE,j*DISTANCE,DISTANCE,DISTANCE);}}this.graphics.endFill();}}}import flash.geom.Point;class Cell{public var x:Number;public var y:Number;public function Cell(x:Number,y:Number){this.x=x;this.y=y;}}class Snake{import flash.ui.Keyboard;public var cells:Vector.<Cell>;private var _direction:int;private var _vx:int;private var _vy:int;public static const LEFT:int=Keyboard.LEFT;//public static const RIGHT:int=Keyboard.RIGHT;//public static const UP:int=Keyboard.UP;//public static const DOWN:int=Keyboard.DOWN;public function Snake(direction:int){cells=new Vector.<Cell>();this._direction=direction;}public function changeDirection():void{switch(_direction){case LEFT:_vx=-1;_vy=0;break;case RIGHT:_vx=1;_vy=0;break;case UP:_vx=0;_vy=-1;break;case DOWN:_vx=0;_vy=1;break;}}public function get vx():int{return this._vx;}public function get vy():int{return this._vy;}public function set direction(value:int):void{this._direction=value;}public function get direction():int{return this._direction;}public function move(x:Number,y:Number):void{//蛇头var head:Cell=this.cells[0];//用来记录一个旧的point点,用于移动蛇的身体var op:Point=new Point(head.x,head.y);//更新蛇头的位置head.x=x;head.y=y;//蛇的长度var len:int=this.cells.length;//陆续将蛇的身体一个一个地搬家for(var i:int=1;i<len;i++){var tp:Point=new Point(cells[i].x,cells[i].y);cells[i].x=op.x;cells[i].y=op.y;op=tp;tp=null;}}}

0 0
原创粉丝点击