×

关注微信公众号

免备案网站空间虚拟主机双线空间域名查询PS数码后期
photoshop互助课堂数百G视频教程下载英语培训机构初中英语如何学随时随地聆听大师开讲/课堂
路径专辑手绘教程抠图教程酷素材photoshop cs3视频教程
查看: 12376|回复: 57

[教程] as3版俄罗斯方块AI⑤@张志晨as3实例教程91

[复制链接]
发表于 2014-3-25 18:49:32 | 显示全部楼层 |阅读模式
本帖最后由 dqxxx 于 2014-4-7 12:40 编辑

as3版俄罗斯方块AI⑤@张志晨as3实例教程91

gui界面:是把Ai获取的最佳方法通过界面展示出来,是动画演示。
Flash文档的库中有七种小正方形的美图,以颜色命名。



  1. package as3{
  2.         import flash.utils.Timer;
  3.         import flash.display.Sprite;
  4.         import flash.display.Stage;
  5.         import flash.events.Event;
  6.         import flash.display.Bitmap;
  7.         import flash.events.TimerEvent;

  8.         public class Auto extends Sprite {
  9.                 const big:int=20;

  10.                 const START:int=0;//电脑运行的不同阶段,相当于指针,指示要运行什么函数
  11.                 const IN:int=1;
  12.                 const PC:int=2;
  13.                 const WAIT:int=3;
  14.                 const ROTA:int=4;
  15.                 const PAN:int=5;
  16.                 const DOWN:int=6;
  17.                 const STOP:int=7;
  18.                 const DEL:int=8;
  19.                 const END:int=9;

  20.                 var sate:int=0;//0滑入游戏区;1正在评估;2等待,3演示() 4下一步

  21.                 var bmd:Array=[new Blue(),new Cyan(),new Green(),new Red(),new Yellow(),new Orange(),new Pink()];
  22.                 var tetris:Array=[];//当前方块
  23.                 var zzc:Array=[];//下一个

  24.                 var map:Array=[];//存放静止方块
  25.                 var ai:Ai=new Ai();
  26.                 var best:Array=[];

  27.                 var timer:Timer;
  28.                 var tips:Sprite;

  29.                 public function Auto() {
  30.                         this.addEventListener(Event.ADDED_TO_STAGE,init);
  31.                 }

  32.                 function init(e:Event) {
  33.                         this.removeEventListener(Event.ADDED_TO_STAGE,init);

  34.                         timer=new Timer(20);
  35.                         timer.stop();

  36.                         tips=new Sprite ();
  37.                         tips.x=-7*big;
  38.                         tips.y=4*big;
  39.                         addChild(tips);

  40.                         Tetris.id2=Tetris.make();//下一个(实为第一个)
  41.                         makeToSips();//放在提示区
  42.                         best[3]=as3.Global.init().join("");//无方块的初始地图
  43.                         for (var i:int=0; i<300; i++) {
  44.                                 map[i]=null;
  45.                         }
  46.                 }

  47.                 public function pc() {
  48.                         timer.start();
  49.                         timer.addEventListener(TimerEvent.TIMER,play);
  50.                         sate=this.START;
  51.                 }

  52.                 function play(e:TimerEvent) {
  53.                         //移入 下落 旋转 平移 下落 停止
  54.                         switch (sate) {
  55.                                 case this.START :
  56.                                         start();
  57.                                         break;
  58.                                 case this.IN :
  59.                                         it_in();
  60.                                         break;
  61.                                 case this.PC :
  62.                                         sate=this.WAIT;
  63.                                         best=(ai.Evaluate(best[3]));
  64.                                         break;
  65.                                 case this.WAIT :
  66.                                         if (best.length>0) {
  67.                                                 Tetris.id=Tetris.id1;//没变形时的样子
  68.                                                 sate=this.ROTA;
  69.                                         }
  70.                                         break;
  71.                                 case this.ROTA :
  72.                                         rota();
  73.                                         break;
  74.                                 case this.PAN :
  75.                                         var xx:int=left();
  76.                                         var tt:int=best[1]*20;
  77.                                         if (xx<tt) {
  78.                                                 pan(1);
  79.                                         } else if (xx>tt) {
  80.                                                 pan(-1);
  81.                                         } else if (xx==tt) {
  82.                                                 this.sate=this.DOWN;
  83.                                         }
  84.                                         break;
  85.                                 case this.DOWN :
  86.                                         //down();
  87.                                         fast();
  88.                                         break;
  89.                                 case this.STOP :
  90.                                         sate=this.DEL;
  91.                                         stop();
  92.                                         break;
  93.                                 case this.DEL :
  94.                                         trace("case this.DEL :");
  95.                                         break;
  96.                                 case this.END :
  97.                                         timer.stop();
  98.                                         break;
  99.                         }
  100.                 }

  101.                 //用于平移时,判断是否平移到位
  102.                 function left():int {
  103.                         var xx:int=240;
  104.                         for (var i:int=0; i<4; i++) {
  105.                                 if (tetris[i].x<xx) {
  106.                                         xx=tetris[i].x;
  107.                                 }
  108.                         }
  109.                         return (xx);
  110.                 }

  111.                 function stop() {
  112.                         //方块落地
  113.                         var ids:Array=best[5].split(",");//所在位置
  114.                         for (var i:int=0; i<4; i++) {
  115.                                 var id:int=Number(ids[i]);
  116.                                 map[id]=tetris[i];//记忆静止方块
  117.                         }
  118.                         //是否消行
  119.                         var t:int=best[2].length;
  120.                         if (t>0) {
  121.                                 //消行
  122.                                 for (var j:int=0; j<t; j++) {
  123.                                         var r:int=best[2][j];//取得行号
  124.                                         for (var c:int=1; c<11; c++) {
  125.                                                 this.removeChild(map[r*12+c]);
  126.                                                 map[r*12+c]=null;
  127.                                         }
  128.                                         //上面的方块全部下移
  129.                                         downLine(r);
  130.                                 }
  131.                                 //加分
  132.                                 Global.line+=t;
  133.                                 Global.score +=(t*t*100);
  134.                                 Global.root.rows.text=String(Global.line);
  135.                                 Global.root.scores.text=String(Global.score);
  136.                         }
  137.                         sate=this.START;
  138.                 }

  139.                 function downLine(h:int) {
  140.                         for (var r:int=h; r>4; r--) {
  141.                                 for (var c:int=1; c<11; c++) {
  142.                                         var id:int=r*12+c;
  143.                                         if (map[id-12]) {
  144.                                                 map[id-12].y+=20;
  145.                                         }
  146.                                         map[id]=map[id-12];
  147.                                 }
  148.                         }
  149.                         for (c=49; c<59; c++) {
  150.                                 map[c]=null;
  151.                         }
  152.                 }
  153.                 function fast() {
  154.                         while (sate!=this.STOP) {
  155.                                 for (var j:int=0; j<4; j++) {
  156.                                         tetris[j].y+=20;
  157.                                         if (tetris[j].y==best[4]*20) {//到行
  158.                                                 sate=this.STOP;
  159.                                         }
  160.                                 }
  161.                         }
  162.                 }


  163.                 function down() {
  164.                         for (var i:int =0; i<Global.v; i++) {
  165.                                 for (var j:int=0; j<4; j++) {
  166.                                         tetris[j].y+=1;
  167.                                 }
  168.                         }
  169.                 }

  170.                 function pan(f:int) {
  171.                         for (var k:int=0; k<4; k++) {
  172.                                 if (tetris[k].y<80) {
  173.                                         down();
  174.                                         return;
  175.                                 }
  176.                         }

  177.                         for (var i:int =0; i<Global.v; i++) {
  178.                                 for (var j:int =0; j<4; j++) {
  179.                                         tetris[j].x+=f;
  180.                                 }
  181.                         }
  182.                 }

  183.                 function rota() {
  184.                         if (Tetris.id!=best[0]) {
  185.                                 var offset:Array=Tetris.offset();
  186.                                 for (var i:int =0; i<4; i++) {
  187.                                         var dx:int;
  188.                                         var dy:int;
  189.                                         if (offset[i]==11) {
  190.                                                 dx=-20;
  191.                                                 dy=20;
  192.                                         } else if (offset[i]==-11) {
  193.                                                 dx=20;
  194.                                                 dy=-20;
  195.                                         } else {
  196.                                                 dx=Ai.getX(offset[i])*20;
  197.                                                 dy=Ai.getY(offset[i])*20;
  198.                                         }
  199.                                         tetris[i].x+=dx;//旋转
  200.                                         tetris[i].y+=dy;
  201.                                 }
  202.                                 Tetris.change();
  203.                         } else {
  204.                                 sate=this.PAN;
  205.                         }
  206.                 }
  207.                 function it_in() {
  208.                         if (tetris[0].y%big==0) {
  209.                                 for (var k:int=3; k>=0; k--) {
  210.                                         var cx:int=tetris[k].x/big;
  211.                                         var cy:int=tetris[k].y/big;
  212.                                         if (map[cy*12+cx+12]) {
  213.                                                 //四个小正方形中只要有一个无法下落,失败
  214.                                                 sate=this.END;
  215.                                                 return;
  216.                                         }
  217.                                 }
  218.                         }
  219.                         for (var i:int=0; i<Global.uv; i++) {
  220.                                 for (var j:int=0; j<4; j++) {
  221.                                         tetris[j].y++;
  222.                                 }
  223.                         }
  224.                         for (j=0; j<4; j++) {
  225.                                 if (tetris[j].y<80) {
  226.                                         return;
  227.                                 }
  228.                         }
  229.                         sate=this.PC;
  230.                 }

  231.                 function start() {
  232.                         Tetris.id=Tetris.id1=Tetris.id2;
  233.                         show();//显示并下落到游戏区
  234.                         Tetris.id2=Tetris.make();//下一个
  235.                         makeToSips();//放在提示区
  236.                         sate=this.IN;
  237.                 }

  238.                 //产生下一个方块,放在提示区
  239.                 function makeToSips() {
  240.                         var id:int=Tetris.id2;
  241.                         var _id:int;
  242.                         if (id==0) {
  243.                                 _id=0;
  244.                         } else if (id<3) {
  245.                                 _id=1;
  246.                         } else if (id<5) {
  247.                                 _id=2;
  248.                         } else if (id<7) {
  249.                                 _id=3;
  250.                         } else if (id<11) {
  251.                                 _id=4;
  252.                         } else if (id<15) {
  253.                                 _id=5;
  254.                         } else {
  255.                                 _id=6;
  256.                         }
  257.                         for (var i:int=0; i<4; i++) {
  258.                                 var sq:Bitmap=new Bitmap(bmd[_id]);
  259.                                 zzc[i]=sq;
  260.                                 tips.addChild(sq);
  261.                                 sq.x=Ai.getX(Tetris.square[id][i])*big;
  262.                                 sq.y=Ai.getY(Tetris.square[id][i])*big;
  263.                         }
  264.                 }
  265.                 //将方块从提示区移入游戏区顶部
  266.                 function show() {
  267.                         for (var i:int=0; i<4; i++) {
  268.                                 tetris[i]=zzc[i];
  269.                                 this.addChild(tetris[i]);
  270.                         }
  271.                 }


  272.         }

  273. }
