var canvas = document.getElementById('canvas');
var cxt = canvas.getContext('2d');

// 定时器
var timer;
// 游戏是否结束
var iStop = false;
var index = 0;
// 蛇位置
var snake_bodys = [{'x':20,'y':20},{'x':40,'y':20},{'x':60,'y':20}];
// 一个方格的长度
var snake_body_len = 20;
// 蛇头位置
var snake_head = {'x':20,'y':20};
// 蛇前进方向
var snake_direction = 's'; // east south west north
// 虫子的位置
var worm = {'x':200,'y':200};
// 前进时被删除的蛇的最后一个方格
var snake_last;
// 得分 一个虫子得一分
var score = 0;

var snake_color = '#8FBC8F';
var snake_border_color = 'red';
var snake_eye_color = 'black';
var worm_color = '#A0522D';

// 清除画布
function erase() {
cxt.clearRect(0, 0, canvas.width, canvas.height)
}

// 画蛇
function drawSnake() {
cxt.save();
cxt.strokeStyle = snake_border_color;
cxt.fillStyle = snake_color;
for(var i=0; i<snake_bodys.length; i++){
cxt.fillRect(snake_bodys[i].x, snake_bodys[i].y, snake_body_len, snake_body_len);
cxt.strokeRect(snake_bodys[i].x, snake_bodys[i].y, snake_body_len, snake_body_len);
}
cxt.restore();

cxt.save();
cxt.fillStyle = snake_eye_color;
cxt.beginPath();
cxt.arc(snake_head.x+10, snake_head.y+10, 5, 0, 360*Math.PI/180, false);
cxt.fill();
cxt.closePath();
cxt.restore();
}

// 画虫子
function drawWorm(){
cxt.save();
cxt.fillStyle = worm_color;
cxt.fillRect(worm.x, worm.y, snake_body_len, snake_body_len);
cxt.restore();
}

// 随机产生虫子
function createWorm(){
var r_x = Math.random();
var r_y = Math.random();
var x = Math.floor(r_x*20);
var y = Math.floor(r_y*20);
worm = {'x':x*20, 'y':y*20};
}

// 前进一步
function step(){
switch (snake_direction){
case 'e':
snake_head = {'x':snake_head.x + snake_body_len,'y':snake_head.y};
break;
case 's':
snake_head = {'x':snake_head.x,'y':snake_head.y + snake_body_len};
break;
case 'w':
snake_head = {'x':snake_head.x - snake_body_len,'y':snake_head.y};
break;
case 'n':
snake_head = {'x':snake_head.x,'y':snake_head.y - snake_body_len};
break;
default :
break;
}

// 是否吃到了虫子
if(snake_head.x == worm.x && snake_head.y == worm.y){
createWorm();
snake_bodys.push(snake_last);
score++;
}

snake_last = snake_bodys.pop();
snake_bodys.unshift(snake_head);

// 蛇碰到了自己的身体 游戏结束
for(var i=1; i<snake_bodys.length; i++){
if(snake_head.x == snake_bodys[i].x && snake_head.y == snake_bodys[i].y){
iStop = true;
break;
}
}

// 蛇跑出了边界 游戏结束
if(snake_head.x >= 400 || snake_head.x < 0 || snake_head.y >= 400 || snake_head.y< 0){
iStop = true;
}
}

// 画得分
function drawScore() {
cxt.save();
cxt.font="20px Verdana";
cxt.fillStyle = 'skyblue';
cxt.fillText('得分:' + score, 300, 50);
cxt.restore();
}

// 画游戏结束
function drawOver() {
cxt.save();
cxt.font="20px Verdana";
cxt.fillStyle = 'yellow';
cxt.fillText('游戏结束!', 150, 190);
cxt.restore();
}

var last = new Date();
document.onkeydown = (function(e){
var now = new Date();
if(now.getTime() - last.getTime() < 100){
return;
}
last = now;
switch(e.which){
case 39:
if(snake_direction != 'w'){
snake_direction = 'e';
}
break;
case 40:
if(snake_direction != 'n') {
snake_direction = 's';
}
break;
case 37:
if(snake_direction != 'e') {
snake_direction = 'w';
}
break;
case 38:
if(snake_direction != 's') {
snake_direction = 'n';
}
break;
}
});

window.requestAnimationFrame =
window.requestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.msRequestAnimationFrame;

