200行AS代码的贪食蛇

0点看完春晚,表示太兴奋,睡不着。于是就想找点事情做嘛。于是顺手就打开了flash ide,想着,其实自己进入游戏行业的时候,根本就不是从简入深的做,一开始就做联机游戏demo了(虽然很失败)。貌似简单的贪食蛇啊,俄罗斯方块的都没做过。 还觉得自己可能连贪食蛇都写不出来呢(笑)

于是写着写着就写出来了 =。= ,写了半个小时就写完了。 于是果断加点注释,做个教程好了。

【鼠标点击一下网格,之后只要移动方向键吃食物就好啦。(可穿墙,自己碰到自己游戏失败)】

以下代码只要打开flash ide 创建一个as3 的fla文件,复制到第一帧上就能用啦。

[cc lang=”actionscript3″ nowrap=”false”]
import flash.display.Sprite;
import flash.events.KeyboardEvent;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.geom.Point;
import flash.text.TextField;

var peace:int = 10;//区块大小(地图网格,蛇身,食物)
var player:Sprite; // 蛇头
var playerPoint:Array = []; // 蛇头坐标
var snake:Array = []; //蛇身数组
var direction:String; //初始化移动方向
var bg:Sprite; //背景网格
var timer:Timer = new Timer(100); //游戏render
var seed:Timer = new Timer(2000); //食物创建计时器
var square:Sprite; //食物,蛇 容器
var foods:int; //食物
var score:int; //分数

init();

function init():void //游戏初始化
{
bg=new Sprite();
square=new Sprite();
player=new Sprite();
direction=”right”;
score=0;
foods=0;

for (var i:int=0; i<30; i++) //绘制30*30的网格 { for (var j:int=0; j<30; j++) { bg.graphics.lineStyle(1,0x000000); bg.graphics.drawRect(i*peace,j*peace,peace,peace); bg.graphics.endFill(); } } addChild(square); addChild(bg); player=makeBody(0x00ffff);//绘制蛇头 square.addChild(player); snake[0] = player; for (var len:int=0; len<1; len++)//创建初始蛇身 { var body = makeBody(); square.addChild(body); snake.push(body); } timer.start(); timer.addEventListener(TimerEvent.TIMER,onTimer); seed.start(); seed.addEventListener(TimerEvent.TIMER,onSeed); stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDown); } function gameOver():void //游戏结束 { timer.stop(); timer.removeEventListener(TimerEvent.TIMER,onTimer); seed.stop(); seed.removeEventListener(TimerEvent.TIMER,onSeed); snake=[]; playerPoint=[]; removeChild(bg); bg=null; removeChild(square); square=null; var tf:TextField=new TextField(); tf.selectable=false; tf.multiline=true; tf.width=120; tf.text="游戏结束~r得分:"+score+"r按空格键开始新游戏"; addChild(tf); } function makeFood():Sprite//创建食物 { var food:Sprite=new Sprite(); food.graphics.beginFill(0xff0000); food.graphics.drawRect(0,0,peace,peace); food.graphics.endFill(); food.name = "food"; return food; } function makeBody(color:uint=0x000000):Sprite//创建蛇身 { var body:Sprite=new Sprite(); body.graphics.beginFill(color); body.graphics.drawRect(0,0,peace,peace); body.graphics.endFill(); body.name = "body"; return body; } function onTimer(e:TimerEvent):void { for (var j:int=0; j= snake.length)playerPoint.splice(0,1);//节省内存,只保留蛇身相同长度的蛇头移动坐标记录

if (player.x > bg.width-peace)//边界判断
{
player.x = 0;
}else if (player.x<0) { player.x = bg.width-peace; } if (player.y > bg.height-peace)//边界判断
{
player.y = 0;
}else if (player.y<0) { player.y = bg.height-peace; } playerPoint.push(new Point(player.x,player.y));//将蛇头新坐标放进蛇头坐标数组 for (var i:int=1; i<=snake.length-1; i++)//蛇身跟着蛇头(延迟1步)移动 { var loc:Point = playerPoint[playerPoint.length - i - 1] as Point; if (loc==null)return; snake[i].x = loc.x; snake[i].y = loc.y; } } function onSeed(e:TimerEvent):void//创建食物计时器 { if (foods < 3)//当场景上的食物总数小于3,才创建新的食物 { var food = makeFood(); food.x = Math.floor(Math.random() * 30) * peace; food.y = Math.floor(Math.random() * 30) * peace; square.addChild(food); foods++; } } function keyDown(e:KeyboardEvent):void//键盘按键监听 { switch (e.keyCode) { case 37 : direction=direction=="right"?"right":"left"; break; case 38 : direction=direction=="down"?"down":"up"; break; case 39 : direction=direction=="left"?"left":"right"; break; case 40 : direction=direction=="up"?"up":"down"; break; case 32: while(this.numChildren) { removeChild(this.getChildAt(0)); } init(); break; } } [/cc]

发表评论

电子邮件地址不会被公开。 必填项已用*标注