复制代码
as3版俄罗斯方块AI①@张志晨as3实例教程91
as3版俄罗斯方块AI②@张志晨as3实例教程91
as3版俄罗斯方块AI③@张志晨as3实例教程91
as3版俄罗斯方块AI④@张志晨as3实例教程91
as3版俄罗斯方块AI⑤@张志晨as3实例教程91
本帖的地址:http://bbs.jcwcn.com/forum.php?mod=viewthread&tid=539510
跟着教程做一遍,做完的图要到这里评论交作业,教程有看不懂的地方,可以在贴子下面评论

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?[立即注册]

x
发表于 2014-3-28 06:25:24 | 显示全部楼层
酷素材
好帖,顶起。。。。
回复 支持 反对

使用道具 举报

发表于 2014-3-28 06:25:54 | 显示全部楼层
恩~~~来学习学习~~~
回复 支持 反对

使用道具 举报

发表于 2014-3-28 06:26:24 | 显示全部楼层
学习先。。。。。。
回复 支持 反对

使用道具 举报

发表于 2014-3-28 06:26:54 | 显示全部楼层
酷素材
感谢楼主提供这么多优秀资源
回复 支持 反对

使用道具 举报

发表于 2014-3-28 06:27:24 | 显示全部楼层
酷素材
顶楼主。。。。。。
回复 支持 反对

