zoukankan      html  css  js  c++  java
  • JS贪吃蛇游戏

    JS贪吃蛇游戏,个人练习之用,放在这备份一下,

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>JS贪吃蛇-练习</title>
        <style type="text/css">
            #pannel table {
                border-collapse: collapse;
            }
    
                #pannel table td {
                    border: 1px solid #808080;
                     10px;
                    height: 10px;
                    font-size: 0;
                    line-height: 0;
                    overflow: hidden;
                }
    
                #pannel table .snake {
                    background-color: green;
                }
    
                #pannel table .food {
                    background-color: blue;
                }
        </style>
        <script type="text/javascript">
            var Direction = new function () {
                this.UP = 38;
                this.RIGHT = 39;
                this.DOWN = 40;
                this.LEFT = 37;
            };
            var Common = new function () {
                this.width = 20;  /*水平方向方格数*/
                this.height = 20; /*垂直方向方格数*/
                this.speed = 250; /*速度 值越小越快*/
                this.workThread = null;
            };
            var Main = new function () {
                var control = new Control();
                window.onload = function () {
                    control.Init("pannel");
                    /*开始按钮*/
                    document.getElementById("btnStart").onclick = function () {
                        control.Start();
                        this.disabled = true;
                        document.getElementById("selSpeed").disabled = true;
                        document.getElementById("selSize").disabled = true;
                    };
                    /*调速度按钮*/
                    document.getElementById("selSpeed").onchange = function () {
                        Common.speed = this.value;
                    }
                    /*调大小按钮*/
                    document.getElementById("selSize").onchange = function () {
                        Common.width = this.value;
                        Common.height = this.value;
                        control.Init("pannel");
                    }
                };
            };
    
            /*控制器*/
            function Control() {
                this.snake = new Snake();
                this.food = new Food();
                /*初始化函数,创建表格*/
                this.Init = function (pid) {
                    var html = [];
                    html.push("<table>");
                    for (var y = 0; y < Common.height; y++) {
                        html.push("<tr>");
                        for (var x = 0; x < Common.width; x++) {
                            html.push('<td id="box_' + x + "_" + y + '"> </td>');
                        }
                        html.push("</tr>");
                    }
                    html.push("</table>");
                    this.pannel = document.getElementById(pid);
                    this.pannel.innerHTML = html.join("");
                };
                /*开始游戏 - 监听键盘、创建食物、刷新界面线程*/
                this.Start = function () {
                    var me = this;
                    this.MoveSnake = function (ev) {
                        var evt = window.event || ev;
                        me.snake.SetDir(evt.keyCode);
                    };
                    try {
                        document.attachEvent("onkeydown", this.MoveSnake);
                    } catch (e) {
                        document.addEventListener("keydown", this.MoveSnake, false);
                    }
                    this.food.Create();
                    Common.workThread = setInterval(function () {
                        me.snake.Eat(me.food); me.snake.Move();
                    }, Common.speed);
                };
            }
    
            /*蛇*/
            function Snake() {
                this.isDone = false;
                this.dir = Direction.RIGHT;
                this.pos = new Array(new Position());
                /*移动 - 擦除尾部,向前移动,判断游戏结束(咬到自己或者移出边界)*/
                this.Move = function () {
                    document.getElementById("box_" + this.pos[0].X + "_" + this.pos[0].Y).className = "";
                    //所有 向前移动一步
                    for (var i = 0; i < this.pos.length - 1; i++) {
                        this.pos[i].X = this.pos[i + 1].X;
                        this.pos[i].Y = this.pos[i + 1].Y;
                    }
                    //重新设置头的位置
                    var head = this.pos[this.pos.length - 1];
                    switch (this.dir) {
                        case Direction.UP:
                            head.Y--;
                            break;
                        case Direction.RIGHT:
                            head.X++;
                            break;
                        case Direction.DOWN:
                            head.Y++;
                            break;
                        case Direction.LEFT:
                            head.X--;
                            break;
                    }
                    this.pos[this.pos.length - 1] = head;
                    //遍历画蛇,同时判断游戏结束
                    for (var i = 0; i < this.pos.length; i++) {
                        var isExits = false;
                        for (var j = i + 1; j < this.pos.length; j++)
                            if (this.pos[j].X == this.pos[i].X && this.pos[j].Y == this.pos[i].Y) {
                                isExits = true;
                                break;
                            }
                        if (isExits) { this.Over();/*咬自己*/ break; }
                        var obj = document.getElementById("box_" + this.pos[i].X + "_" + this.pos[i].Y);
                        if (obj) obj.className = "snake"; else { this.Over();/*移出边界*/ break; }
                    }
                    this.isDone = true;
                };
                /*游戏结束*/
                this.Over = function () {
                    clearInterval(Common.workThread);
                    alert("游戏结束!");
                }
                /*吃食物*/
                this.Eat = function (food) {
                    var head = this.pos[this.pos.length - 1];
                    var isEat = false;
                    switch (this.dir) {
                        case Direction.UP:
                            if (head.X == food.pos.X && head.Y == food.pos.Y + 1) isEat = true;
                            break;
                        case Direction.RIGHT:
                            if (head.Y == food.pos.Y && head.X == food.pos.X - 1) isEat = true;
                            break;
                        case Direction.DOWN:
                            if (head.X == food.pos.X && head.Y == food.pos.Y - 1) isEat = true;
                            break;
                        case Direction.LEFT:
                            if (head.Y == food.pos.Y && head.X == food.pos.X + 1) isEat = true;
                            break;
                    }
                    if (isEat) {
                        this.pos[this.pos.length] = new Position(food.pos.X, food.pos.Y);
                        food.Create(this.pos);
                    }
                };
                /*控制移动方向*/
                this.SetDir = function (dir) {
                    switch (dir) {
                        case Direction.UP:
                            if (this.isDone && this.dir != Direction.DOWN) { this.dir = dir; this.isDone = false; }
                            break;
                        case Direction.RIGHT:
                            if (this.isDone && this.dir != Direction.LEFT) { this.dir = dir; this.isDone = false; }
                            break;
                        case Direction.DOWN:
                            if (this.isDone && this.dir != Direction.UP) { this.dir = dir; this.isDone = false; }
                            break;
                        case Direction.LEFT:
                            if (this.isDone && this.dir != Direction.RIGHT) { this.dir = dir; this.isDone = false; }
                            break;
                    }
                };
            }
    
            /*食物*/
            function Food() {
                this.pos = new Position();
                /*创建食物 - 随机位置创建立*/
                this.Create = function (pos) {
                    document.getElementById("box_" + this.pos.X + "_" + this.pos.Y).className = "";
                    var x = 0, y = 0, isCover = false;
                    /*排除蛇的位置*/
                    do {
                        x = parseInt(Math.random() * (Common.width - 1));
                        y = parseInt(Math.random() * (Common.height - 1));
                        isCover = false;
                        if (pos instanceof Array) {
                            for (var i = 0; i < pos.length; i++) {
                                if (x == pos[i].X && y == pos[i].Y) {
                                    isCover = true;
                                    break;
                                }
                            }
                        }
                    } while (isCover);
                    this.pos = new Position(x, y);
                    document.getElementById("box_" + x + "_" + y).className = "food";
                };
            }
    
            function Position(x, y) {
                this.X = 0;
                this.Y = 0;
                if (arguments.length >= 1) this.X = x;
                if (arguments.length >= 2) this.Y = y;
            }
        </script>
    </head>
    <body>
        <div id="pannel" style="margin-bottom: 10px;"></div>
        <select id="selSize">
            <option value="20">20*20</option>
            <option value="30">30*30</option>
            <option value="40">40*40</option>
        </select>
        <select id="selSpeed">
            <option value="500">速度-慢</option>
            <option value="250" selected="selected">速度-中</option>
            <option value="100">速度-快</option>
        </select>
        <input type="button" id="btnStart" value="开始" />
    </body>
    </html>
    


     

  • 相关阅读:
    DOM几个重要的函数
    手指点赞动画
    随机颜色值
    自定义单选框radio样式
    判断是否是微信浏览器的函数
    JAVA开发微信支付-公众号支付/微信浏览器支付(JSAPI)
    微信授权获取用户openid前端实现
    CSS动画 animation与transition
    JS判断指定dom元素是否在屏幕内的方法实例
    希尔伯特曲线
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3177699.html
Copyright © 2011-2022 走看看