iptton 发表于 2006-5-28 20:44

Flash贪吃蛇游戏

修正星幻提的BUG

很简单的游戏:(不过完全是自己编的,成就感)

swf   和fla文件:


http://www.flashbao.com/bbs/UploadFile/2006-6/20066417453532329.rar

main.fla

第一帧:actionScrtpt(注释一起发了……)
/**************************************
*      DesignedBy   iptton@gmail.com
*
*
*      Code By iptton@gmail.com
*
*                           Pan's Studio
*                              2006/5/26
*****************************************/
/*
数据结构:循环链表:
      
算法: 每移动一次 {
                        如果(当前前进位置没有豆){
表尾的数据改变为表头加前进差数;
头指针指向尾部;
}否则{
插入,并头指针指向新元素;
}
                }

图形绘制:        1、FLASH绘图API
                        2、MC的attach
                        3、MC的隐显(预先排列好,并设为不可见)

备忘录:图形绘制中哪个更好 内存的占用哪个更低(上MM主页查看关于MC结构的内容)

MC:            空MC两个 beansnake
bean snake 顾名思义……

wallMC,透明,占有空间为蛇所能生存的区域。(本想做成真正意义上的wall不过遇到点小问题,
                                          不想在这上面花时间就改了,有点名不副实了……)
*/
/*详细设计


主要变量及函数:
SSetInterval();用于控制 蛇按一定间隔时间移动,

interval:前进时间间隔
SIZE:每节蛇的大小(等宽长)
point:指针
head:头指针
tail:尾指针
    pos 位置,拟用整数表示,下称伪坐标,直观。绘图前再做转换。
curLen当前蛇的长度
point[]指针


creatList()链表初始化
listAddElem()添加元素
chHead()头指针指向尾指针所在数据,尾指针指向原尾针之前的数据

绘图:(API式)
drawSnake(x,y,i):画一节蛇,i为0时抹掉
realX(x)将伪坐标变为真实的坐标
realY(y)将伪坐标变为真实的坐标

判断:
处理入口:go()
键盘响应:用Key类
“吃豆”:bean.hitTest(x,y)
障碍判断:wall.hitTest(x,y)
*/
/*
   豆的生成

采用蛇的生成函数,改变着色。
   
*/
/*扩展功能:
级别:
称动速度,障碍。

保存成绩
供用户选择的玩法:1、蛇的长度是否在升级后变成初始态
2、易难度的选择
*/
stop();
//本
oKey = new Object();
_global.dir = 1;
//0 RIGHT   1 UP    3 LEFT   2 DOWN
_global.XX = 30;
_root.createEmptyMovieClip("wall", -1);
_root.wall._x = _global.XX;
_root.wall._y = _global.XX;
_global.bChDir = true;
with (_root.wall)
{
        lineStyle(1, 0x001399);
        beginFill(0x666666, 50);
        moveTo(0, 0);
        lineTo(480, 0);
        lineTo(480, 320);
        lineTo(0, 320);
        endFill();
}
_global.WIDTH = _root.wall._width / 10;
_global.HEIGHT = _root.wall._height / 10;
_global.SIZE = 9;
_global.MAXLEN = 30;
_global.head = 0;
_global.curLen = 5;
_global.tail = curLen - 1;
_global.point = new Array(MAXLEN);
_global.pos = new Array(MAXLEN);
_global.ate = true;
_global.timer;
_global.interval = 100;
_root.createEmptyMovieClip("snake", 1);
snake._x = _global.XX;
snake._y = _global.XX;
_root.createEmptyMovieClip("bean", 2);
bean._x = _global.XX;
bean._y = _global.XX;
/*========================================*/
/*开始链表操作   开始*/
function creatList()
{
        for (i = 0; i < _global.curLen; i++)
        {
                _global.pos = new p2d(10, i + 9);
                _global.point = i + 1;
                //trace("X:"+_global.pos.x+"Y:"+_global.pos.y)
                //trace("Point to:"+_global.point);
        }
        //trace(_global.point);
        _global.point = head;
        //trace(_global.point);
}
function listAddElem(tmp:p2d)
{
        //trace("Enter Add Elem FUNCTION");
        _global.curLen++;
        if (_global.curLen >= MAXLEN)
        {
                win();
        }
        lTmp = _global.curLen - 1;
        _global.pos = tmp;
        hTmp = _global.head;
        _global.head = lTmp;
        _global.point = hTmp;
        _global.point = _global.head;
}
function chHead()
{
        _global.head = _global.tail;
        //设置新头位
        this.tmpa = _global.point;
        while (1)
        {
                this.tmpa = _global.point;
                if (_global.point == _global.tail)
                {
                        _global.tail = this.tmpa;
                        break;
                }
                //设置新的尾位      
        }
}
/*结束链表操作结束*/
/*========================================*/
function SSetInterval(time)
{
        _global.timer = setInterval(go, time);
}
function drawOneDot(ptx, pty, MC)
{
        ptx = ptx * _global.SIZE;
        pty = pty * _global.SIZE;
        with (MC)
        {
                lineStyle(1, 0xffff00);
                var s = _global.SIZE;
                moveTo(ptx + 2, pty + 2);
                beginFill(0xff0000, 90);
                lineTo(ptx + s - 2, pty + 2);
                lineTo(ptx + s - 2, pty + s - 2);
                lineTo(ptx + 2, pty + s - 2);
                endFill();
                //trace("DRAWED"+MC._name+" "+ptx+""+ pty+" "+(ptx+s)+" "+(pty +s));
        }
}
function reDrawSnakes()
{
        snake.clear();
        tmp = _global.head;
        for (i = 0; i < curLen; i++)
        {
                drawOneDot(_global.pos.x, _global.pos.y, _root.snake);
                //trace("In ReDraw FUNCTION :tmp=" + tmp);
                tmp = _global.point;
        }
}
function crtBean()
{
        x = Math.round(Math.random() * _global.WIDTH);
        y = Math.round(Math.random() * _global.HEIGHT);
        _root.bean._alpha = 50;
        drawOneDot(x, y, _root.bean);
}
function go()
{
        //trace("go!");
        if (_global.ate)
        {
                crtBean();
                _global.ate = false;
        }
        var dx, dy;
        switch (_global.dir)
        {
        case 0 :
                dx = 1;
                dy = 0;
               
                break;
                //Right
        case 3 :
                dx = -1;
                dy = 0;
               
                break;
                //left
        case 1 :
                dx = 0;
                dy = -1;
               
                break;
                //up
        case 2 :
                dx = 0;
                dy = 1;
               
                break;
                //down
        default :
                /*dx = 0;
                dy = -1;
                _global.bChDir = !_global.bChDir;*/
                break;
        }
        //trace(dx+""+dy);
        dx += _global.pos.x;
        dy += _global.pos.y;
        for (i = 0; i < _global.curLen; i++)
        {
                if (dx == _global.pos.x && dy == _global.pos.y)
                {
                        trace("Eating Self!!");
                        lose();
                }
        }
        //此处……,本想用hitTest的,没想到MM的hitTest方法是最简单的取图形的两点做距形为响应区。。。
        tmpx = _global.XX + dx * _global.SIZE + _global.SIZE / 2;
        tmpy = _global.XX + dy * _global.SIZE + _global.SIZE / 2;
        if (!_root.wall.hitTest(tmpx, tmpy))
        {
                trace("Hit wall!!");
                lose();
        } else
        {
                if (_root.bean.hitTest(tmpx, tmpy))
                {
                        _global.ate = true;
                        _root.bean.clear();
                        tmpP = new p2d(dx, dy);
                        listAddElem(tmpP);
                        _global.bChDir=true;
                        reDrawSnakes();
                } else
                {
                        _global.pos.x = dx;
                        _global.pos.y = dy;
                       
                        chHead();_global.bChDir=true;
                        reDrawSnakes();
                       
                }
        }
}
oKey.onKeyDown = function()
{
        trace("bChDir="+_global.bChDir);
        if (_global.bChDir)
        {
               
                if (Key.getCode() == Key.RIGHT)
                {
                        _global.bChDir = !_global.bChDir;
                        _global.dir = (_global.dir == 3) ? 3 : 0;
                } else if (Key.getCode() == Key.LEFT)
                {
                        _global.bChDir = !_global.bChDir;
                        _global.dir = (_global.dir == 0) ? 0 : 3;
                } else if (Key.getCode() == Key.UP)
                {
                        _global.bChDir = !_global.bChDir;
                        _global.dir = (_global.dir == 2) ? 2 : 1;
                } else if (Key.getCode() == Key.DOWN)
                {
                        _global.bChDir = !_global.bChDir;
                        _global.dir = (_global.dir == 1) ? 1 : 2;
                }
        }
};
function lose()
{
        clearInterval(timer);
        trace("YOU LOSE");
        startT.text = "YOU LOSE!! Press Any Key To Restart";
        _root.play();
}
function win()
{
        clearInterval(timer);
        startT.text = "You Win!! Press Any Key To Restart";
        _root.play();
}
function startGame()
{
        startT.text = "Press Any Key To BEGIN!为了保证纯AS不设按钮。。。";
        creatList();
        reDrawSnakes();
        SSetInterval(_global.interval);
        Key.addListener(oKey);
}
var enterB:Object = new Object();
enterB.onKeyDown = function()
{
        startGame();
        Key.removeListener(this);
};
Key.addListener(enterB);
_root.createTextField("startT", _root.getNextHighestDepth(), 30, 0, 400, 90);
startT.text = "Press Any Key To BEGIN!为了保证纯AS。。。";


