canvas 实现贪吃蛇游戏
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 实现贪吃蛇游戏的更多相关文章
- H5实现的可自定义贪吃蛇游戏
原创游戏,使用lufylegend.js开发 用canvas实现的贪吃蛇游戏,与一般的贪吃蛇游戏不同,图片经过美工设计,代码设计支持扩展和自定义. 游戏元素丰富,包括障碍物(仙人掌),金币(奖励),苹 ...
- 「JavaScript」手起刀落-一起来写经典的贪吃蛇游戏
回味 小时候玩的经典贪吃蛇游戏我们印象仍然深刻,谋划了几天,小时候喜欢玩的游戏,长大了终于有能力把他做出来(从来都没有通关过,不知道自己写的程序,是不是能通关了...),好了,闲话不多谈,先来看一下效 ...
- 使用electron为贪吃蛇游戏创建全局快捷键
上图就是我们的简体版贪吃蛇游戏,我们可以看到使用键盘上面的上下左右可以对贪吃蛇进行控制. The picture above is our simplified version of Snake Ea ...
- 贪吃蛇游戏(printf输出C语言版本)
这一次我们应用printf输出实现一个经典的小游戏—贪吃蛇,主要难点是小蛇数据如何存储.如何实现转弯的效果.吃到食物后如何增加长度. 1 构造小蛇 首先,在画面中显示一条静止的小蛇.二维数组canva ...
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- 用C++实现的贪吃蛇游戏
我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...
- WebGL实现HTML5的3D贪吃蛇游戏
js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型, ...
- 100行JS实现HTML5的3D贪吃蛇游戏
js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型, ...
- JS贪吃蛇游戏
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
随机推荐
- [译] 什么阻塞了 DOM?
原文地址:https://www.keycdn.com/blog/blocking-the-dom/原文作者:BRIAN JACKSON 当我们谈到web性能或者优化页面级别的速度时,非常重要的一点是 ...
- UVA1588-Kickdown
2018-10-30-18:27:03 原题链接 题目描述: 给出两个长度分别为n1,n2且每列高度只为1或2的长条,需要将它们放入一个高度为3的容器,求出能够容纳他们的最短容器长度. 本题思路: 模 ...
- C# 关于委托
例如: public class test:Form { //定义委托 public delegate void GetSql(string sql); //定义装载委托的属性 public GetS ...
- 如何彻底卸载mysql(xp)
如何彻底卸载mysql 完整的卸载MySQL 5.x 的方法: 1.控制面板里的增加删除程序内进行删除 2.删除MySQL的安装文件夹C:\Program Files\MySQL,如果备份好,可以直接 ...
- @ResponseBody使用须知
-------------------siwuxie095 @ResponseBody 使用须知 使用 @ResponseBody 注解映射响应体 @ResponseBody 注解可被应用于方法上,标 ...
- 微信小程序开发——苹果手机领取卡券出现参数错误(安卓正常)
异常描述: 微信小程序领取卡券,调用 wx.addCard 接口,安卓手机正常调起领取卡券界面,苹果手机.微信开发者工具中均出现“参数错误”,如图: 异常解析: 安卓手机能正常调起领取界面,那就说明领 ...
- swift - view的指定位置切圆角
1. extension UIView{ func addCorner(conrners: UIRectCorner , radius: CGFloat) { let maskPath = UIBez ...
- Java遍历文件夹下的所以文件
利用Java递归遍历文件夹下的所以文件,然后对文件进行其他的操作.如:对文件进行重命名,对某一类文件进行重编码.可以对某一工程下的全部.java文件进行转码成utf-8等 代码如下,这里只对文件进行重 ...
- PyQt5速成教程
博客地址 https://www.jianshu.com/nb/26159952
- nginx与php-fpm原理
一.正向代理与反向代理 1.正向代理:访问google.com google.com vpn需要FQ才能访问 vpn 对于我们来说是可以感知到的(我们连接vpn),但对于google服务器是不知道 ...