追风想追风的追风

2009年08月14号

flash as3 游戏 超精简的 俄罗斯方块 源码 教程-actionscript3

类归于: Flash as3游戏 — 标签: — admin @ 11:25 上午

还没有积分系统,也没有直接下落功能,不过已经可以耍了!

代码不足300行!

CODE:
  1. package {
  2.     import flash.display.Sprite;
  3.     import flash.events.Event;
  4.     import flash.events.TimerEvent;
  5.     import flash.utils.Timer;
  6.     import flash.events.KeyboardEvent;
  7.  
  8.     public class Main extends Sprite {
  9.         public var worldArr:Array = new Array();//世界方块数组,由10*20的格子构成世界
  10.         public var brickWH:int = 20;//每个小方块边长
  11.         public var tetrisType:Array;//Tetris的数组(形状)
  12.         public var tetrisX:int;//Tetris的世界X坐标(不是stage的x)
  13.         public var tetrisY:int;//Tetris的世界y坐标
  14.         public var worldTimer:Timer = new Timer(500);//世界时间
  15.         public var tetrisBrickArr:Array = [];//所有添加到场景的小格子方块储存到一个数组
  16.         public var downKeycode:int = 40;//下按键的keycode
  17.         public var leftKeycode:int = 37;//左按键的keycode
  18.         public var rightKeycode:int = 39;//右按键的keycode
  19.         public var upKeycode:int = 38;//上按键的keycode
  20.         public var tempL:int = 0;//Tetris的左边空白距离
  21.         public var tempR:int = 0;//Tetris的右边空白距离
  22.         public var tempD:int = 0;//Tetris的下边空白距离
  23.         public var moveType:String;//移动状态
  24.        
  25.         public function Main():void {
  26.             if (stage) init();
  27.             else addEventListener(Event.ADDED_TO_STAGE, init);
  28.         }
  29.        
  30.         private function init(e:Event = null):void {
  31.             //构建世界数组
  32.             for (var i:int = 0; i <20; i++ ) {
  33.                 worldArr[i] = [];
  34.                 for (var j:int = 0; j <10; j++ ) {
  35.                     worldArr[i][j] = 0;
  36.                 }
  37.             }
  38.             removeEventListener(Event.ADDED_TO_STAGE, init);
  39.             createTetris();
  40.             worldTimer.addEventListener(TimerEvent.TIMER,onTimerHandler);
  41.             worldTimer.start();
  42.             stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDownHandler);
  43.         }
  44.        
  45.         public function onTimerHandler(evnet:TimerEvent):void {
  46.             moveType = 'd';//更改移动状态为下
  47.             move(0, 1);//向下移动一格
  48.             initWorld();//刷新世界
  49.         }
  50.      
  51.         public function onKeyDownHandler(event:KeyboardEvent):void {
  52.             switch(event.keyCode) {
  53.                 case this.downKeycode:
  54.                    moveType = "d";
  55.                    move(0, 1);
  56.                 break;
  57.                 case this.leftKeycode:
  58.                    moveType = "l";
  59.                    move( -1, 0);
  60.                 break;
  61.                 case this.rightKeycode:
  62.                    moveType = "r";
  63.                    move(1, 0);
  64.                 break;
  65.                 case this.upKeycode:
  66.                    moveType = "ro";
  67.                    roll();   
  68.                 break;
  69.             }
  70.             initWorld();
  71.  
  72.         }
  73.        
  74.         public function initWorld():void {
  75.             clearTetris();//构建世界前先清屏
  76.             for (var i:int = 0; i <20; i++ ) {
  77.                 var clearState:int = 0;
  78.                 for (var j:int = 0; j <10; j++ ) {
  79.                     var newBrick:Sprite = this.drawBrick(0x000000);
  80.                     newBrick.x = j * brickWH;
  81.                     newBrick.y = i * brickWH;
  82.                    if(worldArr[i][j]==0){//添加空白方格
  83.                         var newBrick2:Sprite = this.drawBrick(0xE0E0E0);
  84.                         newBrick2.x = j * brickWH;
  85.                         newBrick2.y = i * brickWH;
  86.                         tetrisBrickArr.push(newBrick2);
  87.                         stage.addChild(newBrick2);
  88.                     }else if (worldArr[i][j] == 2) {//addChild已经下落的方格
  89.                         clearState++;
  90.                         var newBrick3:Sprite = this.drawBrick(0x787878);
  91.                         newBrick3.x = j * brickWH;
  92.                         newBrick3.y = i * brickWH;
  93.                         tetrisBrickArr.push(newBrick3);
  94.                         stage.addChild(newBrick3);
  95.                     }
  96.                     //把Tetris数组转换并addchild到舞台
  97.                     if (i <tetrisY + tetrisType.length
  98.                     && i>= tetrisY
  99.                     && j>= tetrisX
  100.                     && j < tetrisX + tetrisType[0].length) {
  101.                         if (tetrisType[i - tetrisY ][j - tetrisX] == 1) {
  102.                                 newBrick.graphics.beginFill(0x000000);
  103.                                 tetrisBrickArr.push(newBrick);
  104.                                 stage.addChild(newBrick);
  105.                         }
  106.                     }               
  107.                 }
  108.                
  109.                 if (clearState>=10) {
  110.                         worldArr.splice(i, 1) ;
  111.                         worldArr.unshift([0,0,0,0,0,0,0,0,0,0]);
  112.                 }
  113.             }
  114.  
  115.         }
  116.         //清屏
  117.         public function clearTetris():void {
  118.             for (var i:int = 0; i <10;i++ ) {
  119.                 if (worldArr[0][i] == 2
  120.                 || worldArr[1][i] == 2
  121.                 || worldArr[2][i] == 2
  122.                 || worldArr[3][i] == 2) {
  123.                     init();
  124.                     return;
  125.                 }
  126.             }
  127.             if (tetrisBrickArr.length> 0) {
  128.                 for ( i=0; i <tetrisBrickArr.length;i++ ) {
  129.                      stage.removeChild(tetrisBrickArr[i]);
  130.                }
  131.                 tetrisBrickArr = [];
  132.             }      
  133.         }
  134.         /*随机生成Tetris
  135.          * 用一个4*4的数组存储
  136.          * */
  137.         public function createTetris():void {
  138.             var randNum:Number = Math.random();
  139.             tetrisType = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]];
  140.             if (randNum <0.2) {
  141.                  tetrisType = [
  142.                    [0,0,0,0],
  143.                    [0,1,0,0],
  144.                    [0,1,0,0],
  145.                    [0,1,1,0]
  146.                  ];
  147.             }else if (randNum <0.4) {
  148.                  tetrisType = [
  149.                    [0,0,0,0],
  150.                    [0,1,1,0],
  151.                    [0,1,1,0],
  152.                    [0,0,0,0],
  153.                  ];
  154.             }else if (randNum <0.6) {
  155.                  tetrisType = [
  156.                    [0,1,0,0],
  157.                    [0,1,0,0],
  158.                    [0,1,0,0],
  159.                    [0,1,0,0]
  160.                  ];
  161.             }else if (randNum <0.7) {
  162.                  tetrisType = [
  163.                    [0,0,0,0],
  164.                    [0,1,0,0],
  165.                    [1,1,1,0],
  166.                    [0,0,0,0]
  167.                  ];
  168.             }else if(randNum<0.8){
  169.                  tetrisType = [
  170.                    [0,0,0,0],
  171.                    [1,1,0,0],
  172.                    [0,1,1,0],
  173.                    [0,0,0,0],
  174.                  ];
  175.             }else {
  176.                  tetrisType = [
  177.                    [0,0,0,0],
  178.                    [0,1,1,0],
  179.                    [1,1,0,0],
  180.                    [0,0,0,0]
  181.                  ];
  182.             }
  183.             tetrisX = 5; tetrisY = 0;
  184.         }
  185.         //翻转
  186.         public function roll():void {
  187.             //开始翻转
  188.             var newTetris:Array = new Array(4);
  189.             for ( var i:int=0; i <tetrisType.length; i++ ) {
  190.                 newTetris[i] = new Array(4);
  191.                 for (var j:int=0; j <tetrisType.length; j++ ) {
  192.                     newTetris[i][j] = tetrisType[(4-1)-j][i];
  193.                 }
  194.             }
  195.             //判断翻转后是否会与原有方块重合,如果重合return,不让翻转
  196.             for ( i = 0; i <4;i++ ) {
  197.                 for ( j = 0; j <4; j++ ) {
  198.                    if (newTetris[i][j] == 1) {
  199.                        if (i+tetrisY>19) return;
  200.                        if (worldArr[i + tetrisY][j + tetrisX] == 2 ) return;
  201.                    }
  202.                 }
  203.             }
  204.            
  205.             this.tetrisType = newTetris;
  206.            
  207.             //考虑在左右板边翻转超出舞台的情况
  208.             getTempXy();
  209.             if ( tetrisX + tempL <0 ) tetrisX = 0;
  210.             if ( tetrisX + tempL+tetrisType[0].length-tempR>10 ) tetrisX = 10 - tetrisType[0].length-tempR;
  211.         }
  212.        
  213.         public function move(lr:int, ud:int):void {
  214.             getTempXy();
  215.             var hit:Array = hitTest();
  216.             if (this.tetrisX+tempL + lr>= 0 && this.tetrisX + lr-tempR <= 10 - tetrisType[0].length && hit[0]==0) {//左右移动
  217.                 this.tetrisX += lr;
  218.             }
  219.            
  220.             if (hit[0] == 1 && hit[1] == 2 ) floor();//判断落地
  221.             if(lr==0 && tetrisY-tempD+3<19) this.tetrisY += ud;//在场景内上下移动
  222.         }
  223.         /*碰撞检测
  224.          * 对tetris里的每一个方格做检测
  225.          * 返回array[0]:是否碰撞   array[1]:碰撞方向
  226.          * */
  227.         public function hitTest():Array {
  228.            getTempXy();
  229.            //检测左右是否有方格
  230.             for (var i:int = 0; i <4;i++ ) {
  231.                 for (var j:int = 0; j <4;j++ ) {
  232.                     if (tetrisType[i][j] == 1) {
  233.                         if (moveType == 'l' || moveType == 'ro') {
  234.                             if (this.worldArr[i+tetrisY][j+tetrisX-1]==2) return [1,0];
  235.                         }
  236.                         if(moveType=='r' || moveType=='ro'){
  237.                             if (this.worldArr[i+tetrisY][j+tetrisX+1]==2) return [1,1];
  238.                         }
  239.                         if (moveType == 'd' || moveType=='ro') {
  240.                             if(i+tetrisY+1<20){
  241.                                 if (this.worldArr[i + tetrisY + 1][j + tetrisX] == 2) return [1, 2];
  242.                             }
  243.                         }
  244.                     }
  245.                 }
  246.             }
  247.             //检测是否到下边界
  248.             if (this.tetrisY  - tempD>= 20 - tetrisType.length && (moveType=="d" || moveType=='ro')) {
  249.                     return [1,2];
  250.             }else {
  251.                     return [0,0];
  252.             }
  253.         }
  254.         //落地
  255.         public function floor():void {
  256.             for ( var i:int = 0; i <4;i++ ) {
  257.                 for ( var j:int = 0; j <4;j++ ) {
  258.                     if (tetrisType[i][j] == 1) {
  259.                         this.worldArr[i + tetrisY ][j + tetrisX] = 2;
  260.                     }
  261.                 }
  262.             }
  263.             createTetris();//创建新的tetris
  264.         }
  265.        
  266.         //计算tetris数组四周的空白距离
  267.         public function getTempXy():void {
  268.             var tempint1:int = 0;
  269.             var tempint2:int = 0;
  270.             var tempint3:int = 0;
  271.            
  272.             tempL = 0;
  273.             for ( var j:int= 0; j <2;j++) {
  274.                 for (var i:int = 0; i <4; i++ ) {
  275.                     if (tetrisType[i][j] == 1 ) tempint1++;
  276.                 }
  277.                 if (tempint1 == 0) tempL ++;
  278.             }
  279.            
  280.             tempR = 0;
  281.             for (  j= 3; j>1;j-- ) {
  282.                 for ( i = 0; i <4; i++ ) {
  283.                     if (tetrisType[i][j] == 1 ) tempint2++;
  284.                 }
  285.                 if (tempint2 == 0) tempR ++;
  286.             }
  287.            
  288.             tempD = 0;
  289.             for ( j = 3; j>1;j-- ) {
  290.                 for ( i = 0; i <4; i++ ) {
  291.                     if (tetrisType[j][i] == 1 ) tempint3++;
  292.                 }
  293.                 if (tempint3 == 0) tempD ++;
  294.             }
  295.                                 
  296.         }
  297.         //绘出方格     
  298.         public function drawBrick(color:uint):Sprite {
  299.             var mySprite:Sprite = new Sprite();
  300.             mySprite.graphics.beginFill(color);
  301.             mySprite.graphics.lineStyle(1,0xffffff);
  302.             mySprite.graphics.drawRect(0, 0, brickWH, brickWH);
  303.             mySprite.graphics.endFill();
  304.             return mySprite;
  305.         }
  306.        
  307.     }
  308.    
  309. }

1 条评论 »

  1. 你不是一般的厉害,兄弟。

    评论 由 swb — 2010年05月21号 @ 9:35 下午

这篇文章上的评论 RSS feed TrackBack URL

留下评论

Copyright @ 2007-2008 Programmed By Cjv Skin by cjv 闽ICP备06021916号 WordPress 所驱动