canvas标签应用 简单俄罗斯方块游戏的实现

来源:互联网 发布:万方数据库怎么查论文 编辑:程序博客网 时间:2024/05/21 18:43
<!DOCTYPE HTML><body>    <canvas id="Tetris_canvas" width="100px" height="150px" />    <script type="text/javascript">        function BackGround()        {            var init = function()            {                var obj = document.getElementById("Tetris_canvas");                var cxt = obj.getContext("2d");                cxt.fillStyle = "#E8FFFF";                cxt.strokeStyle = "#000000";                cxt.fillRect(0,0,obj.width,obj.height);                cxt.strokeRect(0,0,obj.width,obj.height);            }            init();        }        function Tetris()        {            var self = this;            var g_arCurPoint = new Array();            var g_arGame = [           /********0,1,2,3,4,5,6,7,8,9 */           /*00*/   0,0,0,0,0,0,0,0,0,0,            /*01*/   0,0,0,0,0,0,0,0,0,0,           /*02*/   0,0,0,0,0,0,0,0,0,0,           /*03*/   0,0,0,0,0,0,0,0,0,0,           /*04*/   0,0,0,0,0,0,0,0,0,0,           /*05*/   0,0,0,0,0,0,0,0,0,0,           /*06*/   0,0,0,0,0,0,0,0,0,0,           /*07*/   0,0,0,0,0,0,0,0,0,0,           /*08*/   0,0,0,0,0,0,0,0,0,0,           /*09*/   0,0,0,0,0,0,0,0,0,0,           /*10*/   0,0,0,0,0,0,0,0,0,0,           /*11*/   0,0,0,0,0,0,0,0,0,0,           /*12*/   0,0,0,0,0,0,0,0,0,0,           /*13*/   0,0,0,0,0,0,0,0,0,0,           /*14*/   0,0,0,0,0,0,0,0,0,0            ];            this.curGraph;            this.makeGarph = function(){                var n = parseInt(Math.random()*6);                self.curGraph = n;                var flag = 0;                switch(n){                case 0:{//横条 4格                    //记录图形所占区域位置                    if(g_arGame[3]==1 || g_arGame[4]==1 || g_arGame[5]==1 || g_arGame[6]==1 )flag=1;                    g_arCurPoint[0] = 3;                    g_arCurPoint[1] = 4;                    g_arCurPoint[2] = 5;                    g_arCurPoint[3] = 6;                };break;                case 1:{//一点 1格                    if(g_arGame[5]==1)flag=1;                    g_arCurPoint[1] = 5;                    g_arCurPoint[0] = -1;                    g_arCurPoint[2] = -1;                    g_arCurPoint[3] = -1;                };break;                case 2:{//1+3组合(轴对称)  4格                    if(g_arGame[5]==1 || g_arGame[14]==1 || g_arGame[15]==1 || g_arGame[16]==1 )flag=1;                    g_arCurPoint[0] = 5;                    g_arCurPoint[1] = 15;                    g_arCurPoint[2] = 14;                    g_arCurPoint[3] = 16;                };break;                case 3:{//1+3组合(非对称) 4格                    if(g_arGame[4]==1 || g_arGame[14]==1 || g_arGame[15]==1 || g_arGame[16]==1 )flag=1;                    g_arCurPoint[0] = 4;                    g_arCurPoint[1] = 14;                    g_arCurPoint[2] = 15;                    g_arCurPoint[3] = 16;                };break;                case 4:{//1+3 (点对称)    4格                    if(g_arGame[4]==1 || g_arGame[5]==1 || g_arGame[15]==1 || g_arGame[16]==1 )flag=1;                    g_arCurPoint[0] = 4;                    g_arCurPoint[1] = 5;                    g_arCurPoint[2] = 15;                    g_arCurPoint[3] = 16;                };break;                case 5:{//2+2 (点对称)    4格                    if(g_arGame[5]==1 || g_arGame[6]==1 || g_arGame[15]==1 || g_arGame[16]==1 )flag=1;                    g_arCurPoint[0] = 5;                    g_arCurPoint[1] = 6;                    g_arCurPoint[2] = 15;                    g_arCurPoint[3] = 16;                };break;                }                if(flag == 1){                    alert("游戏结束");                    window.clearInterval(self.id);                }            }            this.moveLeft = function(){                var minLeft = 9;                for(var i=0;i<g_arCurPoint.length;i++){                    var temp = parseInt(g_arCurPoint[i]%10);                    if(temp < minLeft)minLeft = temp;                }                if(minLeft == 0)return;                for(var i=0;i<4;i++){                    if(g_arCurPoint[i] != -1)g_arCurPoint[i] = g_arCurPoint[i]-1;                }            }            this.moveRight = function(){                var maxRight = 0;                for(var i=0;i<4;i++){                    if(g_arCurPoint[i] != -1){                        var temp = parseInt(g_arCurPoint[i]%10);                        if(temp > maxRight)maxRight = temp;                    }                }                if(maxRight == 9)return;                for(var i=0;i<4;i++){                    if(g_arCurPoint[i] != -1)g_arCurPoint[i]++;                }            }            this.cnt = 1;            this.moveDown = function(){                //alert(self.cnt++);                var flag = 0;                for(var i=0;i<4;i++){                    if(g_arCurPoint[i] != -1){                        var nx = parseInt(g_arCurPoint[i]%10);                        var ny = parseInt(g_arCurPoint[i]/10);                        if(g_arGame[(ny+1)*10+nx] == 1 || ny == 14){                            flag = 1;                            break;                        }                                            }                }                if(flag == 0){//向下移动                    for(var i=0;i<4;i++){                        if(g_arCurPoint[i] != -1){                            var nx = parseInt(g_arCurPoint[i]%10);                            var ny = parseInt(g_arCurPoint[i]/10);                            g_arCurPoint[i] = (ny+1)*10+nx;                        }                    }                }else{//停止移动了                    for(var i=0;i<4;i++){                        if(g_arCurPoint[i] != -1){                            g_arGame[g_arCurPoint[i]] = 1;                        }                    }                    //消除已经完成的行                    self.clear();                    //新物体出现                    self.makeGarph();                }                //绘制图形                var obj=document.getElementById("Tetris_canvas");                var cxt = obj.getContext("2d");                                for(var i=0;i<g_arGame.length;i++){                    var x = parseInt(i%10);                    var y = parseInt(i/10);                    if(g_arGame[i] == 1){                        cxt.fillStyle = "#00FF00";                        cxt.strokeStyle = "#000000";                    }else{                        cxt.fillStyle = "#E8FFFF";                        cxt.strokeStyle = "#E8FFFF";                    }                    cxt.fillRect(x*10,y*10,10,10);                    cxt.strokeRect(x*10,y*10,10,10);                                        cxt.strokeStyle = "#000000";                    cxt.strokeRect(0,0,obj.width,obj.height);                                    }                for(var i=0;i<4;i++){                    if(g_arCurPoint[i] != -1){                        var nx = parseInt(g_arCurPoint[i]%10);                        var ny = parseInt(g_arCurPoint[i]/10);                        cxt.fillStyle = "#FF0000";                        cxt.strokeStyle = "#000000";                        cxt.fillRect(nx*10,ny*10,10,10);                        cxt.strokeRect(nx*10,ny*10,10,10);                    }                    }                window.onkeydown = function(event){                    var code = event.keyCode;                    switch(code){                    case 37:self.moveLeft();break;                    case 39:self.moveRight();break;                    case 40:self.moveDown();break;                    case 38:self.turn();break;                    }                }            }            this.clear = function(){                for(var i=15;i>=1;){                    var count = 0;                    for(var j=0;j<10;j++){                        if(g_arGame[i*10+j] == 1)count++;                    }                    if(count == 10){                        for(var k=i;k>=1;k--){                            for(var s=0;s<10;s++){                                g_arGame[k*10+s] = g_arGame[(k-1)*10+s];                            }                        }                    }else{                        i--;                    }                }            }            this.turn = function(){                var maxRight = 0;                var minLeft = 9;                for(var i=0;i<4;i++){                    if(g_arCurPoint[i] != -1){                        var temp = parseInt(g_arCurPoint[i]%10);                        if(temp > maxRight)maxRight = temp;                    }                }                for(var i=0;i<g_arCurPoint.length;i++){                    var temp = parseInt(g_arCurPoint[i]%10);                    if(temp < minLeft)minLeft = temp;                }                if(maxRight == 9 || minLeft == 0)return;                switch(self.curGraph){                case 0:{//横条                    var bY = false;                    var nx = parseInt(g_arCurPoint[1]%10);//第二点X坐标                    var ny = parseInt(g_arCurPoint[1]/10);//第二点Y坐标                    if(g_arCurPoint[0]%10 == g_arCurPoint[1]%10)bY = true;                    if(bY){//竖向                        if(nx < 2 || ny < 1) return;                        for(var i=0;i<4;i++){                            if(g_arCurPoint[i] != -1)                                g_arGame[g_arCurPoint[i]] = 0;                        }                        g_arCurPoint[0] = ny*10 + nx-1;                        g_arCurPoint[1] = ny*10 + nx;                        g_arCurPoint[2] = ny*10 + nx+1;                        g_arCurPoint[3] = ny*10 + nx+2;                                                                        g_arGame[ny*10 + nx-1] = 2;                        g_arGame[ny*10 + nx]   = 2;                        g_arGame[ny*10 + nx+1] = 2;                        g_arGame[ny*10 + nx+2] = 2;                    }else{//横向                        for(var i=-1;i<=2;i++){                            for(var j=-1;j<=2;j++){                                if(g_arGame[(ny+i)*10+nx+j] == 1)return;                            }                        }                        g_arCurPoint[0] = (ny-1)*10 + nx;                        g_arCurPoint[1] = ny*10 + nx;                        g_arCurPoint[2] = (ny+1)*10 + nx;                        g_arCurPoint[3] = (ny+2)*10 + nx;                                                                    }                                     };break;                case 2:{//1+3 轴对称                    var nx = parseInt(g_arCurPoint[1]%10);//第二点X坐标                    var ny = parseInt(g_arCurPoint[1]/10);//第二点Y坐标                    for(var i=-1;i<2;i++){                        for(var j=-1;j<2;j++){                            if(g_arGame[(ny+j)*10+(nx+i)]==1)return;                        }                    }                    var x,y;                    if(g_arCurPoint[0]%10 == g_arCurPoint[1]%10){                        x = nx;                        if(g_arCurPoint[0]/10 > g_arCurPoint[1]/10)y=ny-1;                        else y=ny+1;                    }else{                        y = ny;                        if(g_arCurPoint[0]%10 > g_arCurPoint[1]%10)x=nx-1;                        else x=nx+1;                    }                                        var temp = g_arCurPoint[0];                    g_arCurPoint[0] = g_arCurPoint[3];                    g_arCurPoint[1] = g_arCurPoint[1];                    g_arCurPoint[2] = temp;                    g_arCurPoint[3] = y*10+x;                                    };break;                case 3:{//1+3                     var nx = parseInt(g_arCurPoint[1]%10);//第二点X坐标                    var ny = parseInt(g_arCurPoint[1]/10);//第二点Y坐标                    for(var i=-2;i<=2;i++){                        for(var j=-2;j<=2;j++){                            if(g_arGame[(ny+j)*10+(nx+i)]==1)return;                        }                    }                    var x,y,x1,y1;                    if(g_arCurPoint[1]%10 == g_arCurPoint[0]%10){                        x = nx;                        x1 = nx;                        if(g_arCurPoint[1]/10 > g_arCurPoint[0]/10){                            y=ny+1;                            y1 = ny+2;                        }else{                            y = ny-1;                            y1 = ny-2;                        }                    }else{                        y = ny;                        y1 = ny;                        if(g_arCurPoint[1]%10 > g_arCurPoint[0]%10){                            x=nx+1;                            x1 = nx+2;                        }else{                            x=nx-1;                            x1 = nx-2;                        }                    }                    g_arCurPoint[0] = g_arCurPoint[2];                    g_arCurPoint[1] = g_arCurPoint[1];                    g_arCurPoint[2] = (y*10+x);                    g_arCurPoint[3] = (y1*10+x1);                                    };break;                case 4:{                    if(minLeft == 1)return;                    var nx = parseInt(g_arCurPoint[1]%10);//第二点X坐标                    var ny = parseInt(g_arCurPoint[1]/10);//第二点Y坐标                    for(var i=-1;i<2;i++){                        for(var j=-1;j<2;j++){                            if(g_arGame[(ny+j)*10+(nx+i)]==1)return;                        }                    }                    var x1,y1,x2,y2,x3,y3;                    if(g_arCurPoint[0]%10 == g_arCurPoint[1]%10){                        if(g_arCurPoint[1]/10 > g_arCurPoint[0]/10){                            x1 = nx+1;                            y1 = ny;                            x2 = nx-1;                            y2 = ny-1;                                                    }else{                            x1 = nx-1;                            y1 = ny;                            x2 = nx+1;                            y2 = ny+1;                                                    }                                            }else{                        if(g_arCurPoint[1]%10 > g_arCurPoint[0]%10){                            x1 = nx;                            x2 = nx-1;                            y1 = ny-1;                            y2 = ny+1;                        }else{                            x1 = nx;                            x2 = nx+1;                            y1 = ny+1;                            y2 = ny-1;                        }                    }                      g_arCurPoint[2] = g_arCurPoint[0]                    g_arCurPoint[0] = (y1*10+x1);                    g_arCurPoint[1] = g_arCurPoint[1];                    g_arCurPoint[3] = (y2*10+x2);                };break;                }            }            self.makeGarph();            this.id = setInterval(self.moveDown,500);        }        var bk = new BackGround();        var TetRis = new Tetris();        //setInterval(TetRis.moveDown(),500);    </script></body>

原创粉丝点击