flash游戏开发-as3实现的俄罗斯方块

作者:袖梨 2022-07-02

  1. package
  2. {
  3. import flash">flash.display.Sprite;
  4. import flash.events.Event;
  5. import flash.events.KeyboardEvent;
  6. import flash.events.MouseEvent;
  7. import flash.events.TimerEvent;
  8. import flash.geom.Point;
  9. import flash.text.TextField;
  10. import flash.ui.Keyboard;
  11. import flash.utils.Timer;
  12. import flash.net.*;
  13. /**
  14.   * ...
  15.   * @author sliz
  16.   * @qq:405628079
  17. */
  18. [SWF(, , backgroundColor="0x000000", frameRate="60")]
  19. public class Main extends Sprite
  20. {
  21.   private var deadBoxs:Array = new Array();
  22.   private var liveBoxs:Array = new Array();
  23.   private var xNum:int = 20;
  24.   private var yNum:int = 40;
  25.   private var w:Number = 10;
  26.   private var world:Sprite = new Sprite();
  27.   private var liveWrapper:Sprite = new Sprite();
  28.   
  29.   private var keyRight   :Boolean = false;
  30.   private var keyLeft    :Boolean = false;
  31.   private var keyUp:Boolean = false;
  32.   private var keyRollLeft:Boolean = false;
  33.   private var keyRollRight:Boolean = false;
  34.   
  35.   private var lives:Array = new Array();
  36.   private var livesLength:int = 5;
  37.   
  38.   public function Main():void
  39.   {
  40.    init();
  41.   }
  42.   
  43.   private function init():void
  44.   {
  45.    ////////////////////////////
  46.    var lable1:TextField = new TextField();
  47.    addChild(lable1);
  48.    lable1.textColor = 0xffffff;
  49.    lable1.text = "上,下,左,右,空格";
  50.    var lable2:TextField = new TextField();
  51.    addChild(lable2);
  52.    lable2.textColor = 0xffffff;
  53.    lable2.text = "sliz";
  54.    lable2.;
  55.    lable2.
  56.    lable2.addEventListener(MouseEvent.CLICK, clickHandler);
  57.    lable2.x = stage.stageWidth - lable2.width;
  58.    lable2.y = stage.stageHeight - lable2.height;
  59.    ///////////////////////////
  60.    var timer:Timer = new Timer(1000);
  61.    var timer2:Timer = new Timer(100);
  62.    addChild(world);
  63.    world.x = stage.stageWidth / 2 - xNum * w / 2;
  64.    world.y = stage.stageHeight / 2 - yNum * w / 2
  65.    addChild(liveWrapper);
  66.    for (var i:int = 0; i < yNum;i++ ) {
  67.     deadBoxs = new Array();
  68.     for (var j:int = 0; j < xNum;j++ ) {
  69.      deadBoxs[j] = 0;
  70.     }
  71.    }
  72.    lives[0] = 1;
  73.    for (i = 0; i < livesLength; i++) {
  74.     initLive();
  75.    }
  76.    update();
  77.    stage.addEventListener(MouseEvent.CLICK, clickHandler);
  78.    stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
  79.    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
  80.    stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
  81.    timer.addEventListener(TimerEvent.TIMER, timeHandler);
  82.    timer2.addEventListener(TimerEvent.TIMER, timeHandler2);
  83.    timer2.start();
  84.    timer.start();
  85.   }
  86.   private function initLive():void {
  87.    var r:Number = Math.random();
  88.    if (r < 0.2) {
  89.     lives[lives[0]] = 0;
  90.     liveBoxs[0]={ x:1, y:0 } ;
  91.     liveBoxs[1]={ x:0, y:0} ;
  92.     liveBoxs[2]={ x:2, y:0 } ;
  93.     liveBoxs[3] = { x:3, y:0 } ;
  94.    }else if (r < 0.4) {
  95.     lives[lives[0]] = 1;
  96.     liveBoxs[0]={ x:1, y:0 } ;
  97.     liveBoxs[1]={ x:0, y:0} ;
  98.     liveBoxs[2]={ x:1, y:1 } ;
  99.     liveBoxs[3]={ x:2, y:1 } ;
  100.    }else if (r < 0.6) {
  101.     lives[lives[0]] = 2;
  102.     liveBoxs[0]={ x:1, y:0 } ;
  103.     liveBoxs[1]={ x:0, y:1} ;
  104.     liveBoxs[2]={ x:1, y:1 } ;
  105.     liveBoxs[3]={ x:2, y:0 } ;
  106.    }else if (r < 0.8) {
  107.     lives[lives[0]] = 3;
  108.     liveBoxs[0]={ x:0, y:0 } ;
  109.     liveBoxs[1]={ x:0, y:1} ;
  110.     liveBoxs[2]={ x:1, y:1 } ;
  111.     liveBoxs[3]={ x:1, y:0 } ;
  112.    }else {
  113.     lives[lives[0]] = 4;
  114.     liveBoxs[0]={ x:1, y:1 } ;
  115.     liveBoxs[1]={ x:1, y:0} ;
  116.     liveBoxs[2]={ x:0, y:1 } ;
  117.     liveBoxs[3]={ x:2, y:1 } ;
  118.    }
  119.    move((int)(xNum / 2), 1);
  120.    if (lives[0] == livesLength) {
  121.     lives[0] = 1;
  122.    }else {
  123.     lives[0]++;
  124.    }
  125.   }
  126.   private function liveToDead():void {
  127.    for (var i:int = 0; i < liveBoxs.length; i++) {
  128.     deadBoxs[liveBoxs.y][liveBoxs.x] = 1;
  129.    }
  130.   }
  131.   private function clear():void {
  132.    for (var i:int = 0; i < yNum; i++ ) {
  133.     var counter:int = 0;
  134.     for (var j:int = 0; j < xNum;j++ ) {
  135.      if (deadBoxs[j] != 1) {
  136.       break;
  137.      }
  138.      counter++;
  139.     }
  140.     if (counter==xNum) {
  141.      for (j = 0; j < xNum;j++ ) {
  142.       deadBoxs[j] = 0;
  143.      }
  144.      for (var ii:int = i; ii > 0;ii-- ) {
  145.       for (j = 0; j < xNum;j++ ) {
  146.        deadBoxs[ii][j] = deadBoxs[ii-1][j];
  147.       }
  148.      }
  149.      for (j = 0; j < xNum;j++ ) {
  150.       deadBoxs[0][j] = 0;
  151.      }
  152.     }
  153.    }
  154.   }
  155.   private function isBottom():Boolean {
  156.    var ret:Boolean = false;
  157.    for (var i:int = 0; i < liveBoxs.length;i++ ) {
  158.     if (liveBoxs.y ==yNum-1) {
  159.      ret = true;
  160.      break
  161.     }
  162.     for (var ii:int = 0; ii < yNum; ii++ ) {
  163.      for (var j:int = 0; j < xNum; j++ ) {
  164.       if ((deadBoxs[ii][j]==1)&&(liveBoxs.y==ii-1)&&(liveBoxs.x==j)) {
  165.        ret = true;
  166.        break
  167.       }
  168.      }
  169.     }
  170.    }
  171.    return ret;
  172.   }
  173.   private function isLive():Boolean {
  174.    var ret:Boolean = true;
  175.    for (var i:int = 0; i < liveBoxs.length;i++ ) {
  176.     if (
  177.     (liveBoxs.x < 0)
  178.     ||(liveBoxs.x> ( xNum - 1))
  179.     ||(liveBoxs.y < 0)
  180.     ||(liveBoxs.y>(yNum-1))
  181.     ) {
  182.      ret = false;
  183.      break
  184.     }
  185.     for (var ii:int = 0; ii < yNum; ii++ ) {
  186.      for (var j:int = 0; j < xNum; j++ ) {
  187.       if ((deadBoxs[ii][j]==1)&&(liveBoxs.x==j)&&(liveBoxs.y==ii)) {
  188.        ret = false;
  189.        break
  190.       }
  191.      }
  192.     }
  193.    }
  194.    return ret;
  195.   }
  196.   private function move(x:int=1, y:int=0):void {
  197.    var liveBoxsShadow:Array = new Array();
  198.    for (var i:int = 0; i < liveBoxs.length; i++ ) {
  199.     liveBoxsShadow = {x:liveBoxs.x,y:liveBoxs.y};
  200.     liveBoxs.x += x;
  201.     liveBoxs.y += y;
  202.    }
  203.    if (!isLive()) {
  204.     for (i = 0; i < liveBoxs.length;i++ ) {
  205.      liveBoxs =  {x:liveBoxsShadow.x,y:liveBoxsShadow.y};
  206.     }
  207.    }
  208.   }
  209.   private function roll(b:Boolean = true):void {
  210.    var liveBoxsShadow:Array = new Array();
  211.    for (var i:int = 0; i < liveBoxs.length; i++ ) {
  212.     liveBoxsShadow = {x:liveBoxs.x,y:liveBoxs.y};
  213.    }
  214.    if (b) {
  215.     for (i = 1; i < liveBoxs.length;i++ ) {
  216.      var tempIX:int=liveBoxs.x;
  217.      liveBoxs.x = liveBoxs[0].x+liveBoxs.y-liveBoxs[0].y;
  218.      liveBoxs.y = liveBoxs[0].y -tempIX +liveBoxs[0].x;
  219.     }
  220.    }else {
  221.     for (i= 1; i < liveBoxs.length;i++ ) {
  222.      tempIX=liveBoxs.x;
  223.      liveBoxs.x = liveBoxs[0].x-liveBoxs.y+liveBoxs[0].y;
  224.      liveBoxs.y = liveBoxs[0].y +tempIX -liveBoxs[0].x;
  225.     }
  226.    }
  227.    if (!isLive()) {
  228.     for (i = 0; i < liveBoxs.length;i++ ) {
  229.      liveBoxs =  {x:liveBoxsShadow.x,y:liveBoxsShadow.y};
  230.     }
  231.    }
  232.   }
  233.   private function update():void {
  234.    world.graphics.clear();
  235.    world.graphics.lineStyle(1, 0xffffff);
  236.    world.graphics.lineTo(xNum * w , 0);
  237.    world.graphics.lineTo(xNum * w ,yNum * w);
  238.    world.graphics.lineTo(0, yNum * w );
  239.    world.graphics.lineTo(0,0);
  240.    world.graphics.lineStyle();
  241.    
  242.    for (var i:int = 0; i < yNum;i++ ) {
  243.     for (var j:int = 0; j < xNum;j++ ) {
  244.      if (deadBoxs[j] == 1) {
  245.       world.graphics.beginFill(0x123456);
  246.       world.graphics.drawRect(j * w, i * w, w, w);
  247.      }
  248.     }
  249.    }
  250.    var color:Number;
  251.    if (lives[0]==4) {
  252.     color = 0x00ffff;
  253.    }else if (lives[0]==1) {
  254.     color = 0xff0000;
  255.    }else if (lives[0]==2) {
  256.     color = 0x00ff00;
  257.    }else if (lives[0]==3) {
  258.     color=0x0000ff
  259.    }else {
  260.     color=0xffff00
  261.    }
  262.    for (i = 0; i < liveBoxs.length; i++ ) {
  263.     world.graphics.beginFill(color,0.9);
  264.     world.graphics.drawRect(liveBoxs.x*w,liveBoxs.y*w,w,w);
  265.    }
  266.    world.graphics.lineStyle(1, 0xffffff, 0.5);
  267.    for (i = 0; i < xNum-1;i++ ) {
  268.     world.graphics.moveTo(w * (i + 1), 0);
  269.     world.graphics.lineTo(w * (i + 1), w*yNum);
  270.    }
  271.    for (i = 0; i < yNum-1;i++ ) {
  272.     world.graphics.moveTo(0, w*(i+1));
  273.     world.graphics.lineTo(w * xNum , w*(i+1));
  274.    }
  275.   }
  276.   private function clickHandler(e:MouseEvent):void {
  277.    navigateToURL( new URLRequest ("http://space.flash8.net/space/?534614" ) );
  278.   }
  279.   private function timeHandler2(e:TimerEvent):void {
  280.    if (keyLeft) {
  281.     move(-1, 0);
  282.    }
  283.    if (keyRight) {
  284.     move(1, 0);
  285.    }
  286.    if (keyRollLeft) {
  287.     roll();
  288.    }
  289.    if (keyRollRight) {
  290.     roll(false);
  291.    }
  292.   }
  293.   private function timeHandler(e:TimerEvent):void {
  294.    move(0, 1);
  295.    if (isBottom()) {
  296.     liveToDead();
  297.     clear();
  298.     initLive();
  299.    }
  300.   }
  301.   private function enterFrameHandler(e:Event):void {
  302.    if (keyUp) {
  303.     while (!isBottom()) {
  304.      move(0, 1);
  305.     }
  306.     liveToDead();
  307.     clear();
  308.     initLive();
  309.     keyUp = false;
  310.    }
  311.    update();
  312.   }
  313.   private function keyDownHandler(e:KeyboardEvent):void {
  314.    switch(e.keyCode){
  315.     case Keyboard.LEFT:
  316.      keyLeft = true;
  317.      keyRight = false;
  318.      break;
  319.     case Keyboard.RIGHT:
  320.      keyRight = true;
  321.      keyLeft = false;
  322.      break;
  323.     case Keyboard.SPACE:
  324.      keyUp = true;
  325.      break;
  326.     case Keyboard.UP:
  327.      keyRollLeft = true;
  328.      keyRollRight = false;
  329.      break;
  330.     case Keyboard.DOWN:
  331.      keyRollRight = true;
  332.      keyRollLeft = false;
  333.      break;
  334.    }
  335.   }
  336.   private function keyUpHandler(e:KeyboardEvent):void {
  337.    switch(e.keyCode){
  338.     case Keyboard.LEFT:
  339.      keyLeft = false;
  340.      break;
  341.     case Keyboard.RIGHT:
  342.      keyRight = false;
  343.      break;
  344.     case Keyboard.UP:
  345.      keyRollLeft = false;
  346.      break;
  347.     case Keyboard.DOWN:
  348.      keyRollRight = false;
  349.      break;
  350.    }
  351.   }
  352. }
  353. }

相关文章

精彩推荐