LoginSignup
1
2

More than 5 years have passed since last update.

テトリスをつくってみました  その2 ソースコードtetris2.js

Last updated at Posted at 2015-12-31

tetris2.js

function blockGenerate () {
    var i = Math.floor ((Math.random() *10 )% SHAPES.length );
    var CopyOfROTATE_CHANGE = deepCopy ( ROTATE_CHANGE) ;
    playerBlock.rotatePattern = CopyOfROTATE_CHANGE [ COLOR [ i ] ];
    var CopyOfTETRIS_BLOCK = deepCopy ( TETRIS_BLOCK [i ] );

    //adjustment: make one time rotation
    var itsShapes = playerBlock.rotatePattern.shift();
    playerBlock.rotatePattern.push (itsShapes );

    return CopyOfTETRIS_BLOCK;  // if it isn't copy but original, occurs bug.
                                                                //start block got wrong shape
}

function checkLine() {

    var line = [];
    for ( var i =0 ; i <RECT_W; i++) {
        for ( var a = 0; a < COLS; a++){
            if ( !Board [a ] [ playerBlock.y + i ] )  {
                break;
            }
            else{
                if ( a == COLS -1) line.unshift( playerBlock.y + i);
            }
        }
    }

    return line;
}


function clearLine ( line ) {
    var i;
    line.sort( function (a, b) {
        return a > b;
        }
    );

    while( i = line.shift() ) {
        for ( var j = 0; j < COLS; j++) {
            for ( var k = i; k >= 0; k--) {
                BoardWithColor [ j ] [ k ].Board    = BoardWithColor [ j ] [ k - 1 ].Board;
                BoardWithColor [ j ] [ k ].Color    = BoardWithColor [ j ] [ k - 1 ].Color;

            }
        }
    }
    render.drawBoard();
}



function start () {


    var     START_PLACE_X = 4, START_PLACE_Y = 0;

    playerBlock.x = START_PLACE_X;
    playerBlock.y = START_PLACE_Y;
    playerBlock.tetrisBlock = blockGenerate ();

    render.drawBlockType ( playerBlock.x, playerBlock.y, playerBlock.tetrisBlock );
    if ( check.overBlock(0, 0) ) gameOver();

}

var timerID;

function gameOver () {
    clearInterval (timerID );
    alert( "gameover") ;
    init();                                     //  clear board and so on.
    start();
}


function Check ()    {

    this.overBlock =
    function overBlock ( offsetX, offsetY, rotate ) {
        var tmpPB = {};
        tmpPB.tetrisBlock = {};

        tmpPB.x = playerBlock.x + offsetX;
        tmpPB.y = playerBlock.y + offsetY;
        if (rotate) {
            tmpPB.tetrisBlock.blockColor = playerBlock.tetrisBlock.blockColor;
            var tmpShapes = deepCopy (playerBlock.rotatePattern);
            tmpPB.tetrisBlock.blockShape = rotateBlock ( tmpShapes );
        }
        else {
            tmpPB.tetrisBlock.blockColor = playerBlock.tetrisBlock.blockColor;
            tmpPB.tetrisBlock.blockShape = playerBlock.tetrisBlock.blockShape;
        }

        for (var i = tmpPB.x, j = tmpPB.y , k = 0;  
        k < tmpPB.tetrisBlock.blockShape.length ; 
        i ++, k++ ) {
                                                            //0123456789
            var a = Math.floor (k/4);       //0000111122223333
            var b = i - a*RECT_W;           //012301230123
            var c = j + a;                          //

//          console.table(Board);
            if ( 
                (Board [ b] [ c ] == 1 && tmpPB.tetrisBlock.blockShape [ k ]  == 1)
            ||  (Board [ b] [ c ] == undefined && tmpPB.tetrisBlock.blockShape [ k ] == 1)
             ) {
                 return true;
             } 
        }
        return false;
}

    function attach () {
        for (var i = playerBlock.x, j = playerBlock.y , k = 0;  
        k < playerBlock.tetrisBlock.blockShape.length ; 
        i ++, k++ , j += k / CUBEUNIT_LENGTH) {
            if ( Board [ i ] [ j + 1 ] == 1
            && playerBlock.tetrisBlock.blockShape [ k ]  == 1 ) {
                return true;
            }
            return false
        }
    }
}


function moveBlock ( offsetX, offsetY, rotate ) {

    if (check.overBlock (offsetX, offsetY, rotate ) ){
        if ( offsetY == 1 ) {
            attachBlock ();
            var line = checkLine();
            if ( line.length  ) clearLine ( line ) ; 
            playerBlock = {};
            start ();
        }

    }
    else {
        var nullBlock ={};
        nullBlock.tetrisBlock = {};
        nullBlock.tetrisBlock.blockColor = INIT_BACKCOLOR;
        nullBlock.tetrisBlock.blockShape = [].concat(playerBlock.tetrisBlock.blockShape );
        render.nullBlock = 'true';
        render.drawBlockType ( playerBlock.x, playerBlock.y, nullBlock.tetrisBlock );
        render.nullBlock = null;

        playerBlock.x += offsetX;
        playerBlock.y += offsetY;
        if ( rotate ) {
            playerBlock.tetrisBlock.blockShape = rotateBlock ( playerBlock.rotatePattern );
        }

        render.drawBoard();     //消した元あったブロック場所に、接するブロックの枠線が消えてしまう みっともない
                                                    //なくても動く
        render.drawBlockType ( playerBlock.x, playerBlock.y, playerBlock.tetrisBlock )

    }
}


function attachBlock () { 

    for ( var i =0, j = playerBlock.y, k = playerBlock.x;
     i < playerBlock.tetrisBlock.blockShape.length;
    i++ , k++) {
         var a = j + Math.floor( i / RECT_W);
         var b = k - Math.floor( i / RECT_W)* RECT_W;

         if ( 1 == playerBlock.tetrisBlock.blockShape [ i ] ) {
             Board [ b ] [ a ] = playerBlock.tetrisBlock.blockShape [ i ];
             BoardWithColor [ b ][ a ].Color = playerBlock.tetrisBlock.blockColor;
        }
    }
}


function gameInit () {
         render = new Render();
         check  = new Check();
         //~ control = new Control();
         //~ block = new Block();
         //~ time = new Time();
         //~ clearLine = new clearLine();
         //~ attach = new Attach();
         //~ gameover = new Gameover;
}

function rotateBlock ( shapes ) {
    var i = shapes.shift();
    shapes.push ( i );

    return i ;
}


function init () {

    // init Board & BoardWithColor
    for (var i = -3;  i < COLS + 3; i ++) {                 // at [ -1 ] [ -1], Board == 0, Color == 0  
        for ( var j = -1; j < ROWS + 3; j++) {
            if ( i < 0 || j >= ROWS || i >= COLS ) Board [ i ] [ j ] = null;
            else if (j < 0) Board [i ] [j ] = 0;
            else Board [ i ] [ j ] = 0; 
            BoardWithColor [ i ] [ j ] .Color =  'white';       // initiate Color

        }
    }

    render.init();


    timerID = setInterval ("moveBlock( 0, 1)", 1550 );

}

gameInit();
init ();
start ();






//function dataBreak () {
    return null;
}

//TETRIS_BLOCK.watch('0', dataBreak);
//TETRIS_BLOCK[0].watch('blockShape', dataBreak);
//TETRIS_BLOCK[0].blockShape.watch('2', dataBreak);
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2