AS3 张伟

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;

		//静止按的keyCode
		private 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 stub
			foodContainer.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 stub
			var 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 stub
			snake.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 stub
			if(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 stub
			if(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 stub
			var 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 stub

		
			snakeContainer.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 stub
			if(!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 stub
			this.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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值