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. java实现person类 override(重写) comparable接口

    具体题目如下: 定义一个Person类,包含姓名(name).身高(height).体重(weight),以及talk()方法,该方法的功能是,输出自己的身高和体重信息.Person类实现Compar ...

  2. 微信小程序开发-rem转换rpx小工具

    实现原理: 对样式进行格式化,然后根据 “rem” 进行拆分,这样就会拆分成一个数组 [str1,str2,str3...,str6], 除了最后一个元素,前边的元素都会以 “rem” 样式的数值结尾 ...

  3. iOS开发时使用的bundle路径

    bundle是一个目录,其中包含了程序会使用到的资源. 这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in). 对应bundle,cocoa提供了类NSBu ...

  4. Python: 高阶函数与lambda表达式

    缘由: python语法简单一看就会,但用在实处,想因为少于实战,总感觉有些捉襟. 翻阅跟踪youtube_dl源码,看到filter()函数用法,及其中lambda表达式,感觉好有意思,就补下课,记 ...

  5. python函数的万能参数

    我们通过一个简单的事例来展示一下函数的万能参数,我们先写一个最简单的函数 def test(*args,**kwargs): print(args,kwargs) 然后定义两个变量 l = [1,2, ...

  6. ORACLE分组查询和统计等

    select flow_id,rw from (select t.flow_id ,rownum as rw from apex_030200.wwv_flow_list_templates t)  ...

  7. 以太坊难度炸弹是什么?极大抑制矿工继续以POW方式挖矿!

    以太坊的“难度炸弹”(“Difficulty Bomb”)指的是,在挖掘算法中,使用以太币在区块链上对矿工进行奖励的难度越来越大.随着游戏变得更加复杂(矿工发现以太币难挣得多),在以太坊区块链上块的生 ...

  8. mongodb导入csv结构化数据

    csv数据样本 "103238704","","-jmyuncker@aol.com-","-r4Vp5iL2VbM=-" ...

  9. HTTP Basic Authentication认证(Web API)

    当下最流行的Web Api 接口认证方式 HTTP Basic Authentication: http://smalltalllong.iteye.com/blog/912046 什么是HTTP B ...

  10. 1.maven安装配置

    这段时间在做项目构建管理方面的工作,以前很多项目都是通过ant去构建的,虽然很早就接触过mavan,但是从没有系统的去学习过, 现在项目需要用maven来构建,我结合自己的心得整理一下放在博客上作为自 ...