一、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=false
food.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