工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 5055|回复: 16

Flash贪吃蛇游戏

[复制链接]
发表于 2006-5-28 20:44 | 显示全部楼层 |阅读模式
修正星幻提的BUG

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

swf   和  fla  文件:


http://www.flashbao.com/bbs/Uplo ... 066417453532329.rar

main.fla

第一帧:actionScrtpt(注释一起发了……)
  1. /**************************************
  2. *      Designed  By   [email protected]
  3. *
  4. *
  5. *      Code By [email protected]
  6. *
  7. *                             Pan's Studio
  8. *                              2006/5/26
  9. *****************************************/
  10. /*
  11. 数据结构:循环链表:
  12.       
  13. 算法: 每移动一次 {
  14.                         如果(当前前进位置没有豆){
  15. 表尾的数据改变为表头加前进差数;
  16. 头指针指向尾部;
  17. }否则{
  18. 插入,并头指针指向新元素;
  19. }
  20.                   }

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

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

  25. MC:            空MC两个 bean  snake
  26. bean snake 顾名思义……

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


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

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


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

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

  48. 判断:
  49. 处理入口:go()
  50. 键盘响应:用Key类
  51. “吃豆”:bean.hitTest(x,y)
  52. 障碍判断:wall.hitTest(x,y)
  53. */
  54. /*
  55.    豆的生成
  56.   
  57. 采用蛇的生成函数,改变着色。
  58.    
  59. */
  60. /*扩展功能:
  61. 级别:
  62. 称动速度,障碍。

  63. 保存成绩
  64. 供用户选择的玩法:1、蛇的长度是否在升级后变成初始态
  65. 2、易难度的选择
  66. */
  67. stop();
  68. //本
  69. oKey = new Object();
  70. _global.dir = 1;
  71. //0 RIGHT   1 UP    3 LEFT   2 DOWN
  72. _global.XX = 30;
  73. _root.createEmptyMovieClip("wall", -1);
  74. _root.wall._x = _global.XX;
  75. _root.wall._y = _global.XX;
  76. _global.bChDir = true;
  77. with (_root.wall)
  78. {
  79.         lineStyle(1, 0x001399);
  80.         beginFill(0x666666, 50);
  81.         moveTo(0, 0);
  82.         lineTo(480, 0);
  83.         lineTo(480, 320);
  84.         lineTo(0, 320);
  85.         endFill();
  86. }
  87. _global.WIDTH = _root.wall._width / 10;
  88. _global.HEIGHT = _root.wall._height / 10;
  89. _global.SIZE = 9;
  90. _global.MAXLEN = 30;
  91. _global.head = 0;
  92. _global.curLen = 5;
  93. _global.tail = curLen - 1;
  94. _global.point = new Array(MAXLEN);
  95. _global.pos = new Array(MAXLEN);
  96. _global.ate = true;
  97. _global.timer;
  98. _global.interval = 100;
  99. _root.createEmptyMovieClip("snake", 1);
  100. snake._x = _global.XX;
  101. snake._y = _global.XX;
  102. _root.createEmptyMovieClip("bean", 2);
  103. bean._x = _global.XX;
  104. bean._y = _global.XX;
  105. /*========================================*/
  106. /*  开始  链表操作   开始*/
  107. function creatList()
  108. {
  109.         for (i = 0; i < _global.curLen; i++)
  110.         {
  111.                 _global.pos[i] = new p2d(10, i + 9);
  112.                 _global.point[i] = i + 1;
  113.                 //trace("X:"+_global.pos[i].x+"Y:"+_global.pos[i].y)
  114.                 //trace("Point to:"+_global.point[i]);
  115.         }
  116.         //trace(_global.point[3]);
  117.         _global.point[_global.tail] = head;
  118.         //trace(_global.point[4]);
  119. }
  120. function listAddElem(tmp:p2d)
  121. {
  122.         //trace("Enter Add Elem FUNCTION");
  123.         _global.curLen++;
  124.         if (_global.curLen >= MAXLEN)
  125.         {
  126.                 win();
  127.         }
  128.         lTmp = _global.curLen - 1;
  129.         _global.pos[lTmp] = tmp;
  130.         hTmp = _global.head;
  131.         _global.head = lTmp;
  132.         _global.point[head] = hTmp;
  133.         _global.point[tail] = _global.head;
  134. }
  135. function chHead()
  136. {
  137.         _global.head = _global.tail;
  138.         //设置新头位
  139.         this.tmpa = _global.point[head];
  140.         while (1)
  141.         {
  142.                 this.tmpa = _global.point[this.tmpa];
  143.                 if (_global.point[this.tmpa] == _global.tail)
  144.                 {
  145.                         _global.tail = this.tmpa;
  146.                         break;
  147.                 }
  148.                 //设置新的尾位      
  149.         }
  150. }
  151. /*  结束  链表操作  结束*/
  152. /*========================================*/
  153. function SSetInterval(time)
  154. {
  155.         _global.timer = setInterval(go, time);
  156. }
  157. function drawOneDot(ptx, pty, MC)
  158. {
  159.         ptx = ptx * _global.SIZE;
  160.         pty = pty * _global.SIZE;
  161.         with (MC)
  162.         {
  163.                 lineStyle(1, 0xffff00);
  164.                 var s = _global.SIZE;
  165.                 moveTo(ptx + 2, pty + 2);
  166.                 beginFill(0xff0000, 90);
  167.                 lineTo(ptx + s - 2, pty + 2);
  168.                 lineTo(ptx + s - 2, pty + s - 2);
  169.                 lineTo(ptx + 2, pty + s - 2);
  170.                 endFill();
  171.                 //trace("DRAWED"+MC._name+" "+ptx+"  "+ pty+" "+(ptx+s)+" "+(pty +s));
  172.         }
  173. }
  174. function reDrawSnakes()
  175. {
  176.         snake.clear();
  177.         tmp = _global.head;
  178.         for (i = 0; i < curLen; i++)
  179.         {
  180.                 drawOneDot(_global.pos[tmp].x, _global.pos[tmp].y, _root.snake);
  181.                 //trace("In ReDraw FUNCTION :tmp=" + tmp);
  182.                 tmp = _global.point[tmp];
  183.         }
  184. }
  185. function crtBean()
  186. {
  187.         x = Math.round(Math.random() * _global.WIDTH);
  188.         y = Math.round(Math.random() * _global.HEIGHT);
  189.         _root.bean._alpha = 50;
  190.         drawOneDot(x, y, _root.bean);
  191. }
  192. function go()
  193. {
  194.         //trace("go!");
  195.         if (_global.ate)
  196.         {
  197.                 crtBean();
  198.                 _global.ate = false;
  199.         }
  200.         var dx, dy;
  201.         switch (_global.dir)
  202.         {
  203.         case 0 :
  204.                 dx = 1;
  205.                 dy = 0;
  206.                
  207.                 break;
  208.                 //Right
  209.         case 3 :
  210.                 dx = -1;
  211.                 dy = 0;
  212.                
  213.                 break;
  214.                 //left
  215.         case 1 :
  216.                 dx = 0;
  217.                 dy = -1;
  218.                
  219.                 break;
  220.                 //up
  221.         case 2 :
  222.                 dx = 0;
  223.                 dy = 1;
  224.                
  225.                 break;
  226.                 //down
  227.         default :
  228.                 /*dx = 0;
  229.                 dy = -1;
  230.                 _global.bChDir = !_global.bChDir;*/
  231.                 break;
  232.         }
  233.         //trace(dx+"  "+dy);
  234.         dx += _global.pos[_global.head].x;
  235.         dy += _global.pos[_global.head].y;
  236.         for (i = 0; i < _global.curLen; i++)
  237.         {
  238.                 if (dx == _global.pos[i].x && dy == _global.pos[i].y)
  239.                 {
  240.                         trace("Eating Self!!");
  241.                         lose();
  242.                 }
  243.         }
  244.         //此处……,本想用hitTest的,没想到MM的hitTest方法是最简单的取图形的两点做距形为响应区。。。
  245.         tmpx = _global.XX + dx * _global.SIZE + _global.SIZE / 2;
  246.         tmpy = _global.XX + dy * _global.SIZE + _global.SIZE / 2;
  247.         if (!_root.wall.hitTest(tmpx, tmpy))
  248.         {
  249.                 trace("Hit wall!!");
  250.                 lose();
  251.         } else
  252.         {
  253.                 if (_root.bean.hitTest(tmpx, tmpy))
  254.                 {
  255.                         _global.ate = true;
  256.                         _root.bean.clear();
  257.                         tmpP = new p2d(dx, dy);
  258.                         listAddElem(tmpP);
  259.                         _global.bChDir=true;
  260.                         reDrawSnakes();
  261.                 } else
  262.                 {
  263.                         _global.pos[_global.tail].x = dx;
  264.                         _global.pos[_global.tail].y = dy;
  265.                        
  266.                         chHead();_global.bChDir=true;
  267.                         reDrawSnakes();
  268.                        
  269.                 }
  270.         }
  271. }
  272. oKey.onKeyDown = function()
  273. {
  274.         trace("bChDir="+_global.bChDir);
  275.         if (_global.bChDir)
  276.         {
  277.                
  278.                 if (Key.getCode() == Key.RIGHT)
  279.                 {
  280.                         _global.bChDir = !_global.bChDir;
  281.                         _global.dir = (_global.dir == 3) ? 3 : 0;
  282.                 } else if (Key.getCode() == Key.LEFT)
  283.                 {
  284.                         _global.bChDir = !_global.bChDir;
  285.                         _global.dir = (_global.dir == 0) ? 0 : 3;
  286.                 } else if (Key.getCode() == Key.UP)
  287.                 {
  288.                         _global.bChDir = !_global.bChDir;
  289.                         _global.dir = (_global.dir == 2) ? 2 : 1;
  290.                 } else if (Key.getCode() == Key.DOWN)
  291.                 {
  292.                         _global.bChDir = !_global.bChDir;
  293.                         _global.dir = (_global.dir == 1) ? 1 : 2;
  294.                 }
  295.         }
  296. };
  297. function lose()
  298. {
  299.         clearInterval(timer);
  300.         trace("YOU LOSE");
  301.         startT.text = "YOU LOSE!! Press Any Key To Restart";
  302.         _root.play();
  303. }
  304. function win()
  305. {
  306.         clearInterval(timer);
  307.         startT.text = "You Win!! Press Any Key To Restart";
  308.         _root.play();
  309. }
  310. function startGame()
  311. {
  312.         startT.text = "Press Any Key To BEGIN!为了保证纯AS不设按钮。。。";
  313.         creatList();
  314.         reDrawSnakes();
  315.         SSetInterval(_global.interval);
  316.         Key.addListener(oKey);
  317. }
  318. var enterB:Object = new Object();
  319. enterB.onKeyDown = function()
  320. {
  321.         startGame();
  322.         Key.removeListener(this);
  323. };
  324. Key.addListener(enterB);
  325. _root.createTextField("startT", _root.getNextHighestDepth(), 30, 0, 400, 90);
  326. startT.text = "Press Any Key To BEGIN!为了保证纯AS。。。";
