- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章javascript贪吃蛇游戏设计与实现由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文为大家分享了javascript实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 。
效果图 。
设计 。
贪吃蛇游戏是一款休闲益智类游戏。既简单又耐玩。该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长.
玩法:
点击屏幕控制蛇的移动方向,寻找吃的东西,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,身子越长玩的难度就越大,不能咬到自己的身体,更不能咬自己的尾巴,等到了一定的分数,游戏胜利.
设计:
首先需要创建一个棋盘,然后需要生成一条贪吃蛇,接着随机生成食物。每当蛇吃到食物的时候,随机生成新的食物,蛇头吃到自己的身体的时候游戏结束.
棋盘设计:
元素 :行数,列数,基础细胞(可表现为空,食物,蛇身体); 。
属性 :创建棋盘,清空棋盘; 。
基础细胞设计:
属性 :重设颜色,重设大小; 。
食物:
需求 : 需要在棋盘剩余空白位置随机位置生成食物; 。
贪吃蛇:
元素 : 位置集合(数组),移动速率,移动方向 。
需求: 初始随机生成只有一节的贪吃蛇,定时器函数(根据移动方向求得下一个要移动到的位置,需要注意的是到达边界后进行特殊处理。判断下个位置是否为蛇本身,如果是蛇就吃到自己,游戏结束。接着将下个位置添加到蛇位置集合内,最后判断下个位置 是否与食物相同,如果相同,则重现生成新的食物,否则移除蛇尾).
方向控制:
本游戏使用点击屏幕,控制蛇移动方向.
实现 。
cell.js 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
/*
* @Author: ls
* @Date: 2020-09-01 18:23:09
* @LastEditTime: 2020-09-16 14:23:37
* @LastEditors: Please set LastEditors
* @Description: 基础细胞类
* @FilePath: \snake\assets\cell.js
*/
cc.Class({
extends: cc.Component,
properties: {},
onLoad() {},
/**
* @param {*} cellColor
*/
setCellColor(cellColor =
new
cc.color(255, 255, 255, 255)) {
this
.node.getChildByName(
'color'
).color = cellColor;
},
/**
* @param {*} cellSize
*/
setCellPos(cellSize =
new
cc.v2(20, 20)) {
this
.node.width = cellSize.x;
this
.node.height = cellSize.y;
},
});
|
guideCtrl.js 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
/*
* @Author: ls
* @Date: 2020-09-03 18:09:18
* @LastEditTime: 2020-09-14 08:55:47
* @LastEditors: Please set LastEditors
* @Description: 引导类
* @FilePath: \snake\assets\guideCtrl.js
*/
cc.Class({
extends: cc.Component,
properties: {
step: [cc.Node],
startToggle: cc.Toggle,
},
onLoad() {
this
.startGuide();
this
.startToggle.isChecked =
false
;
},
/**
* 开始引导
*/
startGuide() {
if
(!
this
.step.length) {
this
.node.destroy();
return
;
}
for
(let index = 0, length =
this
.step.length; index < length; index++) {
this
.step[index].active =
false
;
}
this
._step = 0;
this
.step[0].active =
true
;
},
/**
* 下一个引导页面
*/
nextGuide() {
this
._step++;
if
(
this
._step <
this
.step.length - 1) {
this
.step[
this
._step].active =
true
;
this
.step[
this
._step - 1].active =
false
;
if
(
this
._step ===
this
.step.length - 2) {
this
.step[
this
._step + 1].active =
true
;
}
}
else
{
this
.node.active =
false
;
}
},
callback:
function
(toggle) {
cc.sys.localStorage.setItem(
'isStart'
, toggle.isChecked);
},
});
|
gameCtrl.js 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
|
/*
* @Author: ls
* @Date: 2020-09-01 15:44:33
* @LastEditTime: 2020-09-16 14:23:18
* @LastEditors: Please set LastEditors
* @Description: 游戏导演类
* @FilePath: \snake\assets\gameController.js
*/
var
noneColor =
new
cc.color(120, 120, 120, 255);
var
foodColor =
new
cc.color(254, 168, 23, 255);
var
snakeColor =
new
cc.color(243, 60, 66, 255);
cc.Class({
extends: cc.Component,
properties: {
// 棋盘
node_grid: cc.Node,
// 分数
lab_score: cc.Label,
// 最好分数
lab_best: cc.Label,
// 开始
node_start: cc.Node,
// 新人引导
node_guide: cc.Node,
// 结束
node_over: cc.Node,
// 基础类
cellPrefab: cc.Prefab,
// 移动速度
mSpeed: 5,
// 列数
colCount: 30,
// 行数
rowCount: 30,
},
onLoad() {
// 初始化方向
// 静止、上、下、左、右
// (0,0)、(0,1)、(0,-1)、(-1,0)、(1,0)
this
._direction = { x: 0, y: 0 };
// 初始化细胞大小
this
._cellSize = { x: 10, y: 10 };
this
._map = [];
this
.initCellPool();
this
.onCreateMap();
// 显示开始游戏界面
this
.showStartGame();
},
/**
* 初始化细胞对象池
*/
initCellPool() {
this
.cellPool =
new
cc.NodePool();
let initCount =
this
.rowCount *
this
.colCount;
for
(let i = 0; i < initCount; i++) {
let cell = cc.instantiate(
this
.cellPrefab);
// 创建节点
this
.cellPool.put(cell);
// 通过 put 接口放入对象池
}
},
/**
* 创建地图
*/
onCreateMap() {
this
._map = [];
let node_bg =
this
.node_grid.getChildByName(
'background'
);
this
._cellSize = { x: node_bg.width /
this
.rowCount, y: node_bg.height /
this
.colCount };
for
(
var
y = 0; y <
this
.colCount; y++) {
for
(let x = 0; x <
this
.rowCount; x++) {
var
obj = {};
obj.x = x;
obj.y = y;
obj.node =
this
.createCell(node_bg, x, y);
this
._map.push(obj);
}
}
},
/**
* 从对象池请求对象
* @param {*} parentNode
*/
createCell:
function
(parentNode, x, y) {
let cell =
null
;
if
(
this
.cellPool.size() > 0) {
// 通过 size 接口判断对象池中是否有空闲的对象
cell =
this
.cellPool.get();
}
else
{
// 如果没有空闲对象,也就是对象池中备用对象不够时,我们就用 cc.instantiate 重新创建
cell = cc.instantiate(
this
.cellPrefab);
}
cell.getComponent(
'cell'
).setCellPos(
this
._cellSize);
cell.x =
this
._cellSize.x * x;
cell.y =
this
._cellSize.y * y;
cell.parent = parentNode;
return
cell;
},
/**
* 还原地图
*/
clearMap() {
for
(let index = 0, length =
this
._map.length; index < length; index++) {
this
._map[index].node.getComponent(
'cell'
).setCellColor(noneColor);
}
},
/**
* 显示开始界面
*/
showStartGame() {
this
.node_over.active =
false
;
this
.node_start.active =
true
;
},
/**
* 显示结束界面
*/
showOverGame() {
this
.node_start.active =
false
;
this
.node_over.active =
true
;
},
/**
* 游戏开始
*/
startGame() {
this
.node_guide.active =
false
;
this
.node_over.active =
false
;
this
.node_start.active =
false
;
this
.lab_score.node.active =
true
;
this
.lab_best.node.active =
true
;
this
.node_grid.active =
true
;
// 是否首次进入界面
if
(!cc.sys.localStorage.getItem(
'isStart'
)) {
this
.node_guide.active =
true
;
}
this
._score = 0;
// 更新最高分数
this
.updateBest();
this
._canControl =
true
;
this
._direction = { x: 1, y: 0 };
this
._snakeGrid = [];
this
._foodGrid = {};
// 初始化触摸事件
this
.openTouchEvent();
this
.clearMap();
this
.onCreateSnake();
this
.onCreateFood();
// 开启移动
this
.schedule(
this
.move, 1 /
this
.mSpeed);
},
/**
* 更新分数
*/
updateBest() {
this
._best = cc.sys.localStorage.getItem(
'best'
);
if
(
this
._best) {
if
(
this
._best <
this
._score) {
this
._best =
this
._score;
cc.sys.localStorage.setItem(
'best'
,
this
._best);
}
}
else
{
this
._best =
this
._score;
cc.sys.localStorage.setItem(
'best'
,
this
._best);
}
this
.lab_best.string =
this
._best;
},
/**
* 游戏结束
*/
gameOver() {
// 是否能控制 蛇改变移动方向
this
._canControl =
false
;
this
.unschedule(
this
.move);
this
.closeTouchEvent();
this
.clearMap();
this
.showOverGame();
},
/**
* 创建蛇
*/
onCreateSnake() {
let x = ~~(Math.random() *
this
.rowCount);
let y = ~~(Math.random() *
this
.colCount);
for
(let index = 0, length =
this
._map.length; index < length; index++) {
if
(
this
._map[index].x === x &&
this
._map[index].y === y) {
this
._map[index].node.getComponent(
'cell'
).setCellColor(snakeColor);
this
._snakeGrid.push(
this
._map[index]);
}
}
},
/**
* 创建食物
*/
onCreateFood() {
if
(
this
._map.length !==
this
._snakeGrid.length) {
let r = ~~(Math.random() * (
this
._map.length -
this
._snakeGrid.length));
let subGrid = [];
for
(let i = 0; i <
this
._map.length; i++) {
subGrid.push(
this
._map[i]);
}
for
(let m = 0; m < subGrid.length; m++) {
for
(let n = 0; n <
this
._snakeGrid.length; n++) {
if
(subGrid[m].x ===
this
._snakeGrid[n].x && subGrid[m].y ===
this
._snakeGrid[n].y) {
subGrid.splice(m, 1);
if
(m > 0) {
m--;
}
}
}
}
for
(let index = 0; index < subGrid.length; index++) {
if
(index === r) {
this
._foodGrid = subGrid[index];
this
._foodGrid.node.getComponent(
'cell'
).setCellColor(foodColor);
// 增加分数
this
._score++;
this
.lab_score.string =
this
._score;
}
}
}
},
/**
* 打开触摸
*/
openTouchEvent() {
var
self =
this
;
this
.node.on(
cc.Node.EventType.TOUCH_START,
function
(touch) {
if
(self._canControl) {
self._canControl =
false
;
let touchPos = self.node.convertToNodeSpaceAR(touch.getLocation());
self._direction = self.getTouchDirection(touchPos);
this
.scheduleOnce(
function
() {
self._canControl =
true
;
}, 1 /
this
.mSpeed);
}
},
this
);
},
/**
* 关闭触摸
*/
closeTouchEvent() {
this
.node.off(cc.Node.EventType.TOUCH_START,
this
);
},
/**
* 获取选择的方向
* @param {* 触摸位置} touchPos
*/
getTouchDirection(touchPos) {
// 获取向量长度
function
getABS(pos) {
return
Math.sqrt(pos.x * pos.x + pos.y * pos.y);
}
// 获取横向 方向
function
getLandscape(touchPos) {
if
(touchPos.x > 0) {
cc.log(
'更改为 向 右 移动'
);
return
{ x: 1, y: 0 };
}
else
{
cc.log(
'更改为 向 左 移动'
);
return
{ x: -1, y: 0 };
}
}
// 获取竖向 方向
function
getPortrait(touchPos) {
if
(touchPos.y > 0) {
cc.log(
'更改为 向 上 移动'
);
return
{ x: 0, y: 1 };
}
else
{
cc.log(
'更改为 向 下 移动'
);
return
{ x: 0, y: -1 };
}
}
if
(getABS(
this
._direction) === 1) {
cc.log(
'蛇 正在移动'
);
if
(
this
._direction.y === 1) {
cc.log(
'蛇 正在向 上 移动'
);
return
getLandscape(touchPos);
}
else
if
(
this
._direction.y === -1) {
cc.log(
'蛇 正在向 下 移动'
);
return
getLandscape(touchPos);
}
else
if
(
this
._direction.x === -1) {
cc.log(
'蛇 正在向 左 移动'
);
return
getPortrait(touchPos);
}
else
if
(
this
._direction.x === 1) {
cc.log(
'蛇 正在向 右 移动'
);
return
getPortrait(touchPos);
}
}
else
{
cc.log(
'蛇 未开始 或 停止了移动。此时修改方向无效!'
);
}
},
/**
* 移动
*/
move() {
let nextGrid = {};
nextGrid.x =
this
._snakeGrid[
this
._snakeGrid.length - 1].x +
this
._direction.x;
nextGrid.y =
this
._snakeGrid[
this
._snakeGrid.length - 1].y +
this
._direction.y;
if
(
this
._direction.x === 1) {
// 向右
if
(nextGrid.x >
this
.colCount - 1) {
nextGrid.x = 0;
}
}
else
if
(
this
._direction.x === -1) {
// 向左
if
(nextGrid.x < 0) {
nextGrid.x =
this
.colCount - 1;
}
}
else
if
(
this
._direction.y === 1) {
// 向上
if
(nextGrid.y >
this
.rowCount - 1) {
nextGrid.y = 0;
}
}
else
if
(
this
._direction.y === -1) {
// 向下
if
(nextGrid.y < 0) {
nextGrid.y =
this
.rowCount - 1;
}
}
for
(let m = 0, l =
this
._map.length; m < l; m++) {
if
(
this
._map[m].x === nextGrid.x &&
this
._map[m].y === nextGrid.y) {
nextGrid =
this
._map[m];
}
}
for
(let n = 0, length =
this
._snakeGrid.length; n < length; n++) {
if
(nextGrid.x ===
this
._snakeGrid[n].x && nextGrid.y ===
this
._snakeGrid[n].y) {
this
.gameOver();
// return false;
}
}
nextGrid.node.getComponent(
'cell'
).setCellColor(snakeColor);
this
._snakeGrid.push(nextGrid);
if
(nextGrid.x ===
this
._foodGrid.x && nextGrid.y ===
this
._foodGrid.y) {
this
.onCreateFood();
}
else
{
let startGrid =
this
._snakeGrid.shift();
startGrid.node.getComponent(
'cell'
).setCellColor(noneColor);
}
},
});
|
完整代码:js贪吃蛇游戏 。
更多有趣的经典小游戏实现专题,分享给大家:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.csdn.net/qq_14965517/article/details/108621493 。
最后此篇关于javascript贪吃蛇游戏设计与实现的文章就讲到这里了,如果你想了解更多关于javascript贪吃蛇游戏设计与实现的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在关注 melon js tutorial .这是在我的 HUD.js 文件的顶部。 game.HUD = game.HUD || {} 我以前在其他例子中见过这个。 namespace.some
我刚刚制作了这个小游戏,用户可以点击。他可以看到他的点击,就像“cookieclicker”一样。 一切正常,除了一件事。 我尝试通过创建一个代码行变量来缩短我的代码,我重复了很多次。 documen
在此视频中:http://www.youtube.com/watch?v=BES9EKK4Aw4 Notch(我的世界的创造者)正在做他称之为“实时调试”的事情。他实际上是一边修改代码一边玩游戏,而不
两年前,我使用C#基于MonoGame编写了一款《俄罗斯方块》游戏,相关介绍可以参考【这篇文章】。最近,使用业余时间将之前的基于MonoGame的游戏开发框架重构了一下,于是,也就趁此机会将之前的《俄
1.题目 你和你的朋友,两个人一起玩 Nim 游戏: 桌子上有一堆石头。 你们轮流进行自己的回合, 你作为先手 。 每一回合,轮到的人拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。 假设
我正在创建平台游戏,有红色方 block (他们应该杀了我)和白色方 block (平台) 当我死时,我应该在当前级别的开始处复活。 我做了碰撞检测,但它只有在我移动时才有效(当我跳到红色方 bloc
因此,我正在处理(编程语言)中创建游戏突破,但无法弄清楚检查与 bat 碰撞的功能。 到目前为止,我写的关于与球棒碰撞的部分只是将球与底座碰撞并以相反的方向返回。目前,游戏是一种永无止境的现象,球只是
我试图让我的敌人射击我的玩家,但由于某种原因,子弹没有显示,也没有向玩家射击我什至不知道为什么,我什至在我的 window 上画了子弹 VIDEO bulls = [] runninggame = T
我正在尝试添加一个乒乓游戏框架。我希望每次球与 Racket 接触时球的大小都会增加。 这是我的尝试。第一 block 代码是我认为问题所在的地方。第二 block 是全类。 public class
我想知道 3D 游戏引擎编程通常需要什么样的数学?任何特定的数学(如向量几何)或计算算法(如快速傅立叶变换),或者这一切都被 DirectX/OpenGL 抽象掉了,所以不再需要高度复杂的数学? 最佳
我正在为自己的类(class)做一个霸气游戏,我一直在尝试通过添加许多void函数来做一些新的事情,但由于某种奇怪的原因,我的开发板无法正常工作,因为它说标识符“board”未定义,但是我有到目前为止
我在使用 mousePressed 和 mouseDragged 事件时遇到了一些问题。我正在尝试创建一款太空射击游戏,我希望玩家能够通过按下并移动鼠标来射击。我认为最大的问题是 mouseDragg
你好,我正在尝试基于概率实现战斗和准确性。这是我的代码,但效果不太好。 public String setAttackedPartOfBodyPercent(String probability) {
所以我必须实现纸牌游戏 war 。我一切都很顺利,除了当循环达到其中一张牌(数组列表)的大小时停止之外。我想要它做的是循环,直到其中一张牌是空的。并指导我如何做到这一点?我知道我的代码可以缩短,但我现
我正在做一个正交平铺 map Java 游戏,当我的船移动到 x 和 y 边界时,按方向键,它会停止移动(按预期),但如果我继续按该键,我的角色就会离开屏幕. 这是我正在使用的代码: @O
这里是 Ship、Asteroids、BaseShapeClass 类的完整代码。 Ship Class 的形状继承自 BaseShapeClass。 Asteroid类是主要的源代码,它声明了Gra
我正在开发这个随机数猜测游戏。在游戏结束时,我希望用户可以选择再次玩(或让其他人玩)。我发现了几个类似的线程和问题,但没有一个能够帮助我解决这个小问题。我很确定我可以以某种方式使用我的 while 循
我认为作为一个挑战,我应该编写一个基于 javascript 的游戏。我想要声音、图像和输入。模拟屏幕的背景(例如 640x480,其中包含我的所有图像)对于将页面的其余部分与“游戏”分开非常有用。我
我正在制作一个游戏,我将图标放在网格的节点中,并且我正在使用这个结构: typedef struct node{ int x,y; //coordinates for graphics.h
我正在研究我的游戏技能(主要是阵列)来生成敌人,现在子弹来击倒他们。我能够在测试时设置项目符号,但只有当我按下一个键(比方说空格键)并且中间没有间隔时才可见,所以浏览器无法一次接受那么多。 有没有什么
我是一名优秀的程序员,十分优秀!