每二帧

stop();
var enterA:Object = new Object();
enterA.onKeyDown = function()
{
        play();
        Key.removeListener(this);
};
Key.addListener(enterA);


p2d.as
此文件要设好FLASH中的    编辑/首选参数/ActionScript/ActionScript2.0设置 增加路径为此文件的路径

class p2d {
        public var x:Number;
        public var y:Number;
        public function p2d (x, y) {
                //trace ("Enter Structor");
                this.x = x;
                this.y = y;
        }
}

[ 本帖最后由 iptton 于 2006-8-29 20:04 编辑 ]

hjack 发表于 2006-5-28 20:57

及及。。。

不错,不知可不可以和大家分享一下呢

iptton 发表于 2006-5-28 21:06

源文件:只上传了main.fla
http://www.flashbao.com/flashfile/纯AS版贪吃蛇.fla

[ 本帖最后由 iptton 于 2006-6-2 18:49 编辑 ]

Monkeylee 发表于 2006-5-28 23:44

两年前做的Flashgame
https://www.gdutbbs.com/thread-52020-2-1.html
那时刚出FlashMX2004, 不过用的还是旧的Actionscript 1.0

[ 本帖最后由 Monkeylee 于 2006-5-28 23:46 编辑 ]

hjack 发表于 2006-5-29 00:04

