一、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