html5中文学习网

您的位置: 首页 > html5教程 > 入门教程 » 正文

HTML5 贪吃蛇游戏实现思路及源代码_html5教程技巧

[ ] 已经帮助:人解决问题
点评:游戏难点是怎么模拟贪吃蛇的移动。如果只是一个方块的话显然很简单。但是当蛇的长度变长之后要怎么样控制,下面为大家简要介绍下具体的实现,感兴趣的朋友可以参考下,希望对大家有所帮助
 xP2HTML5中文学习网 - HTML5先行者学习网
游戏操作说明 xP2HTML5中文学习网 - HTML5先行者学习网
xP2HTML5中文学习网 - HTML5先行者学习网
通过方向键控制贪吃蛇上下左右移动。贪吃蛇吃到食物之后会变长一个长度。 xP2HTML5中文学习网 - HTML5先行者学习网
xP2HTML5中文学习网 - HTML5先行者学习网
游戏具体实现 xP2HTML5中文学习网 - HTML5先行者学习网
xP2HTML5中文学习网 - HTML5先行者学习网
游戏难点是怎么模拟贪吃蛇的移动。如果只是一个方块的话显然很简单。但是当蛇的长度变长之后要怎么样控制 xP2HTML5中文学习网 - HTML5先行者学习网
xP2HTML5中文学习网 - HTML5先行者学习网
每个方块的移动呢? xP2HTML5中文学习网 - HTML5先行者学习网
xP2HTML5中文学习网 - HTML5先行者学习网
如果观察蛇的移动,可以发现,从蛇的头部到尾部,每个方块在下一时刻的位置就是它的前一个方块在当前时刻 xP2HTML5中文学习网 - HTML5先行者学习网
xP2HTML5中文学习网 - HTML5先行者学习网
的位置。因此我们需要做的只是控制贪吃蛇的头部的运动。其他部分的位置都可以依次类推。 xP2HTML5中文学习网 - HTML5先行者学习网
xP2HTML5中文学习网 - HTML5先行者学习网
另外一个值得注意的问题是 xP2HTML5中文学习网 - HTML5先行者学习网
xP2HTML5中文学习网 - HTML5先行者学习网
贪吃蛇吃下食物之后,新增加的方块应该放在哪个位置。 xP2HTML5中文学习网 - HTML5先行者学习网
xP2HTML5中文学习网 - HTML5先行者学习网
答案就是在下一时刻,新增加的方块应该出现在当前时刻的尾部位置。 xP2HTML5中文学习网 - HTML5先行者学习网
xP2HTML5中文学习网 - HTML5先行者学习网
因此,在吃下食物之后应该在更新蛇的每个位置之前,增加一个方块,并且将其位置设定在当前时刻的尾部位置。 xP2HTML5中文学习网 - HTML5先行者学习网
xP2HTML5中文学习网 - HTML5先行者学习网
然后在当前时刻更新出了新增方块之外的所有方块的位置 xP2HTML5中文学习网 - HTML5先行者学习网
xP2HTML5中文学习网 - HTML5先行者学习网
index.html xP2HTML5中文学习网 - HTML5先行者学习网
 xP2HTML5中文学习网 - HTML5先行者学习网