复制代码


每二帧

  1. stop();
  2. var enterA:Object = new Object();
  3. enterA.onKeyDown = function()
  4. {
  5.         play();
  6.         Key.removeListener(this);
  7. };
  8. Key.addListener(enterA);
复制代码



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

  1. class p2d {
  2.         public var x:Number;
  3.         public var y:Number;
  4.         public function p2d (x, y) {
  5.                 //trace ("Enter Structor");
  6.                 this.x = x;
  7.                 this.y = y;
  8.         }
  9. }
复制代码

[ 本帖最后由 iptton 于 2006-8-29 20:04 编辑 ]
发表于 2006-5-28 20:57 | 显示全部楼层
及及。。。

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

使用道具 举报

 楼主| 发表于 2006-5-28 21:06 | 显示全部楼层
源文件:只上传了main.fla  
http://www.flashbao.com/flashfile/纯AS版贪吃蛇.fla

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

使用道具 举报

发表于 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 编辑 ]
回复

使用道具 举报

发表于 2006-5-29 00:04 | 显示全部楼层
加了个精华,期待楼主更多的作品。。。
回复

使用道具 举报

发表于 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


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

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

使用道具 举报

 楼主| 发表于 2006-5-29 01:27 | 显示全部楼层
之所以写成纯AS版  是想方便于移到其它语言    因为其它工具一般没有类似MC的东东

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

