贪吃蛇事件

        贪吃蛇是众多90后小时候玩过的一款经典手游,但是在程序员眼中则是几页代码的编辑,代码里所涉及的内容也比较简单,下面我就为大家简单介绍一下贪吃蛇事件。

涉及内容

       主要为构造函数及其原型的应用,游戏框架是由表格和数组通过构造函数书写的js结构即为游戏引擎部分。

事件结构

      整个贪吃蛇事件大体结构可分为两部分:

 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);

}

};

```

事件框架大致内容

      事件框架主页部分内容不多,主要为游戏引擎js以及游戏食物(food.js)的调用或者引入和他们样式的书写具体内容如下:

游戏引擎框架和食物样式的书写:

游戏引擎js的书写:

游戏中食物(food.js)的书写:

食物

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

(扩展) 产生不同的食物

```

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. 注意语法

事件具体效果链接:127.0.0.1:8020/20171013/02%E8%B4%AA%E5%90%83%E8%9B%87.html

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

推荐阅读更多精彩内容