Tetris 42

by Cheshir
♥0 | Line 239 | Modified 2016-08-11 17:50:30 | MIT License
play

ActionScript3 source code

/**
 * Copyright Cheshir ( http://wonderfl.net/user/Cheshir )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/4J4e
 */

// forked from lanaxuexihanyu's forked from: Tetris test
// forked from Cheshir's Tetris test
package {
    import flash.geom.Point;
    import flash.filters.GlowFilter;
    import flash.filters.BlurFilter;
    import flash.text.TextField;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;
    import flash.events.MouseEvent;
    import flash.geom.ColorTransform;
    import flash.events.TimerEvent;
    import flash.utils.Timer;
    import flash.geom.Matrix;
    import flash.events.Event;
    import flash.display.BitmapData;
    import flash.display.Bitmap;
    import flash.display.Sprite;
    public class FlashTest extends Sprite {
        private var canvas:Bitmap;
        private var theme:uint = 0x9EFF30;    // Яркий
        private var sub_theme1:uint = 0x2D490E;    // Темный
        private var sub_theme2:uint = 0x5A911B;    // Средний
        
        private var points:uint =0;
        private var field:Array = [];
        private var rows:Array = [];
        
        private var pointsField:TextField = new TextField();
        private var freeBlock:Sprite = new Sprite();    // 1
        private var conectBlock:Sprite = new Sprite();    // 2
        private var deadBlock:Sprite = new Sprite();        // 3
        private var immortalBlock:Sprite = new Sprite();    //  4 
        // Зато пусть они будут управляемы... и взрываются при нажатии...
        private var boombs:uint = 3;
        
        private var timeUpdate:Timer = new Timer(50);
        
        public function FlashTest() {
            // write as3 code here..
            // Так ну окей, еще нужен подсчет очков...
            theme = 0x0086FE;
            sub_theme1 = 0x003E75;
            sub_theme2 = 0x0061B8;
            colorTr = new ColorTransform(0.9,0.9,1);
            
            pointsField.autoSize = 'left';
            pointsField.textColor = theme;
            pointsField.text = '0';
            pointsField.filters = [new GlowFilter(0)];
            
            this.graphics.beginFill(0);
            this.graphics.drawRect(0,0,stage.stageWidth, stage.stageHeight);
            canvas = new Bitmap( new BitmapData(stage.stageWidth, 
                                        stage.stageHeight, true, 0) );
            canvas.x = 20; canvas.y = 20;
            addChild(canvas);
            freeBlock.graphics.lineStyle(2,theme);
            freeBlock.graphics.beginFill(sub_theme1);
            freeBlock.graphics.drawRect(0,0,10,10);
            freeBlock.graphics.endFill();
            freeBlock.graphics.lineStyle();
            freeBlock.graphics.beginFill(sub_theme2);
            freeBlock.graphics.drawRect(3,3,4,4);
            freeBlock.graphics.endFill();
            
            conectBlock.graphics.lineStyle(2,theme);
            conectBlock.graphics.beginFill(sub_theme1);
            conectBlock.graphics.drawRect(0,0,10,10);
            conectBlock.graphics.beginFill(theme);
            conectBlock.graphics.drawRect(3,3,4,4);
            conectBlock.graphics.endFill();
            
            deadBlock.graphics.lineStyle(2, theme);
            deadBlock.graphics.beginFill(sub_theme1);
            deadBlock.graphics.drawRect(0,0,10,10);
            deadBlock.graphics.endFill();
            
            immortalBlock.graphics.lineStyle(2,theme);
            immortalBlock.graphics.drawRect(0,0,10,10);
            immortalBlock.graphics.lineStyle();
            immortalBlock.graphics.beginFill(sub_theme2);
            immortalBlock.graphics.drawRect(3,3,4,4);
            immortalBlock.graphics.endFill();
            
            for(var tx:int=0; tx<42; tx++){
                field.push(new Array());
                rows.push(0);    // Значение строк, чтобы отслеживать очки.
                for(var ty:int=0; ty<42; ty++){    // 0 - пусто
                    field[tx][ty]=0;                // 1 - падающий блок
                }                                    // 2 - статичный блок
            }
            addEventListener(Event.ENTER_FRAME, redraw);
            timeUpdate.addEventListener(TimerEvent.TIMER, tickGame);
            timeUpdate.start();
            stage.addEventListener(KeyboardEvent.KEY_DOWN, correct);
            stage.addEventListener(MouseEvent.CLICK, boomThis);
        }
        private function boomThis(e:MouseEvent):void {
            var mx:int = Math.floor((mouseX-20)/10);
            var my:int = Math.floor((mouseY-20)/10);
            if(field[mx][my]==4 && boombs>0){
                field[mx-1][my-1]=0; field[mx][my-1]=0; field[mx+1][my-1]=0;
                field[mx-1][my]=0; field[mx][my]=0; field[mx+1][my]=0;
                field[mx-1][my+1]=0; field[mx][my+1]=0; field[mx+1][my+1]=0;
                boombs--;
            }
        }

        // Двигаем все кубики влево или вправо... 
        private var pointCell:Point = new Point();
        private function correct(e:KeyboardEvent):void {
            if(e.keyCode == Keyboard.LEFT){
                for(pointCell.x=0; pointCell.x < field.length; pointCell.x++){
                    for(pointCell.y=field[0].length-1; pointCell.y > 0; pointCell.y--){ // Так теперь...
                        if(field[pointCell.x][pointCell.y]!=0 && pointCell.x>0){
                            // Если слева пустая клетка... то перемещаем левее...
                            if(field[pointCell.x-1][pointCell.y]==0){
                                if(field[pointCell.x][pointCell.y]==1){
                                    field[pointCell.x-1][pointCell.y]=1;
                                    field[pointCell.x][pointCell.y]=0;
                                } else if(field[pointCell.x][pointCell.y]==4){
                                    field[pointCell.x-1][pointCell.y]=4;
                                    field[pointCell.x][pointCell.y]=0;
                                }
                            }
                        }
                    }
                }
            } else if(e.keyCode == Keyboard.RIGHT){
                for(pointCell.x=field.length-1; pointCell.x >= 0; pointCell.x-- ){
                    for(pointCell.y=field[0].length-1; pointCell.y > 0; pointCell.y-- ){
                        if(field[pointCell.x][pointCell.y]!=0 && pointCell.x < field.length-1){
                            if(field[pointCell.x+1][pointCell.y]==0){
                                if(field[pointCell.x][pointCell.y]==1){
                                    field[pointCell.x+1][pointCell.y]=1;
                                    field[pointCell.x][pointCell.y]=0;
                                } else if(field[pointCell.x][pointCell.y]==4){
                                    field[pointCell.x+1][pointCell.y]=4;
                                    field[pointCell.x][pointCell.y]=0;
                                }
                            }
                        }
                    }
                }
            } else if(e.keyCode == Keyboard.DOWN){
                for(pointCell.x=0; pointCell.x < field.length; pointCell.x++){
                    for(pointCell.y=0; pointCell.y < field[0].length; pointCell.y++){
                        if(field[pointCell.x][pointCell.y]== 4 && field[pointCell.x][pointCell.y+1] == 0 ){
                            field[pointCell.x][pointCell.y+1] = 4;
                            field[pointCell.x][pointCell.y] = 0;
                        }
                    }
                }
            } else if(e.keyCode == Keyboard.UP){
                for(pointCell.x=0; pointCell.x < field.length; pointCell.x++){
                    for(pointCell.y=0; pointCell.y < field[0].length; pointCell.y++){
                        if(field[pointCell.x][pointCell.y]== 4 && field[pointCell.x][pointCell.y-1] == 0){
                            field[pointCell.x][pointCell.y-1] = 4;
                            field[pointCell.x][pointCell.y] = 0;
                        }
                    }
                }
            }
        }
// Шаг игры...
        private var counter:int = 0;
        private var count100:int = 0;
        private function tickGame(e:TimerEvent):void {
            counter++;
            if(counter==10){ // Каждые 10 шагов добавляются блоки
                counter=0;
                var xpos:int = int(Math.random()*42+1);
                // Хочется больше разнообразия...
                var size:int = Math.round(Math.random()*4*Math.random());
                for(var si:int=0; si<size; si++){
                    field[xpos+si][1] = 1;
                }
                //field[xpos-1][1] = 1;
                // блоки по 2 единички...
            }
            for(var tx:int=field.length-1; tx>=0; tx--){
                for(var ty:int=field[0].length-1; ty>0; ty--){
                    // тут мы обновим положения снизу вверх...
                    // нужно проверить нет ли пустого места и если есть, то двинуть вниз...
                    if(field[tx][ty]==1 && field[tx][ty+1]==0){
                        field[tx][ty]=0;
                        field[tx][ty+1]=1;
                    } else if(field[tx][ty]==1 && field[tx][ty+1]!=0){ // Фиксация блока...
                        field[tx][ty]=Math.round(2+Math.random()*0.6);
                    }
                }
            }
            // Обнулим массив рядов
            for(var nr:int=0; nr<rows.length; nr++){
                rows[nr]=0;
            }
            // Запишем ряды которые набрали 42 кубика
            for(var zx:int=0; zx<field.length; zx++){    // Это колонка
                for(var zy:int=0; zy<field[0].length; zy++){    // Это ряд...
                    if(field[zx][zy]!=0){
                        rows[zy]++;
                    }
                }
            }
            for(var r:int=0; r<rows.length; r++){
                if(rows[r]==42){    // Ряд собран
                    for(var rx:int=0; rx<42; rx++){ // очищаем ряд... ну и можно наверное очков начислить...
                        if(field[rx][r]!=4){
                            points ++;
                            count100 ++;
                            if(count100>=100){
                                boombs++;
                                count100-=100;
                            }
                        }
                        if(field[rx][r]==3){    // 3 станет неубиваемым...
                           field[rx][r]=4;
                        } else {
                            field[rx][r] = 0;
                        }
                        pointsField.x = stage.stageWidth/2-pointsField.width/2;
                    }    // По идее нужно еще превратить все 2 в 1...
                    rows[r]=0;
                    for(var fx:int=0; fx<field.length; fx++){    // Обновляем падение
                        for(var fy:int=0; fy<field[0].length; fy++){
                            if(field[fx][fy]==2){
                                field[fx][fy]=1;
                            }
                        }
                    }
                }
                if(rows[r]>=5 && r == 1){
                    pointsField.text = points+' - game over';
                    timeUpdate.stop();
                    pointsField.y = stage.stageHeight/3;
                    pointsField.x = stage.stageWidth/2 - pointsField.width/2;
                    addChild(pointsField);
                }
            }
        }

// Тут у нас банально отрисовка и всякая красотулька..
        private var m:Matrix = new Matrix();
        private var c:ColorTransform = new ColorTransform(0.9,1,1,0.9);
        private function redraw(e:Event):void {
            //canvas.bitmapData.fillRect(canvas.bitmapData.rect,0x1a000000);
            // colorTransform(bit.rect, new ColorTransform(1, 1, 1, 0.96, red, green, blue, 0));
            canvas.bitmapData.colorTransform(canvas.bitmapData.rect, c);
            for(var tx:int=0; tx<field.length; tx++){
                for(var ty:int=0; ty<field[0].length; ty++){
                    m.tx = tx*10;
                    m.ty = ty*10;
                    if(field[tx][ty]==1){
                        canvas.bitmapData.draw(freeBlock, m);
                    } else if(field[tx][ty]==2){
                        canvas.bitmapData.draw(conectBlock, m);
                    } else if(field[tx][ty]==3){
                        canvas.bitmapData.draw(deadBlock, m);
                    } else if(field[tx][ty]==4){
                        canvas.bitmapData.draw(immortalBlock, m);
                    }
                }
            }
            pointsField.text = points+' you can blow up the moving unit '+boombs;
            canvas.bitmapData.draw(pointsField);
        }
        
    }
}