js版贪吃蛇
之前没有写博客的习惯,这是我的第一个博客,有些的不好的地方,希望大家多多提意见
js版的贪吃蛇相对比较简单,废话不多说直接上代码,有需要注意的地方我会标红,github源码地址https://github.com/masterChunlinHan/snake.git
所有的代码都在一个文件中,因为总共就没多少代码
1,首先定义几个后面要用到的全局变量
地图定义为全局的是因为:后面的食物和蛇都要加到地图上,而添加的方法在食物和蛇各自的构造器中,需要地图是全局的才能被访问到
食物定义成全局的是因为:在蛇的移动方法中判断是否吃到食物,需要知道食物的坐标
蛇定义成全局的原因比较特殊:后面用键盘控制蛇头的方向,是window调用蛇的移动方法,在这个方法中this不再指向当前的对象(即蛇),而是window,所以要把蛇提升为全局变量
定时器定义成全局的是因为:在别的方法中需要取消定时或开始定时,比如暂停,还有吃到食物后更新速度加快
var map;//地图
var food;//食物
var snake;//蛇
var timer;//定时器
var time=500;//定时器定的时间,默认为500ms
2,地图构造器
function Map(){
this.width= 600; //地图的宽
this.height = 400; //地图的高
this.position = 'relative'; //地图定位方式,这里为相对定位
this.backgroundColor = '#ccc'; //地图背景色
this.map=null; //一来用来保存地图,二来可以判断地图是不是已经存在,以免重复创建
//显示地图的方法
this.showMap = function(){
if(this.map===null){
//加个判断保证地图只会创建一次
this.map = document.createElement('div');
document.body.appendChild(this.map);
}
this.map.style.width = this.width+'px';
this.map.style.height = this.height + 'px';
this.map.style.backgroundColor = this.backgroundColor;
this.map.style.position = this.position;
}
}
3,食物构造器,原理基本上跟地图构造器一样
function Food(){
this.width= 20;
this.height = 20;
this.x = 2; //这不是实际坐标,而是以食物的宽为单位
this.y = 2;
this.position = 'absolute';
this.backgroundColor = 'red';
this.food=null;
this.showFood=function(){
if(this.food===null){
this.food = document.createElement('div');
map.map.appendChild(this.food); //把食物添加到地图上
}
this.x = Math.floor(Math.random()*30); //食物的位置是随机的
this.y = Math.floor(Math.random()*20);
this.food.style.width = this.width+'px';
this.food.style.height = this.height + 'px';
this.food.style.backgroundColor = this.backgroundColor;
this.food.style.position = this.position;
this.food.style.left = this.width*this.x + 'px';
this.food.style.top = this.height*this.y + 'px';
}
}
4,蛇的构造器
function Snake(){
this.position = 'absolute';
this.width = 20;
this.height = 20;
this.body = [[2,2,'red',null],[1,2,'blue',null],[0,2,'blue',null]];//蛇的身体,默认一个头,两个身体第一个为头,每个数组中的元素分别代表这节身体的x,y,颜色,以及负责显示这节身体的div
this.directionKeyCode=39; //键盘的keyCode,默认39代表右键
//显示蛇
this.showSnake = function(){
for(var i=0;i<this.body.length;i++){
if(this.body[i][3]===null){
this.body[i][3] = document.createElement('div');//把
map.map.appendChild(this.body[i][3]);
}
this.body[i][3].style.width =this.width+'px';
this.body[i][3].style.height =this.height+'px';
this.body[i][3].style.position = this.position;
this.body[i][3].style.backgroundColor = this.body[i][2];
this.body[i][3].style.left = this.width*this.body[i][0]+'px';
this.body[i][3].style.top = this.width*this.body[i][1]+'px';
}
}
5,移动蛇的方法,需要写在蛇的构造器里面,注意这个方法里的snake不能用this代替,原因上面已经说明
在这个方法中需要判断蛇是否撞到了墙壁或者自身
this.moveSnake = function(){
//这个方法里的snake不能用this代替,原因上面已经说明
//更新每节身体的位置,除了蛇头外其他每节的位置更新为上一节的位置
//注意要从最后一节更新,因为每节的新位置是上一节的老位置,需要在上一节更新之前才能获取它的老位置
for(var i=snake.body.length-1;i>0;i--){
snake.body[i][0] = snake.body[i-1][0];
snake.body[i][1] = snake.body[i-1][1];
}
//设置蛇头位置
switch (snake.directionKeyCode){
case 37: //左
snake.body[0][0] -=1;
break;
case 38: //上
snake.body[0][1] -=1;
break;
case 39: //右
snake.body[0][0] +=1;
break;
case 40: //下
snake.body[0][1] +=1;
break;
}
//吃到食物的判断
if(snake.body[0][0]==food.x && snake.body[0][1]==food.y){
var lastBody = snake.body[snake.body.length-1]
snake.body.push([lastBody[0],lastBody[1],'blue',null]);
//吃到食物后更新食物的位置
food.showFood();
if(time>=250){//减少更新时间,加快蛇的速度,减少到250ms以下后不再加快
time-=50;
clearInterval(timer);
timer = setInterval(snake.moveSnake,time);
}
}
//判断边界
if(snake.body[0][0]>29 || snake.body[0][0]<0||snake.body[0][1]>19||snake.body[0][1]<0){
confirm("GameOver,点确定重新开始");
location.href='?'; //刷新网页方法一
}
//判断是否碰到到自己
for(var i=1;i<snake.body.length;i++){
if(snake.body[0][0]==snake.body[i][0]&&snake.body[0][1]==snake.body[i][1]){
confirm("GameOver,点确定重新开始");
//location.href='?';
location.reload(); //刷新网页方法二
}
}
//显示蛇,此时蛇的位置已改变
snake.showSnake();
}
6,到这里主要工作已经做完,这一步主要来创建暂定、继续、上、下、左、右按键,不想创建也可以,这一步可以直接忽略,下一步不再调用这些方法即可,不影响游戏的运行
注:这些方法不属于任何构造器
//停止按钮
function Stop(){
this.showStopBtn = function(){
var btn = document.createElement('button');
btn.innerHTML="暂停";
document.body.appendChild(btn); btn.onclick = function(){
clearInterval(timer);
confirm("暂停中,点确定开始");
timer =setInterval(snake.moveSnake,time);
}
}
}
//开始按钮
function Start(){
this.showStartBtn = function(){
var btn = document.createElement('button');
btn.innerHTML="开始";
document.body.appendChild(btn);
btn.onclick = function(){
clearInterval(timer);
timer =setInterval(snake.moveSnake,time);
}
}
}
//方向实体键
function DirectionButton(){
this.showDirectButtons=function(){
var btn = document.createElement('button');
btn.innerHTML="上";
document.body.appendChild(btn);
btn.onclick = function(){
snake.directionKeyCode=38;
} var btn = document.createElement('button');
btn.innerHTML="下";
document.body.appendChild(btn);
btn.onclick = function(){
snake.directionKeyCode=40;
} var btn = document.createElement('button');
btn.innerHTML="左";
document.body.appendChild(btn);
btn.onclick = function(){
snake.directionKeyCode=37;
} var btn = document.createElement('button');
btn.innerHTML="右";
document.body.appendChild(btn);
btn.onclick = function(){
snake.directionKeyCode=39;
}
} }
7,主要的创建流程
//创建并显示地图
map= new Map();
map.showMap();
//创建并显示食物
food = new Food();
food.showFood();
//创建并显示蛇
snake = new Snake();
snake.showSnake();
//设置定时器
// snake.moveSnake();
timer = window.setInterval(snake.moveSnake,time);
//添加键盘事件
document.body.onkeydown = function(e){
var event = window.event||e;
if(event.keyCode>=37&&event.keyCode<=40){//限制其他按键不起作用,只有上下左右四个按键起作用
snake.directionKeyCode = event.keyCode;
} }
//以下添加按键的步骤,可加可不加
//添加停止按钮
var stopBtn = new Stop();
stopBtn.showStopBtn();
//添加停止按钮
var startBtn = new Start();
startBtn.showStartBtn();
//添加上下左右按钮
var directionButtons = new DirectionButton();
directionButtons.showDirectButtons();
以上就是全部的代码,当然需要全部写在html中的<script>标签中,希望大家多多提意见哈
想看源码的小伙伴,这里有github地址https://github.com/masterChunlinHan/snake
js版贪吃蛇的更多相关文章
- OC版贪吃蛇
昨天写了一个js版贪吃蛇,今天突然想写一个OC版的,来对比一下两种语言的区别 oc版功能,适配所有尺寸iphone,可暂停,可设置地图和蛇的比例,可加速 对比一下会发现js版的相对OC版的会简单一些, ...
- JS仿贪吃蛇:一串跟着鼠标的Div
贪吃蛇是一款80后.90后比较熟悉的经典游戏,下面通过简单的JS代码来实现低仿版贪吃蛇效果:随着鼠标的移动,在页面中呈现所有Div块跟随鼠标依次移动,效果如下图所示. <!DOCTYPE htm ...
- TOJ 3973 Maze Again && TOJ 3128 简单版贪吃蛇
TOJ3973传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3973 时间限制(普通 ...
- 如何用python制作贪吃蛇以及AI版贪吃蛇
用python制作普通贪吃蛇 哈喽,大家不知道是上午好还是中午好还是下午好还是晚上好! 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很 ...
- Javascript基础示例:用JS写简易版贪吃蛇(面向对象)
废话不多说,代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...
- JavaScript 实现简易版贪吃蛇(Day_13)
时光永远在变迁,你始终要丢下过去. 使用语言 JavaScript 概述 运用JavaScript 实现简易版<贪吃蛇>. Html 页面 1 <!DOCTYPE htm ...
- JavaScript版—贪吃蛇小组件
最近在学习JavaScript,利用2周的时间看完了<JavaScript高级编程>,了解了Js是一门面向原型编程的语言,没有像C#语言中的class,也没有私有.公有.保护等访问限制的级 ...
- 前端笔记之JavaScript面向对象(三)初识ES6&underscore.js&EChart.js&设计模式&贪吃蛇开发
一.ES6语法 ES6中对数组新增了几个函数:map().filter().reduce() ES5新增的forEach(). 都是一些语法糖. 1.1 forEach()遍历数组 forEach() ...
- 原生JS制作贪吃蛇小游戏
感情都在代码里,来,干了!... <!doctype html> <html> <head> <meta http-equiv="Content-T ...
随机推荐
- [Paper Reading]--Exploiting Relevance Feedback in Knowledge Graph
<Exploiting Relevance Feedback in Knowledge Graph> Publication: KDD 2015 Authors: Yu Su, Sheng ...
- ReactNative开发工具有这一篇足矣
ReactNative系列文章: 1.<逻辑性最强的React Native环境搭建与调试> 2.<ReactNative开发工具有这一篇足矣> 正文 React Native ...
- 关于Calendar中设置月份比实际小1的问题
有如下程序,转化两个字符串数字为date类型,并判断是历史上的星期几,是否同为星期一 代码如下: public static void main(String[] args) throws Parse ...
- Angular4 - Can't bind to 'ngModel' since it isn't a known property of 'input'.
用[(ngModel)]="xxx"双向绑定,如:控制台报错:Can't bind to 'ngModel' since it isn't a known property of ...
- linux DNS 问题
今天准备爬虫51job时候,发现ping不通外网了,ping 了一下IP,都是OK的,只是host不通. 呵呵,就一DNS问题,好的.第一步,开始检查配置文件 cat /etc/sysconfig/n ...
- Ambari里如何删除某指定的服务(图文详解)
不多说,直接干货! Ambari 借鉴了很多成熟分布式软件的 API 设计.Rest API 就是一个很好地体现.通过 Ambari 的 Rest API,可以在脚本中通过 curl 维护整个集群.并 ...
- 【HTML】DocType
一.docType是什么 <!DOCTYPE> 声明不是 HTML 标签:它是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令. 在 HTML 4.01 中,<!D ...
- 现代C++新四大名著及C++学习杂谈
现代C++新四大名著及C++学习杂谈 翻开自己的博客,在2012年8月我曾经写过如下一篇博客, <<C++学习的方法以及四大名著>> http://www.cnblogs.co ...
- css3-d ,动画,圆角
一.3D 开启元素3D transform-style: preserve-3d; Z轴 正数 屏幕外,反之屏幕内 近大远小 perspective: length (必须大于等于0) -- 在3D元 ...
- Install and Run NATS Streaming Server
NATS是一个开源的.轻量级的.高性能的分布式消息通信系统,使用的公司有百度.西门子.VMware.HTC和爱立信.NATS Streaming是以NATS为动力的数据流系统,是用go语言写的,NAT ...