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;
}
}
}
AS3 张伟
最新推荐文章于 2022-05-12 10:13:52 发布