使用道具 举报

 楼主| 发表于 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


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

使用道具 举报

发表于 2006-5-29 13:03 | 显示全部楼层
源码在家里的机子上...现在文件好像下载不了, 打不开....wool那里还有没有, 传个backup上来.

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

使用道具 举报

 楼主| 发表于 2006-5-29 13:20 | 显示全部楼层
原来是雷电之类的飞机游戏呀    不过EXE可以转回SWF的,再用精灵转FLA

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

使用道具 举报

发表于 2006-5-29 13:46 | 显示全部楼层
其实当时刚接触到一个隐藏类ASBroadcast, 一时兴趣就写了这么个游戏.

ASBroadcast可以看我以前写的一个例子
http://www.flashempire.net/showp ... 14&postcount=46

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

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

使用道具 举报

 楼主| 发表于 2006-5-29 13:49 | 显示全部楼层
偶用AS学编程……并非真想在FLASH上深入研究……   

所有类,都自己写……

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

使用道具 举报

发表于 2006-5-29 14:00 | 显示全部楼层
维艺上面很早就有3D引擎了, 可以参考一上. 偶也两年没碰Flash Actionscript了, 咔咔....DotNet Coder.
回复

使用道具 举报

 楼主| 发表于 2006-5-29 14:08 | 显示全部楼层
我知道呀
  
不过,想自己做,从中应该可以学到很多东西
回复

使用道具 举报

发表于 2006-6-3 09:22 | 显示全部楼层

好像有点bug喔……

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

使用道具 举报

 楼主| 发表于 2006-6-3 19:23 | 显示全部楼层

BUG 修正了

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

加了个判断

应该可以了
回复

使用道具 举报

 楼主| 发表于 2006-9-14 12:27 | 显示全部楼层
着手面向对象化。。。

发现难度不小。。。

完全没有真正的面向对象编程经验
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-5-1 01:53

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表