贪吃蛇总结

贪吃蛇项目总结

Paste_Image.png

项目需求分析

采用 "面向对象编程" 思路,因为 面向对象的思想 更适应于应用程序的编写。

1. 找对象

(1)蛇
属性: 长度、颜色、位置、头、移动方向
方法: 吃、移动、长大

(2)食物
属性: 大小、颜色、位置
方法: 改变位置

(3)游戏引擎
属性: 场景、蛇、食物
方法: 初始化、键盘控制、启动游戏、停止游戏

2. 实现对象

游戏引擎

采用 字面量的形式 创建对象。 因为游戏引擎只有1个,采用这种方式会更合适些。代码如下:

// 定义  游戏引擎  对象
var gGameBox = {
    
    rows: 20,  // 行数
    
    cols: 20,  // 列数

    allTds: [], // 存储所有的td元素对象

    food: null, // 食物对象

    snake: null, // 蛇对象

    timer: null, // 定时器

    // 方法: 清空环境
    clear: function() {
        for (var i = 0; i < gGameBox.allTds.length; i++) {
            for (var j = 0; j < gGameBox.allTds[i].length; j++) {
                gGameBox.allTds[i][j].className = "";
            }
        }
    },

    // 方法:支持键盘控制
    keyControl: function() {
        // onkeydown 键盘按下事件
        window.onkeydown = function(e) {
            // 获取按键编码
            var c = e.keyCode;

            if (c == 37)
            {
                // 左

                if (gGameBox.snake.direct == "right")
                {
                    // 当前是往右走,不能掉头,终止函数
                    return ;
                }
                gGameBox.snake.direct = "left";
            }
            else if (c == 38)
            {
                // 上
                if (gGameBox.snake.direct == "down")
                {
                    return ;
                }
                gGameBox.snake.direct = "up";
            }
            else if (c == 39)
            {
                // 右
                if (gGameBox.snake.direct == "left")
                {
                    return ;
                }
                //  改变蛇的方向
                gGameBox.snake.direct = "right";
            }
            else if (c == 40)
            {
                if (gGameBox.snake.direct == "up")
                {
                    return ;
                }
                // 下
                gGameBox.snake.direct = "down";
            }
        }
    },
    
    // 方法: 游戏开始
    start: function() {

        gGameBox.init(); // 游戏初始化
        
        gGameBox.food = new Food(); // 创建食物
        gGameBox.snake = new Snake(); // 创建蛇

        // 支持键盘控制
        gGameBox.keyControl();

        // 启动游戏时,定时移动蛇
        gGameBox.timer = setInterval(function() {

            // 1. 清空棋盘
            gGameBox.clear();
            
            // 2. 蛇移动
            gGameBox.snake.move();

            // 3. 显示食物
            gGameBox.food.show();

            

        }, 500);

        //gGameBox.snake.fresh();
    },

    // 初始化
    init: function() {
        // 场景布置好, 用表格来做
        var oTable = document.createElement("table");
    
        for (var i = 0; i < gGameBox.rows; i++)
        {
            // 创建tr
            var oTr = document.createElement("tr"); 

            // 每一行,定义1个空数组
            var arr = [];

            for (var j = 0; j < gGameBox.cols; j++) {
                // 创建td
                var oTd = document.createElement("td"); 

                oTr.appendChild(oTd);

                // 将td放到空数组中
                arr.push(oTd);
            }
            // 将当前行所有的td,压入到 allTds 属性中
            gGameBox.allTds.push(arr);

            oTable.appendChild(oTr);
        }

        // 添加到body
        document.body.appendChild(oTable);
    }
};

食物

因为食物可能在不断地创建,所以采用 (构造函数)的方式,更合适些。

(扩展) 产生不同的食物



function Food() {

    // 坐标
    this.x = 0;
    this.y = 0;

    // 一开始就随机位置
    this.change();
}

// 方法1: 出现在环境中
Food.prototype.show = function() {
    gGameBox.allTds[this.y][this.x].className = "food";
}

