俄罗斯方块html js

20 篇文章 1 订阅
20 篇文章 0 订阅

大家好:

最近想写小游戏,但发现这个算术问题,实在是不会啊,从网上找了些,从中找了一个体验效果还不错的,修改了一下,备份下!

尊重原创,发下参考文章:https://jingyan.baidu.com/article/f3ad7d0f3c495a09c3345b01.html

但这还不是我想要的,后期我会继续优化的。谢谢大家!

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>俄罗斯方块</title>
	<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport">
	<script type="text/javascript" src="../js/jquery-1.7.2.js"></script>
	<style>
	body {
	    overflow: hidden;
	    background: #D7D7D7;
	}
	#tetris {
		width: 360px;
		border: 1px solid black;
		padding: 20px;
	}
	#canvas {
		width: 200px;
		height: 440px;
		background-color: white;
		position: relative;
		color: #fff;
	}
	#canvas h1 {
		margin: 0;
		padding: 0;
		text-align: center;
		font-size: 30px;
		padding-top: 200px;
		}
	.piece {
		border: 1px solid white;
		position: absolute;
		}
	.square {
		position: absolute;
		width: 19px;
		height: 19px;
		border: 1px solid white;
		}
	.type0 { background-color: #A000F0;}    
	.type1 { background-color: #00F0F0;}     
	.type2 { background-color: #F0A000;} 
	.type3 { background-color: #0000F0;} 
	.type4 { background-color: #00F000;} 
	.type5 { background-color: #F00000;} 
	.type6 { background-color: #F0F000;}
	#next_shape {
		position: relative;
		background-color: #000;
		border: 1px solid white;
		width: 110px;
		height: 110px;
		}
	#info {
		background-color: #000;
		color: #fff;
		float: right;
		width: 110px;
		height: 420px;
		padding: 10px;
		}
	</style>
	
	
</head>
<body> 
	<p style="color:red;font-size:18px;font-weight:bold">方向键进行移动和翻转</p>
	<div style="text-align:center;clear:both;">
        <div id="tetris">
            <div id="info">
                <div id="next_shape">下一个图标</div>
                <p id="level">Level: <span></span></p>
                <p id="lines">行数: <span></span></p>
                <p id="score">得分: <span></span></p>
                <p id="time">计时: <span></span></p>
            </div>
            <div id="canvas"></div>
        </div>
	</div>


	<script type="text/javascript">
	$(document).ready(function(){
		
		(function(){
var tetris = {
    board: [],
    boardDiv: null,
    canvas: null, 
    pSize: 20,
    canvasHeight: 440,
    canvasWidth: 200,
    boardHeight: 0,
    boardWidth: 0,
    spawnX: 4,
    spawnY: 1,
    shapes: [
        [
            [-1,1],[0,1],[1,1],[0,0] //TEE
        ],
        [
            [-1,0],[0,0],[1,0],[2,0] //line
        ],
        [
            [-1,-1],[-1,0],[0,0],[1,0] //L EL
        ],
        [
            [1,-1],[-1,0],[0,0],[1,0] //R EL
        ],
        [
            [0,-1],[1,-1],[-1,0],[0,0] // R ess
        ],
        [
            [-1,-1],[0,-1],[0,0],[1,0] //L ess
        ],
        [
            [0,-1],[1,-1],[0,0],[1,0] //square
        ]
    ],
    tempShapes:     null,
    curShape:       null, 
    curShapeIndex:  null, 
    curX:           0,
    curY:           0,
    curSqs:         [],
    nextShape:      null,
    nextShapeDisplay: null,
    nextShapeIndex: null, 
    sqs:            [],
    score:          0,
    scoreDisplay:   null,
    level:          1,
    levelDisplay:   null,
    numLevels:      10,
    time:           0,
    maxTime:        1000,
    timeDisplay:    null,
    isActive:       0,
    curComplete:    false, 
    timer:          null, 
    sTimer:         null,
    speed:          700,
    lines:          0,
    
    init: function() {
        this.canvas = document.getElementById("canvas");
        this.initBoard();
        this.initInfo();
        this.initLevelScores();
        this.initShapes();
        this.bindKeyEvents();
        this.play();
    },
    initBoard: function() {
        this.boardHeight = this.canvasHeight/this.pSize;
        this.boardWidth = this.canvasWidth/this.pSize;
        var s = this.boardHeight * this.boardWidth;
        for (var i=0; i < s; i++) {
            this.board.push(0);
        }
        //this.boardDiv = document.getElementById('board); //for debugging
    },
    initInfo: function() {
        this.nextShapeDisplay = document.getElementById("next_shape");
        this.levelDisplay = document.getElementById("level").getElementsByTagName("span")[0];
        this.timeDisplay = document.getElementById("time").getElementsByTagName("span")[0];
        this.scoreDisplay = document.getElementById("score").getElementsByTagName("span")[0];
        this.linesDisplay = document.getElementById("lines").getElementsByTagName("span")[0];
        this.setInfo('time');
        this.setInfo('score');
        this.setInfo('level');
        this.setInfo('lines');
    },
    initShapes: function() {
        this.curSqs = [];
        this.curComplete = false;
        this.shiftTempShapes();
        this.curShapeIndex = this.tempShapes[0];
        this.curShape = this.shapes[this.curShapeIndex];
        this.initNextShape();
        this.setCurCoords(this.spawnX, this.spawnY);
        this.drawShape(this.curX, this.curY, this.curShape);
    },
    initNextShape: function() {
        if(typeof this.tempShapes[1] === 'undefined') {this.initTempShapes();}
        try {
            this.nextShapeIndex = this.tempShapes[1];
            this.nextShape = this.shapes[this.nextShapeIndex];
            this.drawNextShape();
        } catch(e) {
            throw new Error("Could not create next shape. " + e);
        }    
    },
    initTempShapes: function(){
        this.tempShapes = [];
        for (var i =0; i < this.shapes.length; i++){
            this.tempShapes.push(i);
        }
        var k = this.tempShapes.length;
        while ( --k ){ //Fisher Yates Shuffle
            var j = Math.floor(Math.random()*(k + 1));
            var tempk = this.tempShapes[k];
            var tempj = this.tempShapes[j];
            this.tempShapes[k] = tempj;
            this.tempShapes[j] = tempk;
        }
    },
    shiftTempShapes: function(){
        try {
            if (typeof this.tempShapes === "undefined" || this.tempShapes === null) {
                this.initTempShapes();
            } else {
                this.tempShapes.shift();
            }
        }   catch (e) {
            throw new Error("Could not shift or init tempShapes: " +e);
        }
    },
    initTimer: function(){
        var me = this;
        var tLoop = function(){
            me.incTime();
            me.timer = setTimeout(tLoop, 2000);
        };
        this.timer = setTimeout(tLoop, 2000);
    },
    initLevelScores: function(){
        var c = 1;
        for (var i = 1; i <= this.numLevels; i++){
            this['level' + i] = [c * 1000, 40 * i, 5 * i]; //for nxt level, row score, p sore, 
            c = c + c;
        }
    },
    setInfo: function(el){
        this[el + 'Display'].innerHTML = this[el];
    },
    drawNextShape: function(){
        var ns = [];
        for (var i = 0; i < this.nextShape.length; i++){
            ns[i] = this.createSquare(this.nextShape[i][0] + 2, this.nextShape[i][1] + 2, this.nextShapeIndex);
        }
        this.nextShapeDisplay.innerHTML = '';
        for (var k = 0; k < ns.length; k++){
            this.nextShapeDisplay.appendChild(ns[k]);
        }
    },
    drawShape: function(x, y, p){
        for (var i = 0; i < p.length; i++){
            var newX = p[i][0] + x;
            var newY = p[i][1] + y;
            this.curSqs[i] = this.createSquare(newX, newY, this.curShapeIndex);
        }
        for (var k = 0; k < this.curSqs.length; k++){
            this.canvas.appendChild(this.curSqs[k]);
        }
    },
    createSquare: function(x, y, type){
        var el = document.createElement('div');
        el.className = 'square type' +type;
        el.style.left = x * this.pSize + 'px';
        el.style.top = y * this.pSize + 'px';
        return el;
    },
    removeCur: function(){
        var me = this;
        this.curSqs.eachdo(function(){
        me.canvas.removeChild(this);
        });
        this.curSqs = [];
    },
    setCurCoords: function(x, y){
        this.curX = x;
        this.curY = y;
    },
    bindKeyEvents: function(){
        var me = this;
        var event = "keypress";
        if (this.isSafari() || this.isIE()) {event = "keydown";}
        var cb = function(e){
          me.handleKey(e);
        };
        if (window.addEventListener){
            document.addEventListener(event, cb, false);
        } else {
            document.attachEvent('on' + event, cb);
        }
    },
    handleKey: function(e){
        var c = this.whichKey(e);
        var dir = '';
        switch (c){
            case 37:
                this.move('L');
                break;
            case 38:
                this.move('RT');
                break;
            case 39:
                this.move('R');
                break;
            case 40:
                this.move('D');
                break;
            case 27: //esc: pause
                this.togglePause();
                break;
            default:
                break;
        }
    },
    whichKey: function(e){
        var c;
        if (window.event) {c = window.event.keyCode;}
        else if (e) {c = e.keyCode;}
        return c;
    },
    incTime: function(){
        this.time++;
        this.setInfo('time');
    },
    incScore: function(amount){
        this.score = this.score + amount;
        this.setInfo('score');
    },
    incLevel: function(){
        this.level++;
        this.speed = this.speed - 75;
        this.setInfo('level');
    },
    incLines: function(num){
        this.lines += num;
        this.setInfo('lines');
    },
    calcScore: function(args){
        var lines = args.lines || 0;
        var shape = args.shape || false;
        var speed = args.speed || 0;
        var score = 0;
        
        if (lines > 0) {
            score += lines * this["level" + this.level][1];
            this.incLines(lines);
        }
        if (shape === true) {score += shape * this["level" + this.level][2];} 
        /*if (speed > 0){ score += speed * this["level" +this .level[3]];}*/
        this.incScore(score);
    },
    checkScore: function(){
        if (this.score >= this["level" + this.level][0]){
            this.incLevel();
        }
    },
    gameOver: function(){
        this.clearTimers();
        this.canvas.innerHTML = "<h1>GAME OVER</h1>";
    },
    play: function(){
        var me = this;
        if (this.timer === null){
            this.initTimer();
        }
        var gameLoop = function(){
            me.move('D');
            if(me.curComplete){
                me.markBoardShape(me.curX, me.curY, me.curShape);
                me.curSqs.eachdo(function(){
                    me.sqs.push(this);
                });
                me.calcScore({shape: true});
                me.checkRows();
                me.checkScore();
                me.initShapes();
                me.play();
            } else {
                me.pTimer = setTimeout(gameLoop, me.speed);
            }
        };
        this.pTimer = setTimeout(gameLoop, me.speed);
        this.isActive = 1;
    },
    togglePause: function(){
        if (this.isActive === 1){
            this.clearTimers();
            this.isActive = 0;
        }else {this.play();}
    },
    clearTimers: function(){
        clearTimeout(this.timer);
        clearTimeout(this.pTimer);
        this.timer = null;
        this.pTimer = null;
    },
    move: function(dir){
        var s = '';
        var me = this;
        var tempX = this.curX;
        var tempY = this.curY;
        switch(dir){
            case 'L':
                s = 'left';
                tempX -= 1;
                break;
            case 'R':
                s = 'left';
                tempX += 1;
                break;
            case 'D':
                s = 'top';
                tempY += 1;
                break;
            case 'RT':
                this.rotate();
                return true;
                break;
            default: 
                throw new Error('wtf');
                break;
        }
        if (this.checkMove(tempX, tempY, this.curShape)){
            this.curSqs.eachdo(function(i) {
               var l = parseInt(this.style[s], 10);
               dir === 'L' ? l -= me.pSize : l += me.pSize;
            this.style[s] = l + 'px';
            });
            this.curX = tempX;
            this.curY = tempY;
        } else if (dir === 'D') {
            if (this.curY === 1 || this.time === this.maxTime) {
                this.gameOver(); 
                return false;
            }
            this.curComplete = true;
        }
    },
    rotate: function(){
        if (this.curShapeIndex !== 6) { //square
            var temp = [];
            this.curShape.eachdo(function(){
            temp.push([this[1] * -1, this[0]]);
            });
            if (this.checkMove(this.curX, this.curY, temp)) {
                this.curShape = temp;
                this.removeCur();
                this.drawShape(this.curX, this.curY, this.curShape);
            } else {
                throw new Error ("Could not rotate!");
            }
        }
    },
    checkMove: function(x, y, p){
        if (this.isOB(x, y, p) ||
        this.isCollision(x, y, p)) {
            return false;
        }
        return true;
    },
    isCollision: function(x, y, p) {
        var me = this;
        var bool = false;
        p.eachdo(function(){
        var newX = this[0] + x;
        var newY = this[1] + y;
        if (me.boardPos(newX, newY) === 1) {
            bool = true;
        }
        });
        return bool;
    },
    isOB: function(x, y, p){
        var w = this.boardWidth - 1;
        var h = this.boardHeight -1;
        var bool = false;
        p.eachdo(function(){
        var newX = this[0] + x;
        var newY = this[1] + y;
        if(newX < 0 || newX > w || newY < 0 || newY > h){
            bool = true;
        }
        });
        return bool;
    },
    getRowState: function(y){
        var c = 0;
        for (var x = 0; x < this.boardWidth; x++){
            if (this.boardPos(x, y) === 1){
                c = c + 1;
            }
        }
        if (c === 0){ 
            return 'E';}
        if (c === this.boardWidth) { return 'F'; }
        return 'U';
    },
    checkRows: function(){
        var me = this;
        var start = this.boardHeight;
        this.curShape.eachdo(function(){
           var n = this[1] + me.curY;
           console.log(n);
           if (n < start) {
               start = n;
           }
        });
        console.log(start);
        
        var c = 0;
        var stopCheck = false;
        for (var y= this.boardHeight - 1; y >=0; y--){
            switch(this.getRowState(y)){
                case 'F':
                    this.removeRow(y);
                    c++;
                    break;
                case 'E':
                    if (c === 0){
                        stopCheck = true;
                    }
                    break;
                case 'U':
                    if (c > 0){
                        this.shiftRow(y, c);
                    }
                    break;
                default:
                    break;
            }
            if (stopCheck === true){
                break;
            }
        }    
        if (c > 0){
            this.calcScore({ lines: c});
        }
    },
    shiftRow: function(y, amount){
        var me = this;
        for (var x = 0; x < this.boardWidth; x++){
            this.sqs.eachdo(function(){
            if (me.isAt(x, y, this)){
                me.setBlock(x, y + amount, this);
            }
            });
        }
        me.emptyBoardRow(y);
    },
    emptyBoardRow: function(y){
        for (var x = 0; x < this.boardWidth; x++){
            this.markBoardAt(x, y, 0);
        }
    },
    removeRow: function(y){
        for (var x =0; x < this.boardWidth; x++){
            this.removeBlock(x, y);
        }
    },
    removeBlock: function(x, y){
        var me = this;
        this.markBoardAt(x, y, 0);
        this.sqs.eachdo(function(i){
        if (me.getPos(this)[0] === x && me.getPos(this)[1] === y){
            me.canvas.removeChild(this);
            me.sqs.splice(i, 1);
        }
        });
    },
    setBlock: function(x, y, block){
        this.markBoardAt(x, y, 1);
        var newX = x * this.pSize;
        var newY = y * this.pSize;
        block.style.left = newX + 'px';
        block.style.top = newY + "px";
    },
    isAt: function(x, y, block){
        if(this.getPos(block)[0] === x && this.getPos(block)[1] === y){
        return true;
        }
        return false;
    },
    getPos: function(block){
        var p = [];
        p.push(parseInt(block.style.left, 10)/ this.pSize);
        p.push(parseInt(block.style.top, 10)/ this.pSize);
        return p;
    },
    getBoardIdx: function(x, y){
        return x + (y * this.boardWidth);
    },
    boardPos: function(x, y){
        return this.board[x + (y * this.boardWidth)];
    },
    markBoardAt: function(x, y, val){
        this.board[this.getBoardIdx(x, y)] = val;
    },
    markBoardShape: function(x, y, p){
        var me = this;
        p.eachdo(function(i){
        var newX = p[i][0] + x;
        var newY = p[i][1] + y;
        me.markBoardAt(newX, newY, 1);
        });
    },
    isIE: function(){
        return this.bTest(/IE/);
    },
    isFirefox: function(){
        return this.bTest(/Firefox/);
    },
    isSafari: function(){
        return this.bTest(/Safari/);
    },
    bTest: function(rgx){
        return rgx.test(navigator.userAgent);
    }
		};
		tetris.init();
		}) ();
		
		if(!Array.prototype.eachdo){
		    Array.prototype.eachdo = function(fn){
		        for (var i=0; i < this.length; i++){
		            fn.call(this[i], i);
		        }
		    };
		}
		if(!Array.prototype.remDup){
		    Array.prototype.remDup = function(){
		        var temp = [];
		        for(var i =0; i < this.length; i++){
		            var bool = true;
		            for (var j = i+1; j < this.length; j++){
		                if(this[i] === this[j]){ bool = false;}
		            }    
		            if(bool === true){temp.push(this[i]);}   
		        }
		        return temp;
		    }
		}

  	});
	</script>
</body>
</body></html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值