一、HTML代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><link rel="stylesheet" href="./../css/index.css">
</head>
<body><div class="container"><button class="start"></button><button class="pause"></button></div><script src="../js/config.js"></script><script src="../js/index.js"></script>
</body>
</html>
二、css代码
html,body{margin: 0;padding:0 ;
}
.container{width: 600px;height: 600px;background: #225675;border: 20px solid #7dd9ff;margin: 100px auto;position: relative;
}
button{border:none;outline: none;position: absolute;left: 50%;top: 50%;transform: translate(-50%,-50%);
}
.start{width: 200px;height: 200px;background: url(./../img/start.webp) center no-repeat;background-size: 100% 100%;display: block;
}
.pause{width: 80px;height: 80px;background: url(./../img/b.webp) center no-repeat;background-size: 100% 100%;display: none;
}
三、JS代码
1.index.js
function drawSnake(snake){for(var i=0;i<snake.snakePos.length;i++){if(!snake.snakePos[i].domConent){snake.snakePos[i].domConent=document.createElement("div");snake.snakePos[i].domConent.style.position="absolute";snake.snakePos[i].domConent.style.width=snakeBody+"px";snake.snakePos[i].domConent.style.height=snakeBody+"px";snake.snakePos[i].domConent.style.left=snake.snakePos[i].x*snakeBody+"px";snake.snakePos[i].domConent.style.top=snake.snakePos[i].y*snakeBody+"px";if(snake.snakePos[i].flag==='head'){snake.snakePos[i].domConent.style.background=`url("../img/a.webp") center/contain no-repeat`;switch(snake.direction.flag){case "top":{snake.snakePos[i].domConent.style.transform=`rotate(-90deg)`;break;}case "bottom":{snake.snakePos[i].domConent.style.transform=`rotate(90deg)`;break;}case "left":{snake.snakePos[i].domConent.style.transform=`rotate(180deg)`;break;}case "right":{snake.snakePos[i].domConent.style.transform=`rotate(0deg)`;break;}}}else{snake.snakePos[i].domConent.style.background="#e69009";snake.snakePos[i].domConent.style.borderRadius="50%"}}document.querySelector(".container").append(snake.snakePos[i].domConent)}
}
function drawFood(){while(true){var isRepeat=falsefood.x=Math.floor(Math.random()*tr+0)food.y=Math.floor(Math.random()*tr+0)for(var i=0;i<snake.snakePos.length;i++){if(snake.snakePos[i].x===food.x&&snake.snakePos[i].y===food.y){isRepeat = true;break; }}if(!isRepeat){break;}}if(!food.domConent){food.domConent = document.createElement("div")food.domConent.style.width = snakeBody+"px";food.domConent.style.height = snakeBody+"px";food.domConent.style.position = "absolute";food.domConent.style.background=`url("../img/apple.webp") center/contain no-repeat`;document.querySelector(".container").append(food.domConent);}food.domConent.style.left = food.x * snakeBody + "px";food.domConent.style.top = food.y * snakeBody + "px";
}
function initGame(){for(var i=0;i<tr;i++){for(var j=0;j<td;j++){gridData.push({x:j,y:i})}}drawSnake(snake);drawFood()
}
function isCollide(newHead){var collideCheckInfo={isCollide:false, isEat:false }if(newHead.x<0||newHead.x>=td||newHead.y<0||newHead.y>=tr){collideCheckInfo.isCollide =true;return collideCheckInfo;}for(var i=0 ; i<snake.snakePos.length;i++){if(snake.snakePos[i].x === newHead.x && snake.snakePos[i].y===newHead.y){collideCheckInfo.isCollide=true;return collideCheckInfo;}}if(newHead.x === food.x&&newHead.y===food.y){collideCheckInfo.isEat =true;score++; }return collideCheckInfo;
}
function snakeMove(){var oldHead =snake.snakePos[snake.snakePos.length-1]var newHead ={domConent:"",x : oldHead.x + snake.direction.x,y : oldHead.y + snake.direction.y,flag:"head",}var collideCheckResult= isCollide(newHead);if(collideCheckResult.isCollide){if(window.confirm(`游戏结束,您当前的得分为${score}分,是否要重新开始游戏`)){document.querySelector(".container").innerHTML=`<!-- 开始按钮 --><button class="start" style="display:none"></button><!-- 暂停按钮 --><button class="pause" style="display:none"></button>`;score =0;snake ={direction:directionNumber.right,snakePos:[{x:0,y:0,domConent:"",flag:"body"},{x:1,y:0,domConent:"",flag:"body"},{x:2,y:0,domConent:"",flag:"body"},{x:3,y:0,domConent:"",flag:"head"}]};food = {x:0 , y:0 ,domConent:""};initGame();}else{document.onkeydown = null;clearInterval(timerStop)}return;}oldHead.flag = "body";oldHead.domConent.style.background ="#e69009";oldHead.domConent.style.borderRadius ="50%";snake.snakePos.push(newHead);if(collideCheckResult.isEat){drawFood();}else{document.querySelector(".container").removeChild(snake.snakePos[0].domConent)snake.snakePos.shift();}drawSnake(snake);
}
function startGame(){timerStop = setInterval(function(){snakeMove()},time)
}
function bindEvent(){document.onkeydown = function(e){if((e.key === "ArrowUp" || e.key.toLocaleLowerCase() === "w")&&snake.direction.flag !== "bottom"){snake.direction=directionNumber.top;event.preventDefault(); }if((e.key === "ArrowDown" || e.key.toLocaleLowerCase() === "s")&&snake.direction.flag !=="top"){snake.direction=directionNumber.bottom;event.preventDefault(); }if((e.key === "ArrowLeft" || e.key.toLocaleLowerCase() === "a")&&snake.direction.flag !== "right"){snake.direction=directionNumber.left;event.preventDefault(); }if((e.key === "ArrowRight" || e.key.toLocaleLowerCase() === "d")&&snake.direction.flag !== "lefts"){snake.direction=directionNumber.right;event.preventDefault(); }}startGame();document.querySelector(".container").onclick = function(e){if(e.target.className === "container"){document.querySelector(".pause").style.display = 'block';clearInterval(timerStop);}else{document.querySelector(".pause").style.display = 'none';startGame();} }
}
function main(){document.querySelector(".start").onclick= function(e){e.stopPropagation();document.querySelector(".start").style.display="none"initGame();bindEvent();}}
main();
2.config.js(游戏相关设置)
var gridData = [];
var tr = 30;
var td = 30;
var snakeBody = 20;
var directionNumber={left:{x:-1,y:0,flag:"left"},right:{x:1,y:0,flag:"right"},top:{x:0,y:-1,flag:"top"},bottom:{x:0,y:1,flag:"bottom"}
}
var snake ={direction:directionNumber.right,snakePos:[{x:0,y:0,domConent:"",flag:"body"},{x:1,y:0,domConent:"",flag:"body"},{x:2,y:0,domConent:"",flag:"body"},{x:3,y:0,domConent:"",flag:"head"}]
}
var food = {x:0 , y:0 ,domConent:""
}
var score= 0
var timerStop = null
var time=100