window.cancelRequestAnimationFrame =
window.cancelRequestAnimationFrame ||
window.mozCancelRequestAnimationFrame ||
window.webkitCancelRequestAnimationFrame ||
window.msCancelRequestAnimationFrame;

function animate() {
index++;
if(index%10 == 0){
step();
}
erase();
drawSnake();
drawWorm();
drawScore();

if(iStop){
cancelRequestAnimationFrame(timer);
drawOver();
}else{
timer = requestAnimationFrame(animate);
}
}

animate();

canvas 实现贪吃蛇游戏的更多相关文章

  1. H5实现的可自定义贪吃蛇游戏

    原创游戏,使用lufylegend.js开发 用canvas实现的贪吃蛇游戏,与一般的贪吃蛇游戏不同,图片经过美工设计,代码设计支持扩展和自定义. 游戏元素丰富,包括障碍物(仙人掌),金币(奖励),苹 ...

  2. 「JavaScript」手起刀落-一起来写经典的贪吃蛇游戏

    回味 小时候玩的经典贪吃蛇游戏我们印象仍然深刻,谋划了几天,小时候喜欢玩的游戏,长大了终于有能力把他做出来(从来都没有通关过,不知道自己写的程序,是不是能通关了...),好了,闲话不多谈,先来看一下效 ...

  3. 使用electron为贪吃蛇游戏创建全局快捷键

    上图就是我们的简体版贪吃蛇游戏,我们可以看到使用键盘上面的上下左右可以对贪吃蛇进行控制. The picture above is our simplified version of Snake Ea ...

  4. 贪吃蛇游戏(printf输出C语言版本)

    这一次我们应用printf输出实现一个经典的小游戏—贪吃蛇,主要难点是小蛇数据如何存储.如何实现转弯的效果.吃到食物后如何增加长度. 1 构造小蛇 首先,在画面中显示一条静止的小蛇.二维数组canva ...

  5. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  6. 用C++实现的贪吃蛇游戏

    我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...

  7. WebGL实现HTML5的3D贪吃蛇游戏

    js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型, ...

  8. 100行JS实现HTML5的3D贪吃蛇游戏

    js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型, ...

  9. JS贪吃蛇游戏

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

随机推荐

  1. Mac IntelliJ IDEA 2017(java开发集成环境)附注册码和破解教程 v2017.3.5破解版

    原文:http://www.orsoon.com/Mac/155938.html 原文中含有软件下载地址 软件介绍 IntelliJ IDEA 2017 Mac激活版是Mac平台上的一款java开发集 ...

  2. pta l2-11(玩转二叉树)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805065406070784 题意:给定二叉树的结点个数n,其前 ...

  3. white-space和word-wrap和word-break所表示的换行和不换行的区别

    一.前言 使得文本换行有很多方式, <br/>标签元素,能够强制使得所在位置文本换行 <p>元素,<div>设定宽度,都可以对文本内容实现自适应换行 对于长单词或者 ...

  4. html5文件读取+按钮样式重置+文件内容预览

    FileReader读取文件详细介绍请访问:http://www.cnblogs.com/xyyt/p/9066882.html FileReader提供了如下方法: readAsArrayBuffe ...

  5. vue 父子组件相互传参

    转自https://blog.csdn.net/u011175079/article/details/79161029 子组件: <template> <div> <di ...

  6. 【Linux 线程】常用线程函数复习《四》

    1.线程属性的设置 /************************************************************************* > File Name: ...

  7. JavaFX

    [AWT-SWING-JAVA FX] 多平台.多应用的现有通用类 [inner class] (member class)inside another class, outside any meth ...

  8. 微信小程序基础架构

    一个微信小程序界面由一个页面描述文件,一个页面逻辑文件,一个样式表文件来进行描述 在主目录中的三个以app开头的文件就是微信小程序的主描述文件 app.js :主逻辑文件,用来注册小程序 app.js ...

  9. 15-算法训练 P1103

    http://lx.lanqiao.cn/problem.page?gpid=T372   算法训练 P1103   时间限制:1.0s   内存限制:256.0MB      编程实现两个复数的运算 ...

  10. java中钩子方法的概念

    钩子方法源于设计模式中模板方法(Template Method)模式,模板方法模式的概念为:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情况下,重新 ...