贪吃蛇 Posted on 2016-08-21 12345678910111213141516171819<div class="score"> <div> 分数为: <span>0</span> </div> <div class="stop"> 暂停 </div> <div> 利用方向键控制蛇移动的方向,撞墙或吃到自己游戏结束 </div></div><div class="wrap"> <p class="food"></p> <div></div> <div></div> <div></div> <div></div> <div></div></div> 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768html,body { margin: 0;} .wrap { position: absolute; width: 100%; height: 80%; bottom: 0; border: 1px solid black; box-sizing: border-box;} .wrap div { width: 20px; height: 20px; background-color: darkcyan; position: absolute;} .wrap .food { width: 20px; height: 20px; margin: 0; padding: 0; background-color: firebrick; position: absolute;} .score { position: absolute; width: 100%; height: 17%; background: rgba(0, 0, 0, 0.4);} .score div { position: absolute;} .score div:nth-child(1) { width: 50%; color: white; font-size: 200%; top: 10%; left: 1%; text-shadow: 1px 1px 1px black;} .score div:nth-child(2) { width: 6%; text-align: center; right: 5%; top: 10%; color: white; font-size: 100%; border-radius: 50%; background-color: red; box-shadow: 1px 1px 1px black; cursor: pointer;} .score div:nth-child(3) { bottom: 10%; text-indent: 2em; color: honeydew; font-size: 100%;} 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150var wrap = document.querySelector('.wrap');var snake = document.querySelectorAll('.wrap div');var food = document.querySelector('.food');var stop = document.querySelector('.stop');var score = document.querySelector('.score span');stop.style.height = stop.offsetWidth + 'px';stop.style.lineHeight = stop.style.height;var snakeArr = [];var W = wrap.clientWidth;var H = wrap.clientHeight;var timer,mT, mL,t, ss; stop.onclick = function() { if (this.bol) { moveFn(snakeArr); this.innerHTML = '暂停' this.style.backgroundColor = 'red' this.bol = false; } else { clearInterval(timer); this.innerHTML = '开始' this.style.backgroundColor = 'seagreen' this.bol = true; }}reset();moveFn(snakeArr);rndIndex(food);/* * 重置函数 */function reset() { mT = 0; mL = 1; t = 500; ss = 0; score.innerHTML = ss; timer = null; snakeArr = []; for (var i = 0; i < snake.length; i++) { snake[i].style.left = (snake.length - 1 - i) * snake[0].offsetWidth + 'px'; if (i != 0) { snake[i].style.backgroundColor = 'greenyellow'; } snakeArr[i] = snake[i]; }}/* * 随机位置函数 * obj参数是位置需要随机的对象 */function rndIndex(obj) { var foodW = obj.clientWidth; var foodH = obj.clientHeight; wrap.style.width = x * foodW + 'px'; wrap.style.height = y * foodH + 'px'; var x = Math.floor(W / foodW); var y = Math.floor(H / foodH); rndx = Math.floor(Math.random() * x) * foodW; rndy = Math.floor(Math.random() * y) * foodH; var arr = objIndex(snakeArr); for (var i = 0; i < arr.length; i++) { if (rndx == arr[i][0] && rndy == arr[i][1]) { rndIndex(obj); //递归 } } obj.style.left = rndx + 'px'; obj.style.top = rndy + 'px';}/* * 遍历对象数组的位置 * objArr参数是位置需要遍历的对象数组 * 返回二维数组[[left,top],[left,top]] */function objIndex(objArr) { var sIndex = []; for (var i = 0; i < objArr.length; i++) { sIndex[i] = [objArr[i].offsetLeft, objArr[i].offsetTop]; } return sIndex;}/* * 判断函数 * objArr 判断对象数组 */function flagFn(objArr) { var snakes = objIndex(objArr); var snakeHeadL = snakes[0][0]; //蛇数组的第一个(头部)left var snakeHeadT = snakes[0][1]; //蛇数组的第一个(头部)top var foodLeft = food.offsetLeft; var foodTop = food.offsetTop; //gameover //撞墙 if (objArr[0].offsetWidth + snakeHeadL > W || objArr[0].offsetHeight + snakeHeadT > H || snakeHeadT < 0 || snakeHeadL < 0) { gameover('你的蛇一头撞死在墙上啦!!'); } //吃自己 for (var i = 1; i < snakes.length; i++) { if (snakeHeadL == snakes[i][0] && snakeHeadT == snakes[i][1]) { gameover('你的蛇实在是太饿了,自己吃掉自己啦!!'); } } //吃到食物 if (snakeHeadL == foodLeft && snakeHeadT == foodTop) { var div = document.createElement('div'); wrap.appendChild(div); div.style.background = 'none'; div.style.top = '-50px' snake = document.querySelectorAll('.wrap div'); snakeArr[snakeArr.length] = snake[snake.length - 1]; if (t > 100) { t -= 50;ss += 1; } else if (t > 10) { t -= 10;ss += 4 }else if(t>1){ t -= 1;ss += 5; } moveFn(snakeArr); rndIndex(food); score.innerHTML = ss; }}function gameover(str){ clearInterval(timer); alert(str);}/* * 移动函数 */function moveFn(objArr) { timer && clearInterval(timer); timer = setInterval(function() { objArr[objArr.length - 1].style.top = objArr[0].offsetTop + mT * objArr[0].offsetHeight + 'px'; objArr[objArr.length - 1].style.left = objArr[0].offsetLeft + mL * objArr[0].offsetWidth + 'px'; objArr[objArr.length - 1].style.backgroundColor = 'darkcyan'; objArr[0].style.backgroundColor = 'greenyellow'; objArr.unshift(objArr.pop()); flagFn(objArr); }, t)}document.onkeydown = function(e) { var e = e || window.event; switch (e.keyCode) { case 37:if (mL > 0) {retrun}mT = 0;mL = -1;break; //左 case 39:if (mL < 0) {retrun}mT = 0;mL = 1;break; //右 case 38:if (mT > 0) {retrun}mT = -1;mL = 0;break; //上 case 40:if (mT < 0) {retrun}mT = 1;mL = 0;break; //下 }}