// 方法2: 改变位置, 随机的
Food.prototype.change = function() {
    this.x = parseInt(Math.random() * gGameBox.cols);
    this.y = parseInt(Math.random() * gGameBox.rows);

    this.show();
}

因为蛇可能需要手动创建,可能有多条蛇,所以 采用 构造函数的方式 更合适些。

(扩展) 蛇的颜色、蛇的大小、蛇的初始位置 都可以改,也可以继承的方式来实现不同的蛇


function Snake() {

    // 存储蛇 所有节点坐标, 同时也存储了蛇的长度  this.arr.length
    //  默认蛇头  this.arr[0]  节点
    this.arr = [
        {x: 5, y: 1},
        {x: 4, y: 1},
        {x: 3, y: 1},
        {x: 2, y: 1},
        {x: 1, y: 1}
    ];

    // 当前移动方向:   left, right, down, up
    this.direct = "down";

    // 创建完就刷新到页面上
    this.fresh();
}



// 方法1: 更新到页面上  fresh 刷新  
Snake.prototype.fresh = function() {
    // 给所有蛇节点,都添加样式
    for (var i = 0; i < this.arr.length; i++)
    {
        // this.arr[i] 是蛇节点对象
        var x = this.arr[i].x;
        var y = this.arr[i].y;

        gGameBox.allTds[y][x].className = "snake"
    }
}

// 方法2: 移动
Snake.prototype.move = function() {

    // 蛇头坐标
    var x = this.arr[0].x;
    var y = this.arr[0].y;

    // 思路: 根据当前蛇的方向,来分情况处理
    if (this.direct == "right")
    {
        //   4      3       2     1      0
        // (1,1) (2,1) (3,1) (4,1) (5,1)
        // (2,1) (3,1) (4,1) (5,1) (6,1)
        //       (2,1) (3,1) (4,1) (5,1) (6,1)
        //  在 蛇头 增加新点 (6,1), 删除蛇尾
        x++;

    }
    else if (this.direct == "down")
    {
        y++;
    }
    else if (this.direct == "left")
    {
        x--;
    }
    else if (this.direct == "up")
    {
        y--;
    }


    if (x >= gGameBox.cols || y >= gGameBox.rows || x < 0 || y < 0)
    {
        clearInterval(gGameBox.timer);

        console.log("GG啦~");
        alert("GG啦~");
        return ;
    }

    if (x == gGameBox.food.x && y == gGameBox.food.y)
    {
        // 吃到食物了,增加1个点
        this.arr.unshift({x: x, y: y});

        // 食物更改位置
        gGameBox.food.change();

        
        this.fresh();

        return ;
    }


    // 在蛇头增加新点
    this.arr.unshift({x: x, y: y});

    // 删除蛇尾
    this.arr.pop();

    // 将新蛇刷新到页面上
    this.fresh();
}

启动游戏

gGameBox.start();

项目开发总结

  1. 构造函数名 首字母建议 大写
  2. 变量名不要写错
  3. 注意语法

建议,自己完整地、从零开始、再写三遍。

因为编程就是1个技能,就像打篮球一样,需要不断练习才能熟练掌握。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,219评论 0 4
  • 贪吃蛇是众多90后小时候玩过的一款经典手游,但是在程序员眼中则是几页代码的编辑,代码里所涉及的内容也比较简...
    3c58eba4eb74阅读 447评论 0 0
  • udacity进入中国,iOS可以免费用一个月,赶紧利用起来。
    红烧米饭阅读 387评论 1 0
  • 之前用charles代理调试微信,发现https代理没生效,一直找不到原因,因为有fiddler所以也没继续深究今...
    JustFantasy阅读 2,411评论 0 1
  • 他连朋友圈都不想给大家看,你何必再自欺欺人 喜欢一个人,他的朋友圈会全是你。 近日,闲得无聊去看了看他的朋友圈,还...
    遇见方知有你阅读 511评论 5 3