美文网首页
HTML5+JS实现俄罗斯方块

HTML5+JS实现俄罗斯方块

作者: dillqq | 来源:发表于2019-10-12 12:09 被阅读0次

    HTML

       <!DOCTYPE html>
       <html>
          <head>
     <meta http-equiv="Content-Type" content="text/html" charset="utf-            
       8">
    <title>俄罗斯方块</title>
    <script type="text/javascript" src="test.js"/></script>
    <style type="text/css">
    @font-face{
        font-family:tmb;
        src:url("DS-DIGIB.TTF") format("TrueType");
    }
        body>div {
            font-size:13pt;
            padding-bottom:8px;
        }
        span{
            font-family:tmb;
            font-size:20pt;
            color:green;
        }
    </style>
       </head>
     <body>
    <h2>俄罗斯方块</h2>
    <div style="width:336px;border:1px solid 
    black;background:#ff9;">&nbsp;
    <div style="float:left;">速度:<span id="curSpeedEle"> 
    </span>&nbsp;&nbsp;
      当前积分:<span id="curScoreEle"></span></div>
     <div style="float:right;">最高积分:<span id="maxScoreEle"></span> 
      </div>
     </div>
       </body>
       </html>
    

    js

            const TETRIS_ROWS=20;
            const TETRIS_COLS=18;
            const CELL_WIDTH=20;
            const CELL_HEIGHT=20;
            var isPlaying =true;
            //const NO_BLOCK = 0;
            //数据结构 
            var blockArr = [
                [//Z
                    {x: TETRIS_COLS/2 -1 , y:0, color:"red"},
                    {x: TETRIS_COLS/2  , y:0, color:"red"},
                    {x: TETRIS_COLS/2  , y:1, color:"red"},
                    {x: TETRIS_COLS/2+1, y:1, color:"red"}
                ],
                [//反Z
                    {x: TETRIS_COLS/2 +1 , y:0, color:"yellow"},
                    {x: TETRIS_COLS/2  , y:0, color:"yellow"},
                    {x: TETRIS_COLS/2  , y:1, color:"yellow"},
                    {x: TETRIS_COLS/2 -1 , y:1, color:"yellow"}
                ],
                [//田
                    {x: TETRIS_COLS/2 -1 , y:0, color:"red"},
                    {x: TETRIS_COLS/2  , y:0, color:"yellow"},
                    {x: TETRIS_COLS/2 -1 , y:1, color:"yellow"},
                    {x: TETRIS_COLS/2 , y:1, color:"red"}
                ]
            ]
    
            var tetris_status=[];
                for(var i=0 ; i<TETRIS_ROWS ; i++ )
                {
                    tetris_status[i]=[];
                    for(var j=0 ; j<TETRIS_COLS ; j++)
                    {
                        tetris_status[i][j] = "NO_BLOCK";
                    }
                }
    
            var drawBlock = function()
            {
                for(var i=0 ; i<TETRIS_COLS ; i++ )
                {
                    for(var j=0 ; j<TETRIS_ROWS ; j++)
                    {
                        if( tetris_status[j][i] != "NO_BLOCK" )
                        {
                            tetris_ctx.fillStyle = "red";
                            tetris_ctx.fillRect(i*CELL_WIDTH+1, j*CELL_HEIGHT+1, CELL_WIDTH-2, CELL_HEIGHT-2);
                        }else{
                            tetris_ctx.fillStyle = 'white';
                            tetris_ctx.fillRect(i*CELL_WIDTH+1, j*CELL_HEIGHT+1, CELL_WIDTH-2, CELL_HEIGHT-2);
                        }
                        
                    }
                }
            }
    
    
            var createCanvas = function(rows, cols, cellwidth, cellheight)
            {
                tetris_canvas = document.createElement("canvas");
                tetris_canvas.width = cols*cellwidth;
                tetris_canvas.height = rows*cellheight;
                tetris_canvas.style.border = "1px solid black";
                tetris_ctx = tetris_canvas.getContext('2d');
                tetris_ctx.beginPath();
                for(var i = 1 ; i<rows ; i++)
                {
                    tetris_ctx.moveTo(0, i*cellheight);
                    tetris_ctx.lineTo(cols*cellwidth, i*cellheight);
                }
                for(var i=1 ; i <cols; i++)
                {
                    tetris_ctx.moveTo(i*cellwidth, 0);
                    tetris_ctx.lineTo(i*cellwidth, rows*cellheight);
                }
                tetris_ctx.closePath();
                tetris_ctx.strokeStyle = "black";
                tetris_ctx.lineWidth = 1;
                tetris_ctx.stroke();
            }
            var u=0;
            //正在掉落的方块
            var initBlock = function()
            {
                var rand ="";
                rand= 2;
                document.getElementById("maxScoreEle").innerHTML =" "+ rand;
                currentFall = 
                [
                    {x: blockArr[rand][0].x , y:blockArr[rand][0].y , color:blockArr[rand][0].color},
                    {x: blockArr[rand][1].x , y:blockArr[rand][1].y , color:blockArr[rand][1].color},
                    {x: blockArr[rand][2].x , y:blockArr[rand][2].y , color:blockArr[rand][2].color},
                    {x: blockArr[rand][3].x , y:blockArr[rand][3].y , color:blockArr[rand][3].color}
                    
                ]
            }
    
            var moveDown = function()
            {
                var canDown = true;
                for (var i=0; i<currentFall.length;i++){
                    var cur = currentFall[i]
                    tetris_ctx.fillStyle="red";
                    tetris_ctx.fillRect(cur.x*CELL_WIDTH+1, cur.y*CELL_HEIGHT+1,
                            CELL_WIDTH-2, CELL_HEIGHT-2);
                            setTimeout(function(){}, 200);
                }
                for (var i=0; i<currentFall.length;i++){
                    var cur = "white";
                    tetris_ctx.fillStyle="white";
                    tetris_ctx.fillRect(cur.x*CELL_WIDTH+1, cur.y*CELL_HEIGHT+1,
                            CELL_WIDTH-2, CELL_HEIGHT-2);
                }
                
                
                for(var i=0 ; i<currentFall.length; i++)
                {
                    var cur = currentFall[i];
                    if(cur.y+1>= TETRIS_ROWS)
                    {
                        document.getElementById("curSpeedEle").innerHTML="1";
                        canDown = false;
                        break;
                    }
                    if(tetris_status[cur.y+1][cur.x] != "NO_BLOCK")
                    {
                        document.getElementById("curSpeedEle").innerHTML=cur.x;
                        canDown = false;
                        break;
                    }
                }
                if(canDown)
                {
                    for (var i = 0; i<currentFall.length; i++)
                    {
                        var cur = currentFall[i];
                        tetris_ctx.fillStyle = "white";
                        tetris_ctx.fillRect(cur.x*CELL_WIDTH+1, cur.y*CELL_HEIGHT+1,
                        CELL_WIDTH-2, CELL_HEIGHT-2);
                        tetris_status[cur.y][cur.x] = "NO_BLOCK";
                        // tetris_status[cur.y][cur.x]="NO_BLOCK";
                        
                    }
                    for(var i=0; i<currentFall.length; i++)
                    {
                        var cur = currentFall[i]
                        cur.y++;
                        document.getElementById("maxScoreEle").innerHTML=cur.y;
                    }
                    for(var i=0; i<currentFall.length; i++)
                    {
                        var cur = currentFall[i];
                        tetris_ctx.fillStyle = "red";
                        tetris_ctx.fillRect(cur.x*CELL_WIDTH+1, cur.y*CELL_HEIGHT+1,
                        CELL_WIDTH-2, CELL_HEIGHT-2);
                        // tetris_status[cur.y][cur.x]="red";
                    }
                }else
                {
                    // for(var k=0; k<currentFall.length; k++)
                    // {
                        // var cur = currentFall[k];
                        // tetris_status[cur.y][cur.x] = "red";
                    // }
                    for(var i=0; i<currentFall.length; i++)
                    {
                        var cur = currentFall[i];
                        // confirm(canDown);
                        if(cur.y<=0)
                        {
                            localStorage.removeItem("curScore");
                            localStorage.removeItem("tetris_status");
                            localStorage.removeItem("curSpeed");
                            if(confirm("你已经输了"+cur.y))
                            {
                                maxScore = localStorage.getItem("maxScore");
                                maxScore = maxScore == null ? 0: parseInt(maxScore);
                                if(curScore >= maxScore)
                                {
                                    localStorage.setItem("maxScore", curScore);
                                }
                            }
                            isPlaying = false;
                            clearInterval(curTimer);
                            return;
                        }
                        // if(cur.x>TETRIS_COLS&&cur.y>TETRIS_ROWS)
                        // {
                             tetris_status[cur.y][cur.x] = "red";
                        // }
                    
                    }
                    lineFull();
                    // document.getElementById("curSpeedEle").innerHTML=u++;
                    
                    // localStorage .setItem("tetris_status", JSON.stringify(tetris_status));
                    initBlock();
                }
            }
            var lineFull = function()
            {
                for (var i=0; i< TETRIS_ROWS ; i++)
                {
                    var flag = true;
                    for(var j=1; j<TETRIS_COLS; j++)
                    {
                        if(tetris_status[i][j] == "NO_BLOCK")
                        {
                            flag = false;
                            break;
                        }
                    }
                    if(flag)
                    {
                        confirm("10");
                        curScoreEle.innerHTML =curScore+= 100;
                        localStorage.setItem("curScore", curScore);
                        if(curScore >= curSpeed*curSpeed*500)
                        {
                            curSpeedEle.innerHTML = curSpeed+=1
                            localStorage.setItem("curSpeed", curSpeed);
                            clearInterval(curTimer);
                            curTimer = setInterval("moveDown", 500*curSpeed);
                        }
                    
                        for(var k=i ;k >0 ;k--)
                        {
                            for(var l =0; l<TETRIS_COLS; l++)
                            {
                                tetris_status[k][l] = tetris_status[k-1][l];
                            }
                        }
                        drawBlock();
                    }
                }
                
            }
            var moveLeft = function()
            {
                var canLeft = true;
                for(var i=0 ; i<currentFall.length; i++)
                {
                    if(currentFall[i].x <=0)
                    {
                        canLeft = false;
                        break;
                    }
                    if(tetris_status[currentFall[i].y][currentFall[i].x-1] != "NO_BLOCK")
                    {
                        canLeft = false;
                        break
                    }
                }
                if(canLeft)
                {
                    for(var i=0 ; i<currentFall.length; i++)
                    {
                        var cur = currentFall[i];
                        tetris_ctx.fillStyle = "white";
                        tetris_ctx.fillRect(cur.x*CELL_WIDTH+2, cur.y*CELL_HEIGHT+2,
                        CELL_WIDTH-2, CELL_HEIGHT-2);
                    }
                    for(var i=0 ; i<currentFall.length; i++)
                    {
                        var cur = currentFall[i];
                        cur.x-=1;
                    }
                    for( var i=0; i<currentFall.length; i++)
                    {
                        var cur = currentFall[i];
                        tetris_ctx.fillStyle = cur.color;
                        tetris_ctx.fillRect(cur.x*CELL_WIDTH+2, cur.y*CELL_HEIGHT+2,
                        CELL_WIDTH-2, CELL_HEIGHT-2);
                    }
                }
            }
    
    
    
            var moveRight = function()
            {
                var canRight = true;
                for(var i=0 ; i<currentFall.length; i++)
                {
                    if(currentFall[i].x >=TETRIS_COLS)
                    {
                        canRight = false;
                        break;
                    }
                    if(tetris_status[currentFall[i].y ][currentFall[i].x +1] != "NO_BLOCK")
                    {
                        canRight = false;
                        break
                    }
                }
                if(canRight)
                {
                    for(var i=0 ; i<currentFall.length; i++)
                    {
                        var cur = currentFall[i];
                        tetris_ctx.fillStyle = "white";
                        tetris_ctx.fillRect(cur.x*CELL_WIDTH+2, cur.y*CELL_HEIGHT+2,
                        CELL_WIDTH-2, CELL_HEIGHT-2);
                    }
                    for(var i=0 ; i<currentFall.length; i++)
                    {
                        var cur = currentFall[i];
                        cur.x+=1;
                    }
                    for( var i=0; i<currentFall.length; i++)
                    {
                        var cur = currentFall[i];
                        tetris_ctx.fillStyle = currentFall[i].color;
                        tetris_ctx.fillRect(cur.x*CELL_WIDTH+2, cur.y*CELL_HEIGHT+2,
                        CELL_WIDTH-2, CELL_HEIGHT-2);
                    }
                }
            }
            var rotate = function()
            {
                var canRotate = true;
                for(var i=0; i<currentFall.length; i++)
                {
                    var preX = currentFall[i].x;
                    var preY = currentFall[i].y;
                    if(i!=2)
                    {
                        var afterRotateX = currentFall[2].x+ preY-currentFall[2].y;
                        var afterRotateY = currentFall[2].y+currentFall[2].x-preX;
                        if(tetris_status[afterRotateX][afterRotateY]!="NO_BLOCK")
                        {
                            canRotate = false;
                            break
                        }
                        if(afterRotateX<0&&afterRotateX>TETRIS_COLS-1&&afterRotateY<0&&afterRotateY>TETRIS_ROWS)
                        {
                            canRotate = false;
                            break
                        }
                        // 
                        // if(tetris_status[afterRotateX][afterRotateY-1]!="NO_BLOCK")
                        // {
                            // canRotate = false;
                            // break
                        // }
                    // if(tetris_status[afterRotateX+1][afterRotateY]!="NO_BLOCK")
                        // {
                            // canRotate = false;
                            // break
                        // }
                    }
                }
                if(canRotate)
                {
                    document.getElementById("maxScoreEle").innerHTML="OK";
                    for(var i=0 ; i<currentFall.length; i++)
                    {
                        var cur = currentFall[i];
                        tetris_ctx.fillStyle = "white";
                        tetris_ctx.fillRect(cur.x*CELL_WIDTH+2, cur.y*CELL_HEIGHT+2,
                        CELL_WIDTH-2, CELL_HEIGHT-2);
                    }
                    for(var i=0 ; i<currentFall.length; i++)
                    {
                        var preX = currentFall[i].x;
                        var preY = currentFall[i].y;
                        if(i!=2)
                        {
                            currentFall[i].x = currentFall[2].x+ preY-currentFall[2].y;
                            currentFall[i].y = currentFall[2].y+currentFall[2].x-preX;
                        }
                    }
                    for( var i=0; i<currentFall.length; i++)
                    {
                        var cur = currentFall[i];
                        tetris_ctx.fillStyle = currentFall[i].color;
                        tetris_ctx.fillRect(cur.x*CELL_WIDTH+2, cur.y*CELL_HEIGHT+2,
                        CELL_WIDTH-2, CELL_HEIGHT-2);
                        // tetris_status[cur.y][cur.x]="red";
                    }
                }
            }
            window.onkeydown = function(evt)
            {
                switch(evt.keyCode)
                {
                    case 40:
                        if(!isPlaying)
                            return;
                        moveDown();
                        break;
                    case 37:
                        if(!isPlaying)
                            return;
                        moveLeft();
                        break;
                    case 39:
                        if(!isPlaying)
                            return;
                        moveRight();
                        break;
                    case 38:
                        if(!isPlaying)
                            return; 
                        rotate();
                        break;
                }
            }
    
            window.onload = function()
            {
                localStorage.removeItem("tetris_status");
                createCanvas(TETRIS_ROWS,TETRIS_COLS,CELL_WIDTH,CELL_HEIGHT);
                document.body.appendChild(tetris_canvas);
                curScoreEle = document.getElementById("curScoreEle");
                curSpeedEle = document.getElementById("curSpeedEle");
                maxScoreEle = document.getElementById("maxScoreEle");
                var tmpStatus = localStorage.getItem("tetris_status");
                tetris_status = tmpStatus == null ? tetris_status: JSON.parse(tmpStatus);
                drawBlock();    
                curScore = localStorage.getItem("curScore");
                curScore = curScore == null ? 0: parseInt(curScore);
                curScoreEle.innerHTML = curScore;
                maxScore = localStorage.getItem("maxScore");
                maxScore = maxScore == null ? 0: parseInt(maxScore);
                maxScoreEle.innerHTML = maxScoreEle;
                curSpeed = localStorage.getItem("curScore");
                curSpeed = curSpeed == null ? 1: parseInt(curSpeed);
                curScoreEle.innerHTML = curSpeed;
                initBlock();
                curTimer = setInterval("moveDown();", 500);
            }
    
    捕获.PNG

    来自于疯狂的HTML+CSS+JS的最后一个项目有所修改。

    相关文章

      网友评论

          本文标题:HTML5+JS实现俄罗斯方块

          本文链接:https://www.haomeiwen.com/subject/nnlqmctx.html