zoukankan      html  css  js  c++  java
  • javascript俄罗斯方块游戏

    俄罗斯方块游戏,键盘方向键←→控制左右移动,↑键变形,↓键快速下落
    ​1. [代码]HTML文件  
    <html><head><title>俄罗斯方块-柯乐义</title>
    <link href="http://keleyi.com/game/5/index/keleyielsfk.css" type="text/css" rel="Stylesheet" /></head>
    <body><a href="http://keleyi.com/a/bjac/600xsi0s.htm">原文</a></body></html>
    <script>
        var over = false, shapes = ("0,1,1,1,2,1,3,1;1,0,1,1,1,2,2,2;2,0,2,1,2,2,1,2;0,1,1,1,1,2,2,2;1,2,2,2,2,1,3,1;1,1,2,1,1,2,2,2;0,2,1,2,1,1,2,2").split(";");
        function create(tag, css) {
            var elm = document.createElement(tag);
            elm.className = css;
            document.body.appendChild(elm);
            return elm;
        }
        function Tetris(c, t, x, y) {
            var c = c ? c : "c";
            this.divs = [create("div", c), create("div", c), create("div", c), create("div", c)];
            this.reset = function () {
                this.x = typeof x != 'undefined' ? x : 3;
                this.y = typeof y != 'undefined' ? y : 0;
                this.shape = t ? t : shapes[Math.floor(Math.random() * (shapes.length - 0.00001))].split(",");
                this.show();
                if (this.field && this.field.check(this.shape, this.x, this.y, 'v') == 'D') {
                    over = true;
                    this.field.fixShape(this.shape, this.x, this.y);
                    alert('游戏结束。http://keleyi.com/game/5/');
                } 
            }
            this.show = function () {
                for (var i in this.divs) {
                    this.divs[i].style.left = (this.shape[i * 2] * 1 + this.x) * 20 + 'px';
                    this.divs[i].style.top = (this.shape[i * 2 + 1] * 1 + this.y) * 20 + 'px';
                } 
            }
            this.field = null;
            this.hMove = function (step) {
                var r = this.field.check(this.shape, this.x - -step, this.y, 'h');
                if (r != 'N' && r == 0) {
                    this.x -= -step;
                    this.show();
                } 
            }
            this.vMove = function () {
                if (this.field.check(this.shape, this.x, this.y - -1, 'v') == 'N') {
                    this.y++;
                    this.show();
                }
                else {
                    this.field.fixShape(this.shape, this.x, this.y);
                    this.field.findFull();
                    this.reset();
                } 
            }
            this.rotate = function () {
                var s = this.shape;
                var newShape = [3 - s[1], s[0], 3 - s[3], s[2], 3 - s[5], s[4], 3 - s[7], s[6]];
                var r = this.field.check(newShape, this.x, this.y, 'h');
                if (r == 'D') return;
                if (r == 0) {
                    this.shape = newShape;
                    this.show();
                }
                else if (this.field.check(newShape, this.x - r, this.y, 'h') == 0) {
                    this.x -= r;
                    this.shape = newShape;
                    this.show();
                } 
            }
            this.reset();
        }
        function Field(w, h) {
            this.width = w ? w : 10;
            this.height = h ? h : 20;
            this.show = function () {
                var f = create("div", "f")
                f.style.width = this.width * 20 + 'px';
                f.style.height = this.height * 20 + 'px';
            }http://www.huiyi8.com/yinxiao/​
            this.findFull = function () {
                for (var l = 0; l < this.height; l++) {
                    var s = 0;
                    for (var i = 0; i < this.width; i++) {
                        s += this[l * this.width + i] ? 1 : 0;
                    }音效网
                    if (s == this.width) {
                        this.removeLine(l);
                    } 
                } 
            }
            this.removeLine = function (line) {
                for (var i = 0; i < this.width; i++) {
                    document.body.removeChild(this[line * this.width + i]);
                }
                for (var l = line; l > 0; l--) {
                    for (var i = 0; i < this.width; i++) {
                        this[l * this.width - -i] = this[(l - 1) * this.width - -i];
                        if (this[l * this.width - -i]) this[l * this.width - -i].style.top = l * 20 + 'px';
                    } 
                } 
            }
            this.check = function (shape, x, y, d) {
                var r1 = 0, r2 = 'N';
                for (var i = 0; i < 8; i += 2) {
                    if (shape[i] - -x < 0 && shape[i] - -x < r1)
                    { r1 = shape[i] - -x; }
                    else if (shape[i] - -x >= this.width && shape[i] - -x > r1)
                    { r1 = shape[i] - -x; }
                    if (shape[i + 1] - -y >= this.height || this[shape[i] - -x - -(shape[i + 1] - -y) * this.width])
                    { r2 = 'D' } 
                }
                if (d == 'h' && r2 == 'N') return r1 > 0 ? r1 - this.width - -1 : r1;
                else return r2;
            }
            this.fixShape = function (shape, x, y) {
                var d = new Tetris("d", shape, x, y);
                d.show();
                for (var i = 0; i < 8; i += 2) {
                    this[shape[i] - -x - -(shape[i + 1] - -y) * this.width] = d.divs[i / 2];
                } 
            } 
        }
        var f = new Field();
        f.show();
        var s = new Tetris();
        s.field = f;
        s.show();
        window.setInterval("if(!over)s.vMove();", 500);
        document.onkeydown = function (e) {
            if (over) return;
            var e = window.event ? window.event : e;
            switch (e.keyCode) {
                case 38: //up keleyi.com
                    s.rotate();
                    break;
                case 40: //down
                    s.vMove();
                    break;
                case 37: //left
                    s.hMove(-1);
                    break;
                case 39: //right
                    s.hMove(1);
                    break;
            } 
        }
    </script>

  • 相关阅读:
    Android 5.X新特性之RecyclerView基本解析及无限复用
    Android 网络框架之Retrofit2使用详解及从源码中解析原理
    Android 源码解析之AsyncTask
    Business Logic
    WHO AM I
    黑洞
    俄罗斯方块
    还记得八皇后的解法吗
    汝之蜜糖,吾之砒霜
    项目为什么会失败
  • 原文地址:https://www.cnblogs.com/xkzy/p/3870329.html
Copyright © 2011-2022 走看看