现在的位置: 首页 > 综合 > 正文

AS3.0 俄罗斯方块

2018年05月26日 ⁄ 综合 ⁄ 共 8162字 ⁄ 字号 评论关闭

package {
 import com.ui.Block;
 import com.ui.Shape;
 
 import flash.display.Sprite;
 import flash.events.KeyboardEvent;
 import flash.events.TimerEvent;
 import flash.utils.Timer;
 [SWF(backgroundColor = "0xfffffff", frameRate = "24")]
 /**
  * 俄罗斯方块应用程序
  * 主程序入口
  *
  * **/   
 public class FangKuai extends Sprite{
  
 private const BLOCKWH:uint=15;   //每个矩形的边长
 private const KEY_LEFT:uint=37;   //响应键盘  的值       左
 private const KEY_UP:uint =38;   //上
 private const KEY_RIGHT:uint=39;  //右
 private const KEY_DOWN:uint=40;//下
 
 private var shape:uint = 1;   //形状值。默认为1
 
 private var tempL:int = 0;//方块的左边空白距离
    private var tempR:int = 0;//右边空白距离
    private var tempD:int = 0;//下边空白距离
    private var moveType:String;//存储移动状态
  
 private var timer:Timer;   //计时器
  
 private var tetrisX:int;//Tetris的世界X坐标(不是stage的x)
 private var tetrisY:int;//Tetris的世界y坐标
 
 private var worldArr:Array = new Array();//世界方块数组,由10*20的格子构成世界
 private var tetrisShape:Array;//Tetris的数组(形状)
 private var tetrisBrickArr:Array = [];//所有添加到场景的小格子方块储存到一个数组
 
  public function FangKuai(){//构造
   init();
  }
  
  /*
   *响应键盘事件
   */
  private function keyevent(keyev:KeyboardEvent):void{
   if(keyev.keyCode == KEY_LEFT){
    moveType = "l";
    go( -1, 0);
   }
   if(keyev.keyCode == KEY_RIGHT){
    moveType = "r";
    go( 1, 0);
   }
   if(keyev.keyCode == KEY_DOWN){
    moveType = "d";
    go( 0, 1);
   }
   if(keyev.keyCode == KEY_UP){
    moveType = "ro";
    revolves();
   }
   createStageOfTrtris(); 
  }
   
  /*
  *创建可视化的舞台
  */ 
  private function createStageOfTrtris():void{    
   clearStageOfTrtris();   
   for(var world_x:uint=0;world_x<20;world_x++){
      var clearState:int=0;
    for(var world_y:uint=0;world_y<10;world_y++){
     if(worldArr[world_x][world_y] == 0){  //添加背景方格
      var block:Block = new Block(0xCCCCCC);  //黄
      block.x = world_y * BLOCKWH;
         block.y = world_x * BLOCKWH;
         tetrisBrickArr.push(block);
         stage.addChild(block);
     }
     if(worldArr[world_x][world_y] == 2){ 
      clearState++;
      var block2:Block = new Block(0xff0000);
      block2.x = world_y * BLOCKWH;
      block2.y = world_x * BLOCKWH;
      tetrisBrickArr.push(block2);
      stage.addChild(block2);
     }
     
     if(world_x >= tetrisY &&
          world_x < tetrisY + tetrisShape.length &&
          world_y >= tetrisX  &&
          world_y < tetrisX + tetrisShape.length ){  //将形状数组tetrisShape 变为舞台上的可视图形          
      if(tetrisShape[world_x -tetrisY][world_y-tetrisX] == 1){
       var block1:Block = new Block(0xff0000);
       block1.x = world_y * BLOCKWH;
          block1.y = world_x * BLOCKWH;
          tetrisBrickArr.push(block1);
          stage.addChild(block1);
      }
     }
    }
    if (clearState  >= 10) {    //清屏
                        worldArr.splice(world_x, 1) ;
                        worldArr.unshift([0,0,0,0,0,0,0,0,0,0]);
                }
    
   }
  }
   /*
   *旋转
   */
  private function revolves():void{
    var reShpaeArr:Array = new Array(4);
    for(var a:int=0;a<tetrisShape.length;a++){
     reShpaeArr[a]=new Array(4);
     for(var b:int=0;b<tetrisShape.length;b++){
      reShpaeArr[a][b] = tetrisShape[3-b][a];
     }
    }
     //判断翻转后是否会与原有方块重合,如果重合return,不让翻转
                for ( var i :int= 0; i <4;i++ ) {
                   for ( var j :int= 0; j <4; j++ ) {
                    if (reShpaeArr[i][j] == 1) {
                        if (i+tetrisY>19) return;
                         if (worldArr[i + tetrisY][j + tetrisX] == 2 ) return;
                   }
                }
            }
    this.tetrisShape = reShpaeArr;
    getTempXy();
    //考虑在左右板边翻转超出舞台的情况
             if ( tetrisX + tempL <0 ){
              tetrisX = 0;
             }
             if ( tetrisX + tempL+tetrisShape[0].length-tempR>10 ) {
              tetrisX = 10 - tetrisShape[0].length-tempR;
             }
  }
  /*
  *清除舞台
  * 检测方块是否到达顶部? 如果到达, init();
  */
  private function clearStageOfTrtris():void{
   for (var i:int = 0; i <10;i++ ) { 
    if (worldArr[0][i] == 2
     || worldArr[1][i] == 2
     || worldArr[2][i] == 2
     || worldArr[3][i] == 2) {
     init();
     return;
    }
   }
   if (tetrisBrickArr.length> 0) {
    for ( var j:uint=0; j <tetrisBrickArr.length;j++ ) {
     stage.removeChild(tetrisBrickArr[j]);
    }
    tetrisBrickArr = [];
   }   
  
  }
  /*
  *计时器 函数
  */
  private function run(ev:TimerEvent):void{
   moveType = 'd';//更改移动状态为下
   go(0,1);
   createStageOfTrtris();
  }
  
  /*
  *移动  左   右  下的移动
  */
  private function go(lr:int,ud:int):void{
     getTempXy();
   var hit:Array = hitTest(); 
   if (this.tetrisX+tempL + lr>= 0 &&
       this.tetrisX + lr-tempR <= 10 - tetrisShape[0].length &&
       hit[0]==0) {//左右移动
    this.tetrisX += lr;
   }
   if (hit[0] == 1 && hit[1] == 2 ){
     floor();//判断落地
   }
   if(lr==0 && tetrisY - tempD +3 < 19) {
    this.tetrisY += ud;//在场景内下移动
   }
  }
   
        //计算tetris数组四周的空白距离
        private function getTempXy():void {
            var tempint1:int = 0;
            var tempint2:int = 0;
            var tempint3:int = 0;   
            tempL = 0;
            for ( var j:int= 0; j <2;j++) {
                for (var i:int = 0; i <4; i++ ) {
                    if (tetrisShape[i][j] == 1 ) tempint1++;
                }
                if (tempint1 == 0) tempL ++;
            }          
            tempR = 0;
            for (  j= 3; j>1;j-- ) {
                for ( i = 0; i <4; i++ ) {
                    if (tetrisShape[i][j] == 1 ) tempint2++;
                }
                if (tempint2 == 0) tempR ++;
            }          
            tempD = 0;
            for ( j = 3; j>1;j-- ) {
                for ( i = 0; i <4; i++ ) {
                    if (tetrisShape[j][i] == 1 ) tempint3++;
                }
                if (tempint3 == 0) tempD ++;
            }                              
        }
       
  private function hitTest():Array {
   //检测左右是否有方格
     getTempXy();
   for (var i:int = 0; i <4;i++ ) {
    for (var j:int = 0; j <4;j++ ) {
     if (tetrisShape[i][j] == 1) {
      if (moveType == 'l' || moveType == 'ro') {
       if (this.worldArr[i+tetrisY][j+tetrisX-1]==2) return [1,0];
      }
      if(moveType=='r' || moveType=='ro'){
       if (this.worldArr[i+tetrisY][j+tetrisX+1]==2) return [1,1];
      }
      if (moveType == 'd' || moveType=='ro') {
       if(i+tetrisY+1<20){
        if (this.worldArr[i + tetrisY + 1][j + tetrisX] == 2) return [1, 2];
       }
      }
     }
    }
   }
   //检测是否到下边界
   if (this.tetrisY-tempD  >= 20 - tetrisShape.length &&
        (moveType=="d" || moveType=='ro')) {
    return [1,2];
   }else {
    return [0,0];
   }
  }
  //落地 的检测
  private function floor():void {
   for ( var i:int = 0; i <4;i++ ) {
    for ( var j:int = 0; j <4;j++ ) {
     if (tetrisShape[i][j] == 1) {
      this.worldArr[i + tetrisY ][j + tetrisX] = 2;
     }
    }
   }
   getTrtrisShape();//创建新的tetris
  }
  
  /*
   *获得形状数组
   *随机产生一个形状
   */
  private function getTrtrisShape():void{
   var shape:uint = Math.floor(Math.random()*6 + 1);
   //shape = 2;
   tetrisShape = Shape.getShape(shape);
   tetrisX=0;
   tetrisY=0;
  }
  
  private function init():void{  //初始化
    //对数组worldArr初始化
   for(var world_row:uint=0;world_row<20;world_row++ ){
    worldArr[world_row]=[];
    for(var world_col:uint=0;world_col<10;world_col++){
     worldArr[world_row][world_col]=0; 
    }
   }
   getTrtrisShape();
   timer = new Timer(500);
   timer.addEventListener(TimerEvent.TIMER,run);
   timer.start();
   stage.addEventListener(KeyboardEvent.KEY_DOWN,keyevent);
  }   
  
 }
}
----------------------------------------------------------------------

