JS ——简易贪吃蛇

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			*{margin: 0;padding: 0;}
			#game{
				height: 600px;
				width: 600px;
				position: absolute;
				top: 50%;
				left: 50%;
				transform: translate(-50%,-50%);
				border: 1px solid #f0f;
				background: skyblue;
			}
			#game span{
				height: 20px;
				width: 20px;
				border-radius: 50%;
				background: pink;
				display: block;
				position: absolute;
			}
			#game div{
				position:absolute;
				width: 20px;
				height: 20px;
				border-radius:50%;
				background-color:orange;
			}
		</style>
	</head>
	<body>
		<div id="game">
			<!-- <span id="span"></span> -->
		</div>
		
		
		<script type="text/javascript">
			
			function getRandomColor(){
			  var arr = ["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];
			  var result = "#";
			  for(var i = 0; i < 6;i++){
			    var index = Math.floor(Math.random() * 16)
			    result = result + arr[index];
			  }
			  return result;
			}
			
			
			
			// 游戏信息
			var gameInfo={
				el:document.getElementById("game"),
				width:600,
				goDie:function(){
					clearInterval(snake.moveID)
				}
			}
			
			
			// 蛇的相关信息
			var snake={
				// 蛇的初始化长度
				length:4,
				// 每次增加的长度
				width:20,
				// 蛇的方向
				dir:"right",
				bodylist:[],
				moveID:0,
				// 初始化一条蛇
				begin:function(){
					for(var i=0;i<this.length;i++){
						var span=document.createElement("span")
						gameInfo.el.appendChild(span)
						span.style.top="0px";
						span.style.left=i*snake.width+"px";
						this.bodylist.push(span)
					}
				},
				
				// 蛇的移动逻辑
				move:function(){
					this.moveID= setInterval(function(){
						
						
						// 将蛇尾放在蛇身前
						var foot=snake.bodylist[0];
						var head=snake.bodylist[snake.bodylist.length-1]
						
						if(snake.dir==="right"){
							foot.style.top=head.style.top;
							foot.style.left=parseInt(head.style.left)+snake.width+"px";
						}
						
						if(snake.dir==="left"){
							foot.style.top=head.style.top;
							foot.style.left=parseInt(head.style.left)-snake.width+"px";
						}
						
						if(snake.dir==="bottom"){
							foot.style.top=parseInt(head.style.top)+snake.width+"px";
							foot.style.left=head.style.left;
						}
						
						if(snake.dir==="top"){
							foot.style.top=parseInt(head.style.top)-snake.width+"px";
							foot.style.left=head.style.left;
						}
						// 调整数组的对应关系,保证页面中的节点顺序与数组的顺序相一致
						snake.bodylist.shift()
						snake.bodylist.push(foot)	
						
						// 得分碰撞检测2
						var HEAD=snake.bodylist[snake.bodylist.length-1]
						var HEADPoint={
							x:parseInt(HEAD.style.left),
							y:parseInt(HEAD.style.top),
						}
						if(HEADPoint.x===food.point.x&&HEADPoint.y===food.point.y){
							food.creat()
							snake.addbody()
						}
						
						
						
						
						// 死亡碰撞检测之边缘碰撞
						if(HEADPoint.x<0||HEADPoint.x===gameInfo.width||HEADPoint.y<0||HEADPoint.y===gameInfo.width){
							gameInfo.goDie();
						}
						// 死亡碰撞检测之自己碰撞
						for(var i=0;i<snake.bodylist.length-1;i++){
							var point={
								x:parseInt(snake.bodylist[i].style.left),
								y:parseInt(snake.bodylist[i].style.top)
							}
							if(HEADPoint.x===point.x&&HEADPoint.y===point.y){
								gameInfo.goDie()
							}
						}
						
						
					},300)
				},
				// 长身体	
				addbody:function(){
					var span=document.createElement("span")
					gameInfo.el.appendChild(span)
					span.style.top=snake.bodylist[0].style.top;
					span.style.left=snake.bodylist[0].style.left;
					this.bodylist.unshift(span)
				}
			}
			
			
			
			
			// 生成食物1
			var food={
				el:document.createElement("div"),
				point:{
					x:0,
					y:0
				},
				creat:function(){
					// 检测是否有食物
					if(gameInfo.el.getElementsByTagName("div").length===0){
						gameInfo.el.appendChild(this.el)
					}
					// gameInfo.el.appendChild(this.el)
					this.el.style.backgroundColor=getRandomColor();
					this.point.x=parseInt(Math.random()*((gameInfo.width-snake.width)/snake.width))*snake.width;
					this.point.y=parseInt(Math.random()*((gameInfo.width-snake.width)/snake.width))*snake.width;
					this.el.style.left=this.point.x+"px"
					this.el.style.top=this.point.y+"px"
				}
				
			}
			snake.begin()
			snake.move()
			food.creat()
			document.onkeydown=function(event){
				if(event.keyCode ===37&&snake.dir!=="right"){
					snake.dir="left"
				}
				if(event.keyCode ===38&&snake.dir!=="bottom"){
					snake.dir="top"
				}
				if(event.keyCode ===39&&snake.dir!=="left"){
					snake.dir="right"
				}
				if(event.keyCode ===40&&snake.dir!=="top"){
					snake.dir="bottom"
				}
			}
			
		</script>
		
	</body>
</html>
	

总结:
1.创建游戏信息,蛇的信息
2.初始化一条蛇
3.蛇的初始移动逻辑(需注意数组内元素的顺序)
4.通过上下左右按键控制蛇的方向及移动
5.随机生成食物(要检测当前是否有食物)
6.当蛇与食物碰撞时判断,使食物消失,重新生成一个元素
7.使蛇的身体边长
8.蛇的死亡碰撞检测(边缘碰撞与自己碰撞)

对象及其函数:

1.随机颜色
2.游戏信息(死亡函数)
3.蛇的相关信息 初始蛇 蛇移动(得分检测,死亡检测)计时器 改变身体长度
4.生成食物
5.绑定键盘按下事件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值