如何基于javascript实现贪吃蛇游戏
这篇文章主要介绍了如何基于javascript实现贪吃蛇游戏,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
html代码:
这篇文章主要介绍了如何基于javascript实现贪吃蛇游戏,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
html代码:
css代码:
*{
margin:0;
padding:0;
}
body{
background-color:#565F65;
width:100%;
height:10vh;
overflow:hidden;
}
.content{
width:500px;
height:500px;
position:absolute;
top:50%;
left:50%;
margin-top:-250px;
margin-left:-250px;
background-color:#565F65;
border:10pxsolid#E7E7E7;
box-shadow:inset0px0px5px2px#000;
}
.btn{
width:100%;
height:100%;
position:absolute;
top:0;
left:0;
background-color:rgba(0,0,0,.3);/*游戏未开始时和暂停时的遮罩*/
z-index:2;
}
.btnbutton{
background:none;
border:none;
background-size:100%100%;
cursor:pointer;
outline:none;
position:absolute;
left:50%;
top:50%;
}
.startBtnbutton{
width:170px;
height:80px;
background-image:url(img/startbtn.png);
margin-top:-40px;
margin-left:-85px;
}
.stopBtn{
display:none;
}
.stopBtnbutton{
width:70px;
height:70px;
background-image:url(img/stopbtn.png);
margin-top:-35px;
margin-left:-35px;
}
#snakeWrap{
width:500px;
height:500px;
position:relative;
}
.snakeHead{/*蛇头样式*/
background-color:aqua;
border-radius:50%;
}
.snakeBody{/*蛇身样式*/
background-color:navajowhite;
border-radius:50%;
}
.food{/*食物样式*/
background-image:url(img/food.png);
background-size:cover;
}
javascript代码:
varsw=20,//一个方块的宽
sh=20,//一个方块的高
tr=25,//行数
td=25;//列数
varsnake=null,//蛇的实例
food=null,//食物的实例
game=null;//游戏的实例
functionSquare(x,y,classname){
this.x=x*sw;//方块实际的位置
this.y=y*sh;//方块实际的位置
this.class=classname;
this.viewContent=document.createElement('div');//方块对应的DOM元素
this.viewContent.className=this.class;
this.parent=document.getElementById('snakeWrap');//方块的父级
}
Square.prototype.create=function(){//创建方块DOM,并添加到页面里
this.viewContent.style.position='absolute';
this.viewContent.style.width=sw+'px';
this.viewContent.style.height=sh+'px';
this.viewContent.style.left=this.x+'px';
this.viewContent.style.top=this.y+'px';
this.parent.appendChild(this.viewContent);
};
Square.prototype.remove=function(){
this.parent.removeChild(this.viewContent);
}
//蛇
functionSnake(){
this.head=null;//存一下蛇头的信息
this.tail=null;//存一下蛇尾的信息
this.pos=[];//存储蛇身上的每一个方块的位置,二维数组
this.directionNum={//存储蛇走的方向,用一个对象来表示
left:{
x:-1,
y:0,
rotate:180
},
right:{
x:1,
y:0,
rotate:0
},
up:{
x:0,
y:-1,
rotate:-90
},
down:{
x:0,
y:1,
rotate:90
}
}
}
Snake.prototype.init=function(){
//创建蛇头
varsnakeHead=newSquare(2,0,'snakeHead');
snakeHead.create();
this.head=snakeHead;//存储蛇头信息
this.pos.push([2,0]);//把蛇头的位置存起来
//创建蛇身体
varsnakeBody1=newSquare(1,0,'snakeBody');
snakeBody1.create();
this.pos.push([1,0]);//把蛇身1的位置存起来
varsnakeBody2=newSquare(0,0,'snakeBody');
snakeBody2.create();
this.tail=snakeBody2;//把蛇尾的信息存起来
this.pos.push([0,0]);//把蛇身1的位置存起来
//让蛇头蛇身形成链表关系
snakeHead.last=null;
snakeHead.next=snakeBody1;
snakeBody1.last=snakeHead;
snakeBody1.next=snakeBody2;
snakeBody2.last=snakeBody1;
snakeBody2.next=null;
//给蛇添加一条属性,用来表示蛇走的方向
this.direction=this.directionNum.right;//默认让蛇往右走
}
//这个方法用来获取蛇头的下一个位置对应的元素,要根据元素做不同的事情
Snake.prototype.getNextPos=function(){
varnextPos=[//蛇头要走的下一个点的坐标
this.head.x/sw+this.direction.x,
this.head.y/sh+this.direction.y
];
//下一个点是自己,代表撞到了自己,游戏结束
varselfCollind=false;//是否撞到自己
this.pos.forEach(function(value){
if(value[0]==nextPos[0]&&value[1]==nextPos[1]){
//如果数组中的两个数据都相等,就说明下一个点在蛇身上里面能找到,代表撞到自己了
selfCollind=true;
}
});
if(selfCollind){
console.log('撞到自己了!');
this.strategies.die.call(this);
return;
}
//下一个点是墙,游戏结束
if(nextPos[0]<0||nextPos[1]<0||nextPos[0]>td-1||nextPos[1]>tr-1){
console.log('撞墙了!');
this.strategies.die.call(this);
return;
}
//下一个点是食物,吃
if(food&&food.pos[0]==nextPos[0]&&food.pos[1]==nextPos[1]){
//如果这个条件成立说明现在蛇头要走的下一个点是食物的那个点
console.log('撞到食物了了!');
this.strategies.eat.call(this);
return;
}
//下一个点什么都不是,走
this.strategies.move.call(this);
};
//处理碰撞后要做的事
Snake.prototype.strategies={
move:function(format){//这个参数用于决定要不要删除最后一个方块(蛇尾),当传了这个参数后就表示要做的事情是吃
//创建新身体(在蛇头位置)
varnewBody=newSquare(this.head.x/sw,this.head.y/sh,'snakeBody');
//更新链表关系
newBody.next=this.head.next;
newBody.next.last=newBody;
newBody.last=null;
this.head.remove();//旧舌头从原来的位置删除
newBody.create();
//创建一个新蛇头(蛇头下一个要走到的点)
varnewHead=newSquare(this.head.x/sw+this.direction.x,this.head.y/sh+this.direction.y,'snakeHead')
//更新链表关系
newHead.next=newBody;
newHead.last=null;
newBody.last=newHead;
newHead.viewContent.style.transform='rotate('+this.direction.rotate+'deg)';
newHead.create();
//蛇身上每一个方块的坐标也要更新
this.pos.splice(0,0,[this.head.x/sw+this.direction.x,this.head.y/sh+this.direction.y]);
this.head=newHead;//还要把this.head的信息更新一下
if(!format){//如何format的值为false,表示需要删除(除了吃之外的操作)
this.tail.remove();
this.tail=this.tail.last;
this.pos.pop();
}
},
eat:function(){
this.strategies.move.call(this,true);
createFood();
game.score++;
},
die:function(){
game.over();
}
}
snake=newSnake();
//创建食物
functioncreateFood(){
//食物小方块的随机坐标
varx=null;
vary=null;
varinclude=true;//循环跳出的条件,true表示食物的坐标在蛇身上(需要继续循环),false表示食物坐标不在蛇身上(不循环了)
while(include){
x=Math.round(Math.random()*(td-1));//0-29
y=Math.round(Math.random()*(tr-1));
snake.pos.forEach(function(value){
if(x!=value[0]&&y!=value[1]){
//这个条件成立说明现在随机出来的这个坐标,在蛇身上并没有找到
include=false;
}
});
}
//生成食物
food=newSquare(x,y,'food');
food.pos=[x,y];//存储一下生成食物的坐标,用于跟蛇头要走的下一个点作对比
varfoodDom=document.querySelector('.food');
if(foodDom){
foodDom.style.left=x*sw+'px';
foodDom.style.top=y*sh+'px';
}else{
food.create();
}
}
//创建游戏逻辑
functionGame(){
this.timer=null;
this.score=0;
this.speed=200;
}
Game.prototype.init=function(){
snake.init();
snake.getNextPos();
createFood();
document.onkeydown=function(ev){//用户按下方向键触发事件
if(ev.which==37&&snake.direction!=snake.directionNum.right){
//用户按下左键是,蛇不能是往右走
snake.direction=snake.directionNum.left;
}elseif(ev.which==38&&snake.direction!=snake.directionNum.dowm){
snake.direction=snake.directionNum.up;
}elseif(ev.which==39&&snake.direction!=snake.directionNum.left){
snake.direction=snake.directionNum.right;
}elseif(ev.which==40&&snake.direction!=snake.directionNum.up){
snake.direction=snake.directionNum.down;
}
}
this.start();
}
Game.prototype.start=function(){//开始游戏
this.timer=setInterval(function(){
snake.getNextPos();
},this.speed);
}
Game.prototype.pause=function(){
clearInterval(this.timer);
}
Game.prototype.over=function(){//开始游戏
clearInterval(this.timer);
alert('你的得分为'+this.score);
//游戏回到最初的状态
varsnakeWrap=document.getElementById('snakeWrap');
snakeWrap.innerHTML='';
snake=newSnake();
game=newGame();
varstartBtnWrap=document.querySelector('.startBtn');
startBtnWrap.style.display='block';
}
//开启游戏
game=newGame();
varstartBtn=document.querySelector('.startBtnbutton');
startBtn.onclick=function(){
startBtn.parentNode.style.display='none';
game.init();
};
//暂停
varsnakeWrap=document.getElementById('snakeWrap');
varpuseBtn=document.querySelector('.stopBtnbutton')
snakeWrap.onclick=function(){
game.pause();
puseBtn.parentNode.style.display='block';
}
puseBtn.onclick=function(){
game.start();
puseBtn.parentNode.style.display='none';
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。