使用道具 举报

发表于 2014-3-28 06:27:54 | 显示全部楼层
优秀资源收藏先。。。
回复 支持 反对

使用道具 举报

发表于 2014-3-28 06:28:24 | 显示全部楼层
九九八十一路收藏刀法, 许久没有练习, 竟有些生疏了,
回复 支持 反对

使用道具 举报

发表于 2014-3-28 06:28:54 | 显示全部楼层
为什么这个贴子这么热
回复 支持 反对

使用道具 举报

发表于 2014-3-28 06:29:24 | 显示全部楼层
要学习潜水,可以到论坛瓜瓜奇谈版多潜水
回复 支持 反对

使用道具 举报

发表于 2014-3-28 06:29:54 | 显示全部楼层
好帖,顶起。。。。
回复 支持 反对

使用道具 举报

发表于 2014-3-28 06:30:24 | 显示全部楼层
恩~~~来学习学习~~~
回复 支持 反对

使用道具 举报

发表于 2014-3-28 06:30:54 | 显示全部楼层
学习先。。。。。。
回复 支持 反对

使用道具 举报

发表于 2014-3-28 06:31:24 | 显示全部楼层
感谢楼主提供这么多优秀资源
回复 支持 反对

使用道具 举报

发表于 2014-3-28 06:31:54 | 显示全部楼层
顶楼主。。。。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | [立即注册]

本版积分规则

2345