加了个精华,期待楼主更多的作品。。。

wool王 发表于 2006-5-29 00:30

原帖由 Monkeylee 于 2006/5/28 15:44 发表
两年前做的Flashgame
https://www.gdutbbs.com/thread-52020-2-1.html
那时刚出FlashMX2004, 不过用的还是旧的Actionscript 1.0

你另外开张帖子吧,贴埋源码出来分享下心得。

本版现在很缺精华贴啊。。。

iptton 发表于 2006-5-29 01:27

之所以写成纯AS版是想方便于移到其它语言    因为其它工具一般没有类似MC的东东

[ 本帖最后由 iptton 于 2006-5-29 01:29 编辑 ]

iptton 发表于 2006-5-29 01:39

原帖由 Monkeylee 于 2006-5-28 23:44 发表
两年前做的Flashgame
https://www.gdutbbs.com/thread-52020-2-1.html
那时刚出FlashMX2004, 不过用的还是旧的Actionscript 1.0

不知算法和我的有什么不同?分享下……源码……

Monkeylee 发表于 2006-5-29 13:03

源码在家里的机子上...现在文件好像下载不了, 打不开....wool那里还有没有, 传个backup上来.

主要是用了简单的hitTest判断碰撞, 控制方便用鼠标, 写了个简单的缓冲函数来移动, 敌机方面仅是简单的setInterval产生随机的敌机, 击中对象后随机产生bonus...

iptton 发表于 2006-5-29 13:20

原来是雷电之类的飞机游戏呀    不过EXE可以转回SWF的,再用精灵转FLA

不过,现在连EXE都没有……

Monkeylee 发表于 2006-5-29 13:46

其实当时刚接触到一个隐藏类ASBroadcast, 一时兴趣就写了这么个游戏.

ASBroadcast可以看我以前写的一个例子
http://www.flashempire.net/showpost.php?p=1164514&postcount=46

现在好像已经作为公开的类了...其实写Flash Actionscript没必要去对隐藏类做什么研究, 都不成熟的..

[ 本帖最后由 Monkeylee 于 2006-5-29 13:48 编辑 ]

iptton 发表于 2006-5-29 13:49

偶用AS学编程……并非真想在FLASH上深入研究……   

所有类,都自己写……

目前想写个3D引擎……    不过恐怕要很久……

Monkeylee 发表于 2006-5-29 14:00

维艺上面很早就有3D引擎了, 可以参考一上. 偶也两年没碰Flash Actionscript了, 咔咔....DotNet Coder.

iptton 发表于 2006-5-29 14:08

我知道呀

不过,想自己做,从中应该可以学到很多东西

星幻 发表于 2006-6-3 09:22

好像有点bug喔……

当我正在前进时,很快的按下后或者上后,就会出现失败了

iptton 发表于 2006-6-3 19:23

BUG 修正了

原有BUG:同时按下左后或右后会直接输

加了个判断

应该可以了

iptton 发表于 2006-9-14 12:27

着手面向对象化。。。

发现难度不小。。。

完全没有真正的面向对象编程经验
页: [1]
查看完整版本: Flash贪吃蛇游戏