snake.js xP2HTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
xP2HTML5中文学习网 - HTML5先行者学习网
var canvas; xP2HTML5中文学习网 - HTML5先行者学习网
var ctx; xP2HTML5中文学习网 - HTML5先行者学习网
var timer; xP2HTML5中文学习网 - HTML5先行者学习网
//measures xP2HTML5中文学习网 - HTML5先行者学习网
var x_cnt = 15; xP2HTML5中文学习网 - HTML5先行者学习网
var y_cnt = 15; xP2HTML5中文学习网 - HTML5先行者学习网
var unit = 48; xP2HTML5中文学习网 - HTML5先行者学习网
var box_x = 0; xP2HTML5中文学习网 - HTML5先行者学习网
var box_y = 0; xP2HTML5中文学习网 - HTML5先行者学习网
var box_width = 15 * unit; xP2HTML5中文学习网 - HTML5先行者学习网
var box_height = 15 * unit; xP2HTML5中文学习网 - HTML5先行者学习网
var bound_left = box_x; xP2HTML5中文学习网 - HTML5先行者学习网
var bound_right = box_x + box_width; xP2HTML5中文学习网 - HTML5先行者学习网
var bound_up = box_y; xP2HTML5中文学习网 - HTML5先行者学习网
var bound_down = box_y + box_height; xP2HTML5中文学习网 - HTML5先行者学习网
//images xP2HTML5中文学习网 - HTML5先行者学习网
var image_sprite; xP2HTML5中文学习网 - HTML5先行者学习网
//objects xP2HTML5中文学习网 - HTML5先行者学习网
var snake; xP2HTML5中文学习网 - HTML5先行者学习网
var food; xP2HTML5中文学习网 - HTML5先行者学习网
var food_x; xP2HTML5中文学习网 - HTML5先行者学习网
var food_y; xP2HTML5中文学习网 - HTML5先行者学习网
//functions xP2HTML5中文学习网 - HTML5先行者学习网
function Role(sx, sy, sw, sh, direction, status, speed, image, flag) xP2HTML5中文学习网 - HTML5先行者学习网
{ xP2HTML5中文学习网 - HTML5先行者学习网
this.x = sx; xP2HTML5中文学习网 - HTML5先行者学习网
this.y = sy; xP2HTML5中文学习网 - HTML5先行者学习网
this.w = sw; xP2HTML5中文学习网 - HTML5先行者学习网
this.h = sh; xP2HTML5中文学习网 - HTML5先行者学习网
this.direction = direction; xP2HTML5中文学习网 - HTML5先行者学习网
this.status = status; xP2HTML5中文学习网 - HTML5先行者学习网
this.speed = speed; xP2HTML5中文学习网 - HTML5先行者学习网
this.image = image; xP2HTML5中文学习网 - HTML5先行者学习网
this.flag = flag; xP2HTML5中文学习网 - HTML5先行者学习网
} xP2HTML5中文学习网 - HTML5先行者学习网
function transfer(keyCode) xP2HTML5中文学习网 - HTML5先行者学习网
{ xP2HTML5中文学习网 - HTML5先行者学习网
switch (keyCode) xP2HTML5中文学习网 - HTML5先行者学习网
{ xP2HTML5中文学习网 - HTML5先行者学习网
case 37: xP2HTML5中文学习网 - HTML5先行者学习网
return 1; xP2HTML5中文学习网 - HTML5先行者学习网
case 38: xP2HTML5中文学习网 - HTML5先行者学习网
return 3; xP2HTML5中文学习网 - HTML5先行者学习网
case 39: xP2HTML5中文学习网 - HTML5先行者学习网
return 2; xP2HTML5中文学习网 - HTML5先行者学习网
case 40: xP2HTML5中文学习网 - HTML5先行者学习网
return 0; xP2HTML5中文学习网 - HTML5先行者学习网
} xP2HTML5中文学习网 - HTML5先行者学习网
} xP2HTML5中文学习网 - HTML5先行者学习网
function addFood() xP2HTML5中文学习网 - HTML5先行者学习网
{ xP2HTML5中文学习网 - HTML5先行者学习网
//food_x=box_x+Math.floor(Math.random()*(box_width-unit)); xP2HTML5中文学习网 - HTML5先行者学习网
//food_y=box_y+Math.floor(Math.random()*(box_height-unit)); xP2HTML5中文学习网 - HTML5先行者学习网
food_x = unit * Math.floor(Math.random() * x_cnt); xP2HTML5中文学习网 - HTML5先行者学习网
food_y = unit * Math.floor(Math.random() * y_cnt); xP2HTML5中文学习网 - HTML5先行者学习网
food = new Role(food_x, food_y, unit, unit, 0, 0, 0, image_sprite, true); xP2HTML5中文学习网 - HTML5先行者学习网
} xP2HTML5中文学习网 - HTML5先行者学习网
function play(event) xP2HTML5中文学习网 - HTML5先行者学习网
{ xP2HTML5中文学习网 - HTML5先行者学习网
var keyCode; xP2HTML5中文学习网 - HTML5先行者学习网
if (event == null) xP2HTML5中文学习网 - HTML5先行者学习网
{ xP2HTML5中文学习网 - HTML5先行者学习网
keyCode = window.event.keyCode; xP2HTML5中文学习网 - HTML5先行者学习网
window.event.preventDefault(); xP2HTML5中文学习网 - HTML5先行者学习网
} xP2HTML5中文学习网 - HTML5先行者学习网
else xP2HTML5中文学习网 - HTML5先行者学习网
{ xP2HTML5中文学习网 - HTML5先行者学习网
keyCode = event.keyCode; xP2HTML5中文学习网 - HTML5先行者学习网
event.preventDefault(); xP2HTML5中文学习网 - HTML5先行者学习网
} xP2HTML5中文学习网 - HTML5先行者学习网
var cur_direction = transfer(keyCode); xP2HTML5中文学习网 - HTML5先行者学习网
snake[0].direction = cur_direction; xP2HTML5中文学习网 - HTML5先行者学习网
} xP2HTML5中文学习网 - HTML5先行者学习网
function update() xP2HTML5中文学习网 - HTML5先行者学习网
{ xP2HTML5中文学习网 - HTML5先行者学习网
//add a new part to the snake before move the snake xP2HTML5中文学习网 - HTML5先行者学习网
if (snake[0].x == food.x && snake[0].y == food.y) xP2HTML5中文学习网 - HTML5先行者学习网
{ xP2HTML5中文学习网 - HTML5先行者学习网
var length = snake.length; xP2HTML5中文学习网 - HTML5先行者学习网
var tail_x = snake[length - 1].x; xP2HTML5中文学习网 - HTML5先行者学习网
var tail_y = snake[length - 1].y; xP2HTML5中文学习网 - HTML5先行者学习网
var tail = new Role(tail_x, tail_y, unit, unit, snake[length - 1].direction, 0, 0, image_sprite, true); xP2HTML5中文学习网 - HTML5先行者学习网
snake.push(tail); xP2HTML5中文学习网 - HTML5先行者学习网
addFood(); xP2HTML5中文学习网 - HTML5先行者学习网
} xP2HTML5中文学习网 - HTML5先行者学习网
//modify attributes xP2HTML5中文学习网 - HTML5先行者学习网
//move the head xP2HTML5中文学习网 - HTML5先行者学习网
switch (snake[0].direction) xP2HTML5中文学习网 - HTML5先行者学习网
{ xP2HTML5中文学习网 - HTML5先行者学习网
case 0: //down xP2HTML5中文学习网 - HTML5先行者学习网
snake[0].y += unit; xP2HTML5中文学习网 - HTML5先行者学习网
if (snake[0].y > bound_down - unit) xP2HTML5中文学习网 - HTML5先行者学习网
snake[0].y = bound_down - unit; xP2HTML5中文学习网 - HTML5先行者学习网
break; xP2HTML5中文学习网 - HTML5先行者学习网
case 1: //left xP2HTML5中文学习网 - HTML5先行者学习网
snake[0].x -= unit; xP2HTML5中文学习网 - HTML5先行者学习网
if (snake[0].x < bound_left) xP2HTML5中文学习网 - HTML5先行者学习网
snake[0].x = bound_left; xP2HTML5中文学习网 - HTML5先行者学习网
break; xP2HTML5中文学习网 - HTML5先行者学习网
case 2: //right xP2HTML5中文学习网 - HTML5先行者学习网
snake[0].x += unit; xP2HTML5中文学习网 - HTML5先行者学习网
if (snake[0].x > bound_right - unit) xP2HTML5中文学习网 - HTML5先行者学习网
snake[0].x = bound_right - unit; xP2HTML5中文学习网 - HTML5先行者学习网
break; xP2HTML5中文学习网 - HTML5先行者学习网
case 3: //up xP2HTML5中文学习网 - HTML5先行者学习网
snake[0].y -= unit; xP2HTML5中文学习网 - HTML5先行者学习网
if (snake[0].y < bound_up) xP2HTML5中文学习网 - HTML5先行者学习网
snake[0].y = bound_up; xP2HTML5中文学习网 - HTML5先行者学习网
break; xP2HTML5中文学习网 - HTML5先行者学习网
} xP2HTML5中文学习网 - HTML5先行者学习网
//move other part of the snake xP2HTML5中文学习网 - HTML5先行者学习网
for (var i = snake.length - 1; i >= 0; i--) xP2HTML5中文学习网 - HTML5先行者学习网
{ xP2HTML5中文学习网 - HTML5先行者学习网
if (i > 0) xP2HTML5中文学习网 - HTML5先行者学习网
//snake[i].direction=snake[i-1].direction; xP2HTML5中文学习网 - HTML5先行者学习网
{ xP2HTML5中文学习网 - HTML5先行者学习网
snake[i].x = snake[i - 1].x; xP2HTML5中文学习网 - HTML5先行者学习网
snake[i].y = snake[i - 1].y; xP2HTML5中文学习网 - HTML5先行者学习网
} xP2HTML5中文学习网 - HTML5先行者学习网
} xP2HTML5中文学习网 - HTML5先行者学习网
} xP2HTML5中文学习网 - HTML5先行者学习网
function drawScene() xP2HTML5中文学习网 - HTML5先行者学习网
{ xP2HTML5中文学习网 - HTML5先行者学习网
ctx.clearRect(box_x, box_y, box_width, box_height); xP2HTML5中文学习网 - HTML5先行者学习网
ctx.strokeStyle = "rgb(0,0,0"; xP2HTML5中文学习网 - HTML5先行者学习网
ctx.strokeRect(box_x, box_y, box_width, box_height); xP2HTML5中文学习网 - HTML5先行者学习网
//detection collisions xP2HTML5中文学习网 - HTML5先行者学习网
//draw images xP2HTML5中文学习网 - HTML5先行者学习网
for (var i = 0; i < snake.length; i++) xP2HTML5中文学习网 - HTML5先行者学习网
{ xP2HTML5中文学习网 - HTML5先行者学习网
ctx.drawImage(image_sprite, snake[i].x, snake[i].y); xP2HTML5中文学习网 - HTML5先行者学习网
} xP2HTML5中文学习网 - HTML5先行者学习网
ctx.drawImage(image_sprite, food.x, food.y); xP2HTML5中文学习网 - HTML5先行者学习网
} xP2HTML5中文学习网 - HTML5先行者学习网
function init() xP2HTML5中文学习网 - HTML5先行者学习网
{ xP2HTML5中文学习网 - HTML5先行者学习网
canvas = document.getElementById("scene"); xP2HTML5中文学习网 - HTML5先行者学习网
ctx = canvas.getContext('2d'); xP2HTML5中文学习网 - HTML5先行者学习网
//images xP2HTML5中文学习网 - HTML5先行者学习网
image_sprite = new Image(); xP2HTML5中文学习网 - HTML5先行者学习网
image_sprite.src = "images/sprite.png"; xP2HTML5中文学习网 - HTML5先行者学习网
image_sprite.onLoad = function () xP2HTML5中文学习网 - HTML5先行者学习网
{} xP2HTML5中文学习网 - HTML5先行者学习网
//ojects xP2HTML5中文学习网 - HTML5先行者学习网
snake = new Array(); xP2HTML5中文学习网 - HTML5先行者学习网
var head = new Role(0 * unit, 0 * unit, unit, unit, 5, 0, 1, image_sprite, true); xP2HTML5中文学习网 - HTML5先行者学习网
snake.push(head); xP2HTML5中文学习网 - HTML5先行者学习网
window.addEventListener('keydown', play, false); xP2HTML5中文学习网 - HTML5先行者学习网
addFood(); xP2HTML5中文学习网 - HTML5先行者学习网
setInterval(update, 300); //note xP2HTML5中文学习网 - HTML5先行者学习网
setInterval(drawScene, 30); xP2HTML5中文学习网 - HTML5先行者学习网
} xP2HTML5中文学习网 - HTML5先行者学习网
xP2HTML5中文学习网 - HTML5先行者学习网
相关阅读:html5贪吃蛇游戏使用63行代码完美实现xP2HTML5中文学习网 - HTML5先行者学习网
(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助