码迷,mamicode.com
首页 > 编程语言 > 详细

使用javascript实现贪吃蛇游戏

时间:2014-09-11 15:06:32      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   使用   java   ar   for   

当自己用代码实贪吃蛇游戏时,是很有成就感的一件事情。同时在写的过程中也是自己对javascript基本语法的复习与体会。

以下就是代码以及一些代码注释:(bug是有的,浏览器的兼容性,本人的能力无法解决)

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <style type="text/css">
        div {
            border: 1px solid #0094ff;
            width: 20px;
            height: 20px;
            background-color: yellow;
        }

        table {
            margin: 10px auto;
        }
    </style>
    <script type="text/javascript">
        //全局变量
        var colCount = 12; //12列
        var rowCount = 14;  //14行

        //--------------window.onload在这里-------------
        window.onload=function () {
            //画小方块12x14
            for (var i = 0; i < rowCount; i++) {                             
                var createtr = document.createElement("tr");
                for (var j = 0; j < colCount; j++) {                   
                    var createtd = document.createElement("td");                  
                    createtd.appendChild(CreateDiv(i, j));
                    createtr.appendChild(createtd);
                }               
                document.getElementById("tabMain").appendChild(createtr);
            }
            //游戏逻辑方法
            GameController();
        }

        //--------------封装的方法以及自定义的类---------------

        //获得指定rowIndex和colIndex的div
        function GetDiv(rowIndex, colIndex) {
            var divs = document.getElementsByTagName("div");
            for (var i = 0; i < divs.length; i++) {
                if (divs[i].getAttribute("rowIndex") == rowIndex && divs[i].getAttribute("colIndex") == colIndex) {
                    return divs[i];
                                                  
                }
            }
            return undefined;
        }

        //生成小方块的方法
        function CreateDiv(rowIndex, colIndex) {
            var xdiv = document.createElement("div");
            //添加自定义属性,为每个单元格做标记.
            xdiv.setAttribute("rowIndex", rowIndex);
            xdiv.setAttribute("colIndex",colIndex);
            xdiv.setAttribute("food", false);
            return xdiv;
        }

        //单元格
        var Unit = {
            colIndex: 0,
            rowIndex: 0,
            //单元格方向
            dir: "Left",
            olddir: "Left",
            Draw: function (rowIndex, colIndex) {
                GetDiv(rowIndex, colIndex).style.backgroundColor = "red";
            },
            Wipe: function (rowIndex, colIndex) {
                GetDiv(rowIndex, colIndex).style.backgroundColor = "yellow";
            },
            MoveLeft: function () {
                this.colIndex--;
            },
            MoveRight: function () {
                this.colIndex++;
            },
            MoveUp: function () {
                this.rowIndex--;
            },
            MoveDown: function () {
                this.rowIndex++;
            }
        }

        //存放单元格集合类
        var UnitList = {
            //存放单元格的数组
            body: new Array(),
            //添加三个单元格到数组,这里代码写的不好,本想每次吃到食物就调用AddBody方法的,后来就把这个方法写死了。
            AddBody: function () {
                var unit = Object.create(Unit);
                unit.rowIndex = 8;
                unit.colIndex = 8;
                this.body[this.body.length] = unit;
                //测试代码
                var unit2 = Object.create(Unit);
                unit2.rowIndex = 8;
                unit2.colIndex = 9;
                this.body[this.body.length] = unit2;
                var unit3 = Object.create(Unit);
                unit3.rowIndex = 8;
                unit3.colIndex = 10;
                this.body[this.body.length] = unit3;

            },

            Draw: function () {
                for (var i = 0; i < this.body.length; i++) {
                    this.body[i].Draw(this.body[i].rowIndex, this.body[i].colIndex);
                }
            },
            Wipe: function () {
                for (var i = 0; i < this.body.length; i++) {
                    this.body[i].Wipe(this.body[i].rowIndex, this.body[i].colIndex);
                }
            },
            AutoMoveTo: function () {
                //先擦除
                this.Wipe();
                //移动
                for (var i = 0; i < this.body.length; i++) {
                    switch (this.body[i].dir) {
                        case "Left":
                            this.body[i].MoveLeft();
                            break;
                        case "Right":
                            this.body[i].MoveRight();
                            break;
                        case "Down":
                            this.body[i].MoveDown();
                            break;
                        case "Up":
                            this.body[i].MoveUp();
                            break;
                    }
                    this.body[i].olddir = this.body[i].dir;
                    if (this.body[i - 1] != undefined) {
                        this.body[i].dir = this.body[i - 1].olddir;
                    }
                }
                //重画
                this.Draw();
            }
        }

        //----------------游戏逻辑方法-------------
        function GameController() {
            var U = Object.create(UnitList);
            U.AddBody();
            U.Draw();
            AddFood();
            var set = window.setInterval(function () { MoveMove() }, 500);
            //移动方法
            function MoveMove() {
                //判断是否能移动
                if (IsAbleMove()) {
                    //判断是否吃到自己
                    if (IsEatMySelf()) {
                        window.clearInterval(set);
                        alert("吃到自己了");
                    }
                    //判断是否吃到食物
                    if (IsEatFood()) {
                        //新增一个unit
                        var newU = Object.create(Unit);
                        newU.rowIndex = U.body[U.body.length - 1].rowIndex;
                        newU.colIndex = parseInt(U.body[U.body.length - 1].colIndex) + 1;
                        U.body[U.body.length] = newU;
                        //新增一个食物
                        AddFood();
                    }
                    U.AutoMoveTo();
                }
                else {
                    //   关闭setInterval
                    window.clearInterval(set);
                    alert("结束");
                }

            }
            //判断越界
            function IsAbleMove() {
                var rowIndex = U.body[0].rowIndex;
                var colIndex = U.body[0].colIndex;
                switch (U.body[0].dir) {
                    case "Left":
                        colIndex--;
                        break;
                    case "Right":
                        colIndex++;
                        break;
                    case "Down":
                        rowIndex++;
                        break;
                    case "Up":
                        rowIndex--;
                        break;

                }
                if (rowIndex < 0 || colIndex < 0 || rowIndex > 13 || colIndex > 11) {
                    return false;
                }
                return true;
            }
            //生成食物
            function AddFood() {
                var rowIndex;
                var colIndex;
                random();
                function random() {
                    rowIndex = parseInt(Math.random() * 14);
                    colIndex = parseInt(Math.random() * 12);
                    for (var i = 0; i < U.body.length; i++) {
                        if (rowIndex == U.body[i].rowIndex && colIndex == U.body[i].colIndex) {
                           // alert("haha");
                            random();

                        }

                    }
                };
                GetDiv(rowIndex, colIndex).style.backgroundColor = "green";
                GetDiv(rowIndex, colIndex).setAttribute("food", true);
            }
            //是否吃到食物
            function IsEatFood() {
                if (GetDiv(U.body[0].rowIndex, U.body[0].colIndex).getAttribute("food") == "true") {
                    GetDiv(U.body[0].rowIndex, U.body[0].colIndex).setAttribute("food", false);
                    return true;
                }
                return false;
            }
            //是否吃到自己
            function IsEatMySelf() {
                var rowIndex = U.body[0].rowIndex;
                var colIndex = U.body[0].colIndex;
                for (var i = 1; i < U.body.length; i++) {
                    if (U.body[i].rowIndex == rowIndex && U.body[i].colIndex == colIndex) {
                        return true;
                    }
                }
                return false;
            }
            //监听键盘事件
            window.onkeydown = function () {
                switch (event.keyCode) {
                    case 37:
                        //alert("你按了左方向键");
                        if (U.body[0].dir != "Right") {
                            U.body[0].dir = "Left";
                        }
                        break;
                    case 38:
                        //alert("你按了上");
                        if (U.body[0].dir != "Down") {
                            U.body[0].dir = "Up";
                        }
                        break;
                    case 39:
                        //alert("你按了右方向键");
                        if (U.body[0].dir != "Left") {
                            U.body[0].dir = "Right";
                        }
                        break;
                    case 40:
                        //alert("你按了下方向键");
                        if (U.body[0].dir != "Up") {
                            U.body[0].dir = "Down";
                        }
                        break;
                }
            }
        }
    </script>
</head>
<body>
    <table id="tabMain">
    </table>
</body>
</html>

 

使用javascript实现贪吃蛇游戏

标签:style   blog   http   color   io   使用   java   ar   for   

原文地址:http://www.cnblogs.com/CodeFaker/p/3966324.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!