canvas贪吃蛇游戏
用canvas做了一个贪吃蛇小游戏
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>贪吃蛇</title>
- <style>
- body{background: #666;text-align: center;}
- canvas{margin: 50px auto 0;/*border: 2px solid green;*/}
- </style>
- </head>
- <body>
- <canvas id="snake" width="800" height="500"></canvas>
- <script>
- /**
- * Created by linyufeng on 2017/7/26.
- */
- var width = 800;//游戏宽度
- var height = 500;//游戏高度
- var flag = false;//控制游戏是否结束
- var snakeArr;//存放身体坐标
- var food;//指定食物
- var direction;//运动方向
- var snakeMove;//自动运动(定时器)
- var size = 20;//食物和蛇大小
- var speed = 1000;//运动速度
- var highScore = 0;//最高分数
- var snake = document.getElementById('snake').getContext('2d');//获取canvas对象
- //重置游戏
- function reset(){
- flag = true;//开始游戏
- snakeArr = [{x:size*10,y:size*10},{x:size*10,y:size*10+size},{x:size*10,y:size*10+2*size}];//生成身体
- food = createFood();//随机食物
- direction = 39;//指定默认运动方向: 37左 38上 39右 40下
- }
- //开始游戏
- function start(){
- drawRect({x:0,y:0,w:width,h:width});
- drawText({text:'贪 吃 蛇',x:width/2,y:150,font:'64px 微软雅黑'});
- drawText({text:'开 始 游 戏',x:width/2,y:250,font:'34px 微软雅黑'});
- drawText({text:'最高分数: '+highScore,x:width/2,y:350,font:'24px 微软雅黑'});
- drawText({text:'按Enter键开始游戏',x:width/2,y:width/2,font:'24px 微软雅黑'});
- }
- //结束游戏
- function end(){
- clearInterval(snakeMove);
- flag = false;
- var score = snakeArr.length-3;
- highScore = highScore<score?score:highScore;
- drawText({text:'游 戏 结 束',x:width/2,y:150,font:'64px 微软雅黑'});
- drawText({text:'游戏分数: '+score,x:width/2,y:250,font:'34px 微软雅黑'});
- drawText({text:'最高分数: '+highScore,x:width/2,y:350,font:'24px 微软雅黑'});
- drawText({text:'按Enter键开始游戏',x:width/2,y:width/2,font:'24px 微软雅黑'});
- }
- //初始化游戏
- function init(){
- reset();
- draw();
- snakeMove = setInterval(function(){
- update(direction);
- },speed);
- }
- //画游戏界面
- function draw(){
- snake.clearRect(0,0,width,height);//清屏
- drawRect({x:0,y:0,w:width,h:width});//画背景
- drawSnake(snakeArr);//画蛇
- drawCircle(food.x,food.y);//画食物
- drawText({text:'分数: '+(snakeArr.length-3),x:10,y:10,font:'24px 微软雅黑',baseline:'top',align:'left'});//画分数
- }
- //随机产生食物
- function createFood(){
- var x = parseInt(Math.random()*(width/size))*size;
- var y = parseInt(Math.random()*(height/size))*size;
- return {x:x, y:y};
- }
- //身体运动和碰撞检测
- function update(direction){
- var head = snakeArr[0];
- if(!flag){
- return;//结束游戏
- }
- var newHead = {};
- if(direction == 37){//左
- newHead = {x:head.x-size,y:head.y};
- }else if(direction == 38){//上
- newHead = {x:head.x,y:head.y-size};
- }else if(direction == 39){//右
- newHead = {x:head.x+size,y:head.y};
- }else if(direction == 40){//下
- newHead = {x:head.x,y:head.y+size};
- }
- //身体自身碰撞检测
- for (var i = 0; i < snakeArr.length; i++) {
- var snake = snakeArr[i];
- if(snake.x==newHead.x && snake.y==newHead.y){
- end();
- return;
- }
- }
- //墙壁碰撞检测
- if(head.x<=0 || head.x>=width || head.y<=0 || head.y>=height){
- end();
- return;
- }else{
- //食物碰撞检测
- if(newHead.x==food.x && newHead.y==food.y){
- snakeArr.unshift(food);//添身体
- food = createFood();
- }else{
- snakeArr.unshift(newHead);//添头
- snakeArr.pop();//去尾
- }
- draw();
- }
- }
- //游戏开始画面
- start();
- //绑定鼠标控制事件
- document.addEventListener('keydown',function(e){
- e.preventDefault();
- /*******************************************
- * 37 Left(左箭头)
- * 38 Up(上箭头)
- * 39 Right(右箭头)
- * 40 Down(下箭头)
- * ******************************************/
- var code = e.keyCode || e.which;
- /***************************************
- * 只对上下左右键和Enter键生效,屏蔽其他键!
- * *************************************/
- if(code==37 || code==38 || code==39 || code==40 || code==13){
- /********************************************
- * 如果游戏未开始或者已结束,此时按下Enter键开始游戏
- * ******************************************/
- if(code==13){
- if(flag==false){
- init();
- }
- }else{
- /******************************************
- * 如果蛇的运动方向是上,那么不能向下运动
- * 如果蛇的运动方向是下,那么不能向上运动
- * 如果蛇的运动方向是左,那么不能向右运动
- * 如果蛇的运动方向是右,那么不能向左运动
- * ****************************************/
- if(Math.abs(code-direction)==2){
- return;//不允许这种移动方式
- }
- direction = code;
- update(direction);
- }
- }
- });
- /******************************************************************
- * 封装公共方法:
- * 1. 画矩形
- * 2. 写文字
- * 3. 画小方块
- * ****************************************************************/
- /**
- * @func: 画矩形
- * @params: {x} x坐标
- * @params: {y} y坐标
- * @params: {w} 宽度
- * @params: {h} 高度
- * @color: {color} 颜色
- * */
- function drawRect(option){
- /**************************************************************
- * 说明:canvas对象应该从外部传入,但是为了避免每次调用方法时都要传入,就固定写死了!
- * ************************************************************/
- snake.beginPath();
- snake.fillStyle = option.color || '#000';
- snake.fillRect(option.x,option.y,option.w,option.h);
- snake.closePath();
- }
- /**
- * @func: 写文字
- * @params: {x} x坐标
- * @params: {y} y坐标
- * @params: {w} 宽度
- * @params: {h} 高度
- * @params: {color} 颜色
- * @params: {baseline} 文字上下对齐方式
- * @params: {align} 文字左右对齐方式
- * */
- function drawText(option){
- snake.beginPath();
- snake.fillStyle = option.color || '#fff';
- snake.fontFamily = '微软雅黑';
- snake.font = option.font;
- snake.textBaseline = option.baseline || 'middle';
- snake.textAlign = option.align || 'center';
- snake.fillText(option.text,option.x,option.y);
- snake.closePath();
- }
- /**
- * @func: 画小方块
- * @params: {x} x坐标
- * @params: {y} y坐标
- * */
- function drawSquare(x,y){
- snake.beginPath();
- snake.fillStyle = '#fff';
- snake.fillRect(x+1,y+1,size-2,size-2);
- snake.closePath();
- }
- /**
- * @func: 画食物
- * @params: {x} x坐标
- * @params: {y} y坐标
- * */
- function drawCircle(x,y){
- snake.beginPath();
- snake.arc(x+size/2, y+size/2, size/2, 0, Math.PI*2,true);
- snake.fillStyle = '#0f0';
- snake.fill();
- snake.closePath();
- }
- /**
- * @func: 画蛇
- * @params: {arr} 蛇身体坐标
- * */
- function drawSnake(arr){
- for (var i = 0; i < arr.length; i++) {
- var snake = arr[i];
- drawSquare(snake.x,snake.y)
- }
- }
- </script>
- </body>
- </html>
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 ...
随机推荐
- centos7.2安装完成的基本操作
系统是centos7.2,安装完成的基本操作 1 修改网卡为eth02 更新系统3 给/etc/rc.local添加执行权限4 添加用户hequan5 禁用selinux6 关闭防火墙安装iptabl ...
- kubernetes1.5.2 dashboard配置
镜像:https://hub.daocloud.io/#!/repos/f8919a2c-2540-424e-8758-d23cc76b6d80 启动Kubernetes集群 配置Kubernetes ...
- 搭建Hadoop集群(生产环境)
1.搭建之前:百度copy一下介绍 (本博客几乎全都是生产环境的配置..包括mongo等hbase其他) Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用户可以在不了解分布式底层 ...
- 面向对象【day08】:动态导入模块(八)
本节内容 1.概述 2.知识回顾 3.动态导入模块 一.概述 我们之前导入模块都是用import,或者from ... import ....这种模式去导入模块,那如果我们如何实现只用字符串就可以导入 ...
- C#设计模式(11)——装饰者模式
1.装饰者模式介绍 装饰者顾名思义就是对一个类添加一些额外的装饰(功能).我们想给一个对象添加一些额外的功能又不改变对象内方法的签名怎么做呢?最常用的方法就是继承了,子类继承父类,然后重写父类的方法. ...
- Structured Streaming Programming Guide结构化流编程指南
目录 Overview Quick Example Programming Model Basic Concepts Handling Event-time and Late Data Fault T ...
- ArcGis Python脚本——根据字段内容拆分要素类(shp)为多个
其实,这就是批量执行了ArcToolbox 分析工具-筛选 功能. 先上代码,后做解说: # in_feature:待拆分要素类 # out_folderpath:输出路径,注意最后加“/”以与字段名 ...
- AAndroid Studio的\drawable还是mipmap
图片应该放在drawable文件夹下,而mipmap文件夹只适合放app icons
- 通过WifI开发调试Android设备
前言:使用的windows系统,为了可以通过wifi可以直接连接android设备调试,尝试使用以下方法一.使用ADB USB to WIFI 一直不成功. 二.使用命令行方式 1.进入android ...
- linux下安装好mysql后,登录时提示libgcc_s.so.1 must be installed for pthread_cancel to work
网上找了很多帖子,各说纷纭, 自己到https://centos.pkgs.org/下载对应版本的libgcc_s.so.1,使用rpm -ivh libgcc-4.8.5-16.el7.i686.r ...