×

关注微信公众号

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

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

[复制链接]
发表于 2014-3-24 20:46:15 | 显示全部楼层 |阅读模式
本帖最后由 dqxxx 于 2014-9-17 19:04 编辑

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

  早在Flash 5.0风靡全球的时代,我曾写过一个as2版的俄罗斯方块AI。时间一晃过去十余年,我换了三台新电脑,Flash也由5.0、6.0、7.0、8.0……一路升级到cs6了。脚本语言由as2升级到as3。上几天在清理旧电脑磁盘文件时,发现了这个古董。经过几天空闲时间的“翻译”,我将它改成as3版本。现分享给大家,以求精进。
  一、用一维数组模拟地图,据说这比二维数组运行的快。【但这样小小的游戏,也许没有这个必要,但可以作为一条知识来理解和应用】,于是,方块的形状可以用地图中(某一时刻)四个位置(地图中四个坐标或说成一维数组中四个元素)来记忆。
  方块在10*20的矩阵中平移与下落,直到停止,在不同时刻,它存在于不同的位置(坐标)。
  为避免产生出界问题为方便出界判断,所以给虚拟地图加上边界。这个界中的每个小正方形或叫每个位置,其值设为1,意思这里已经有方块了,不能移动到它上面了。这样方块就不会出界了。
  附直观图:

  有了上面的规定,我们可以做下面的事情了:
  因而,我们可以这样记忆并产生一个方块(由四个位置相对的小正方形组成,我们只需要记忆每个小正方形的位置就可以了)(这个方块只是概念上的,只是位置记忆,不可见,还没有和可见元件发生关联)


  例如“田”形方块,可表示为 [29,41,42,30], 其实这和[29,30,41,42]是一样的,甚至和[0,1,12,13]、再甚至和[[0,0],[0,1],[1,0],[1,1]]也是一个道理。表示的方法不同,但原理是一模一样的。(由于我们的地图采用的是一维数组,所以记忆方块的个数就是一维数组的下标。我们又把这四个下标放在一个数组)(注意:我们所言的“方块”是指由四个小正方形组成的方块。而“小正方形”是指构成方块的四个小正方形单位)
  以下是所有方块的形状记忆方式:

                public static const square:Array=[
                 [29,41,42,30],//不参与旋转,但第四个数square[0][3]是个标志数,后文有述,所以小正方形的位置记忆不是按从小到大的顺序排列的
                 
                [28,30,31,29],//以下square[y][3]=29,说明都是以29这个位置为旋转中心,统一了,放在第四位也是个标志数,其实放在哪一个位置上都可以。统一位置最好。
                [41,17,5,29],//square[y][0]的x坐标代表此方块的最左边所处的位置,现在不理解没问题,后文的应用会让你明白这样安排的奥妙!!把能代表方块左边位置的小正方形位置放在[0]位,也是为了方便。
               
                [28,41,42,29],
                [28,17,40,29],
               
                [30,40,41,29],
                [28,16,41,29],
               
                [17,41,16,29],
                [28,30,18,29],
                [17,41,42,29],
                [28,30,40,29],
               
                [17,41,18,29],
                [28,30,42,29],
                [17,41,40,29],
                [28,30,16,29],
               
                [28,30,41,29],
                [17,41,28,29],
                [28,30,17,29],
                [17,41,30,29]
                 ];

  二、旋转就是给每个小正方形的纵横坐标加上偏移量。偏移量是变化后的方块与原来的方块,两者中对应的小正方形的变化量。
  例如,横“—”变成竖“|”
                [28,30,31,29]——>[41,17,5,29]
就用[41,17,5,29]-[28,30,31,29]=[13,-13,-26,0],反之得到:[-13,13,26,0]
这样就完成了旋转!
  应用的时候这样:[28,30,31,29]+[13,-13,-26,0]=[41,17,5,29],横就变成竖了。

  于是所有的偏移量为:
                 public static const _offset:Array=[
                 ,//田不参与旋转,不需要偏移量
                [13,-13,-26,0],
                [-13,13,26,0],
                [0,-24,-2,0],
                [0,24,2,0],
                [-2,-24,0,0],
                [2,24,0,0],
                [11,-11,2,0],
                [-11,11,24,0],
                [11,-11,-2,0],
                [-11,11,-24,0],
                [11,-11,24,0],
                [-11,11,-2,0],
                [11,-11,-24,0],
                [-11,11,2,0],
                [-11,11,-13,0],
                [11,-11,-11,0],
                [-11,11,13,0],
                [11,-11,11,0]
                 ];


  三、由以上两点,我们可以写一个方块类:

package as3{
        public class Tetris {
                public static const square:Array=[
                 [29,41,42,30],
                 
                [28,30,31,29],
                [41,17,5,29],
               
                [28,41,42,29],
                [28,17,40,29],
               
                [30,40,41,29],
                [28,16,41,29],
               
                [17,41,16,29],
                [28,30,18,29],
                [17,41,42,29],
                [28,30,40,29],
               
                [17,41,18,29],
                [28,30,42,29],
                [17,41,40,29],
                [28,30,16,29],
               
                [28,30,41,29],
                [17,41,28,29],
                [28,30,17,29],
                [17,41,30,29]
                 ];
                public static var id:int=0;//正在被移动的方块,它最初的值等于id1,但旋转后会改变值
                public static var id1:int=0;//正在被移动的方块的最初的样子
                public static var id2:int=0;//提示区中的(就是下一个)方块
                 //谁旋转成谁:妙就妙在_id数组的下标是方块A的id号,而它的值是将要旋转成方块B的id号
                public static const _id:Array =[
                 0,
                 2,1,//此表示,_id[1]=2,而_id[2]=1,正是横和竖的相互(或者叫循环)变化!!
                 4,3,
                 6,5,
                 8,9,10,7,
                 12,13,14,11,
                 16,17,18,15
                 ];
                //偏移量
                public static const _offset:Array=[
                 ,
                [13,-13,-26,0],
                [-13,13,26,0],
                [0,-24,-2,0],
                [0,24,2,0],
                [-2,-24,0,0],
                [2,24,0,0],
                [11,-11,2,0],
                [-11,11,24,0],
                [11,-11,-2,0],
                [-11,11,-24,0],
                [11,-11,24,0],
                [-11,11,-2,0],
                [11,-11,-24,0],
                [-11,11,2,0],
                [-11,11,-13,0],
                [11,-11,-11,0],
                [-11,11,13,0],
                [11,-11,11,0]
                 ];

                public function Tetris() {//构造函数,可无
                }
                public static function offset(who:int=-1):Array {
          //得到当前方块或给定的方块中每个小正方形的旋转偏移量,返回一个数组
                        if (who==-1) {
                                who=id;
                        }
                        return (_offset[who]);
                }
                public static function change() {
          //谁旋转成了谁,在虚拟世界里,只是id值的变化
          //打个比方说,人还是那个人,但是身份证号换了原来1,旋转后变身为2,反之2变成1,这就是横竖互变
                        id=_id[id];
                }

                public static function make():int {//产生一个方块,就是产生一个id号,
                        var i=Math.random()*19>>0;//>>0是位计算,意思是取整,速度快于int(i)。
                        return (i);
                }

        }
}


----------------------------------------请期待下一节教程:AI的实现---------------------

//最终效果:



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=539423
跟着教程做一遍,做完的图要到这里评论交作业,教程有看不懂的地方,可以在贴子下面评论

本帖子中包含更多资源

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

x
发表于 2016-1-12 15:49:21 | 显示全部楼层
酷素材
回复 支持 反对

使用道具 举报

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

本版积分规则

2345