package com.ui{
 import flash.display.Shape;
 
 /**
  * 工具类
  * 产生格子
  * **/
 public class Block extends Shape{
  public function Block(color:uint){
   this.graphics.lineStyle(1,.8);
   this.graphics.beginFill(0x660099,.8);
   this.graphics.drawRect(0,0,15,15);
   this.graphics.endFill();
  }

 }
}

-----------------------------------------------------------------------------

package com.ui{
 /**
  * 形状类
  * 创建俄罗斯方块(Tetris)的类型,用一个4*4的数组(tetrisType)存储 
  * */
 public class Shape{
  public function Shape(){
  }
  public static function getShape(shape:uint):Array{
   var tetrisShape:Array=[];
   switch(shape){
    case 1:
     tetrisShape = [
     [0,0,0,0],
     [0,1,0,0],
     [0,1,0,0],
     [0,1,1,0]
    ];
      break;
    case 2 :
     tetrisShape = [
     [0,0,0,0],
     [0,1,1,0],
     [0,1,1,0],
     [0,0,0,0]
    ];
    break;
    case  3:
     tetrisShape = [
     [0,1,0,0],
     [0,1,0,0],
     [0,1,0,0],
     [0,1,0,0]
    ];
    break;
    case  4:
     tetrisShape = [
     [0,0,0,0],
     [0,1,0,0],
     [1,1,1,0],
     [0,0,0,0]
    ];
    break;
    case  5:
     tetrisShape = [
     [0,0,0,0],
     [1,1,0,0],
     [0,1,1,0],
     [0,0,0,0]
    ];
    break;
    case  6:
     tetrisShape = [
     [0,0,0,0],
     [0,1,1,0],
     [1,1,0,0],
     [0,0,0,0]
    ];
    break;
    default:
     tetrisShape = [
     [0, 0, 0, 0],
     [0, 0, 0, 0],
     [0, 0, 0, 0],
     [0, 0, 0, 0]
    ];
    break;
   }
   return tetrisShape;
  }
  
  

 }
}

------------------------------------------------

 

  要求不高,来的留个言..........在此感谢!

抱歉!评论已关闭.