美文网首页web前端学习互联网科技让前端飞
童年经典,开发俄罗斯方块小游戏

童年经典,开发俄罗斯方块小游戏

作者: 烟雨丿丶蓝 | 来源:发表于2018-03-06 14:07 被阅读19次
    俄罗斯方块
    web前端群,189394454,有视频、源码、学习方法等大量干货分享

    👇html代码:

        <table id="gameBoard"></table>
        <div id="gameControl">
            分数: <span id="score">0</span><br /> <input type="button"
                id="btnPlay" value="开始" /> <input type="button" id="btnPause"
                value="暂停" /><br /> <span>俄罗斯方块</span>
        </div>
    

    👇css代码:

    <style type="text/css">
    body {
        width: 530px;
        background: #006030;
        margin: 20px auto
    }
    
    table#gameBoard {
        border: 1px solid black;
        border-collapse: collapse;
        float: left;
    }
    
    table#gameBoard td {
        width: 30px;
        height: 30px;
        border: 1px dotted #0cc;
    }
    
    div#gameControl {
        widows: 160;
        float: right;
        height: 200px;;
        line-height: 200px;
    }
    
    .font {
        font-family: '微软雅黑';
        font-size: 18px;
        text-align: center;
    }
    
    div input {
        width: 60px;
        height: 25px;
    }
    </style>
    

    👇javascript代码:

    <script type="text/javascript">    
        var T = TETRIS = {    
            aBoardGrids : [],    
            aShapes: [    
                [0xCC00],     
                [0x8888, 0xF00],     
                [0x8C40, 0x6C00],     
                [0x4C80, 0xC600],     
                [0x44C0, 0x8E00, 0xC880, 0xE200],     
                [0x88C0, 0xE800, 0xC440, 0x2E00],     
                [0x4E00, 0x8C80, 0xE400, 0x4C40]    
            ],        
            //代表所有方块的形状数    
            init : function(){    
                this.oDomBoard = document.getElementById("gameBoard");    
                this.oDomScore = document.getElementById("score");    
                this.aBoardGrids = new Array(18);    
                for (var rows = 0 ; rows < 18 ; rows++){    
                    this.aBoardGrids[rows] = new Array(10);    
                    var oDomTr = this.oDomBoard.insertRow(-1);    
                    for (var cols = 0 ; cols < 10 ; cols++){    
                        this.aBoardGrids[rows][cols] = 0;    
                        oDomTr.insertCell(cols);    
                    }    
                }    
                document.onkeydown = function(keyEvent){    
                    keyEvent = keyEvent || window.event;    
                    var ikeyNum = keyEvent.which || keyEvent.keyCode;    
                    switch(ikeyNum){    
                        case 37://←    
                            T.oBlock.move("left");    
                            break;    
                        case 38://↑     
                            T.oBlock.rotate((function (){    
                                var vShape      = T.aShapes[T.iShapeIdx][ (++T.index)%T.aShapes[T.iShapeIdx].length];    
                                var sShape      = vShape.toString(2);                                   
                                sShape          = new Array(17 - sShape.length).join(0) + sShape;       
                                T.matrix        = sShape.match(/\d{4}/g);       
                                return T.matrix;    
                            })());  //变形    
                            break;    
                        case 39://→    
                            T.oBlock.move("right");    
                            break;    
                        case 40://↓    
                            T.oBlock.move("down");    
                            break;    
                    }    
                };    
            },    
            next : function (){    
                    
                this.iShapeIdx  = parseInt(Math.random() * this.aShapes.length);    
                this.index      = 0;    
                var vShape      = this.aShapes[this.iShapeIdx][this.index];    
                var sShape      = vShape.toString(2);                               //将16进制转换为二进制    
                sShape          = new Array(17 - sShape.length).join(0) + sShape;   //不够16位,在前面用0补全     
                this.matrix     = sShape.match(/\d{4}/g);                           //利用正则表达式匹配    
        
                this.oBlock = new TETRIS.Block(this.matrix);    
                            
                clearInterval(T.timer);    
                //注册定时器    
                T.timer = setInterval(function (){    
                    T.oBlock.move("down");    
                }, 1000);    
                    
                if( !T.oBlock.checkBlock() ){    
                    alert("游戏结束");    
                    clearInterval(T.timer);    
                    
                }    
            },    
            updateBoard : function (){      //更新面板    
                for(var i = 0 ; i < 4 ; i++){    
                    this.aBoardGrids[T.oBlock.shape[i].y][T.oBlock.shape[i].x] = 1;    
                }    
            },    
            eraseLines : function (){    
                var iLines = 0;    
                for(var j = 17 ; j >= 0 ; j--){    
                    var num = 0;    
                    for(var i = 0 ; i< 10 ; i++){    
                        if(this.aBoardGrids[j][i] == 1)    
                            num ++;    
                    }    
                    if(num == 10){    
                        iLines ++;    
                        for(var m = 0 ; m < i ; m++){    
                            for(var n = j ; n > 0 ; n--){    
                                this.aBoardGrids[n][m] = this.aBoardGrids[n-1][m];    
                                T.oDomBoard.rows[n].cells[m].style.background = T.oDomBoard.rows[n-1].cells[m].style.background;    
                            }    
                            this.aBoardGrids[0][m] = 0;    
                        }    
                        j++;    
                    }    
                }    
                return iLines;    
            },    
            setScore : function (iLines){    
                var iScore = parseInt(this.oDomScore.innerHTML);    
                if(iLines == 1){    
                    iScore += 100;    
                } else if(iLines == 2){    
                    iScore += 300;    
                } else if(iLines == 3){    
                    iScore += 500;    
                } else if(iLines == 4){    
                    iScore += 1000;    
                }    
                this.oDomScore.innerHTML = iScore;    
            }    
        };    
            
        TETRIS.Block = function (matrix){    
        
            this.shape = (function(){    
                    
                var aShape = [];    
                for(var i = 0 ; i < matrix.length ; i++){    
                    var sValue = matrix[i];    
                    for(var j = 0 ; j < sValue.length ; j++){    
                        if(sValue.charAt(j) == "1"){    
                            aShape.push({ x : j+3 , y : i });    
                        }      
                    }    
                }    
                return aShape;    
                    
            })();    
            this.draw();    
        };    
            
        TETRIS.Block.prototype.move = function (direction){//移动    
            if(this.checkBlock(this.shape,direction)){    
                this.draw("clear");    
                for(var i = 0 ; i < 4 ; i++){    
                    switch(direction){    
                        case "left"://←     
                            this.shape[i].x--;    
                            break;    
                        case "right":    
                            this.shape[i].x++;    
                            break;    
                        case "down":    
                            this.shape[i].y++;    
                            break;    
                    }    
                }    
                this.draw();    
            } else {    
                if(direction == "down"){    
                    this.draw();    
                    T.updateBoard();    //更新面板    
                    var iLines = T.eraseLines();    
                        
                    if(iLines > 0){    
                        T.setScore(iLines);    
                    }    
                    T.next();           //再生成一个新的方块    
                }    
            }    
        };    
        TETRIS.Block.prototype.rotate = function (matrix){//变形    
            this.shape = (function(oBlock){    
                var aX = [];    
                var aY = [];    
                for(var i = 0 ; i < 4 ; i++){    
                    aX.push(oBlock.shape[i].x);    
                    aY.push(oBlock.shape[i].y);    
                }    
                var iMinX = aX.getMin();    
                var iMinY = aY.getMin();    
                var aShape = [];    
                for(var i = 0 ; i < matrix.length ; i++){    
                    var sValue = matrix[i];    
                    for(var j = 0 ; j < sValue.length ; j++){    
                        if(sValue.charAt(j) == "1"){    
                            aShape.push({ x : j+iMinX , y : i+iMinY });    
                        }      
                    }    
                }    
                if( !( oBlock.checkBlock(aShape)) )    
                    return oBlock.shape;    
                oBlock.draw("clear");    
                return aShape;    
            })(this);    
            this.draw();    
        };    
        
        TETRIS.Block.prototype.draw = function (opt){//绘图    
            for(var i = 0 ; i < this.shape.length ; i++){    
                var oShape = this.shape[i];    
                T.oDomBoard.rows[oShape.y].cells[oShape.x].style.background = (opt==undefined?"#09F":"");    
            }    
        };    
        TETRIS.Block.prototype.checkBlock = function (shape, direction){    
            shape = shape || this.shape;    
            for(var i = 0 ; i < 4 ; i++){    
                if(direction == "left"){    
                        if(shape[i].x == 0 || T.aBoardGrids[shape[i].y][shape[i].x - 1] == 1){    
                            return false;    
                        }    
                } else if(direction == "right"){    
                        if(shape[i].x == 9 || T.aBoardGrids[shape[i].y][shape[i].x + 1] == 1){    
                            return false;    
                        }    
                } else if(direction == "down"){    
                        if(shape[i].y == 17 || T.aBoardGrids[shape[i].y + 1][shape[i].x] ==1){    
                            return false;    
                        }    
                }    
                if(shape[i].x < 0 || shape[i].x > 9 || shape[i].y < 0 || shape[i].y > 17)    
                    return false;    
                if(T.aBoardGrids[shape[i].y][shape[i].x] == 1){    
                    return false;    
                };    
            }    
            return true;    
        }    
        Array.prototype.getMin = function (){    
            var iMin = this[0];    
            for(var i = 0 ; i < this.length ; i++){    
                if(this[i] < iMin)    
                    iMin = this[i];    
            }    
            return iMin;    
        }    
        window.onload = function(){    
            T.init();    
            var oBtnPlay = document.getElementById("btnPlay");    
            oBtnPlay.onclick = function(){    
                if(this.value == "开始"){    
                    T.next();    
                    this.value = "结束";    
                } else {    
                    this.value = "开始";    
                    alert("游戏结束");    
                    clearInterval(T.timer);    
                }     
            }       
            var oBtnPause = document.getElementById("btnPause");    
            oBtnPause.onclick = function (){    
                if(this.value == "暂停"){    
                    clearInterval(T.timer);    
                    this.value = "继续";    
                } else {    
                    T.timer = setInterval(function (){    
                        T.oBlock.move("down");    
                    }, 1000);    
                    this.value = "暂停";    
                };    
            };    
        
        };    
    </script>
    

    相关文章

      网友评论

        本文标题:童年经典,开发俄罗斯方块小游戏

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