js實(shí)現(xiàn)貪吃蛇游戲含注釋
本文實(shí)例為大家分享了js實(shí)現(xiàn)貪吃蛇游戲的具體代碼,供大家參考,具體內(nèi)容如下
兩個(gè)小時(shí)完成的,有點(diǎn)簡陋。
直接看效果。打開調(diào)試面板,在resource面板,新建snippet
粘貼以下代碼,右鍵snippet,run。


clearInterval(timer);
document.body.innerHTML = "";
//每秒移動(dòng)多少格
let speed = 10;
let speedUpMul = 3;
//是否能穿墻
let isThroughTheWall = true;
//行數(shù)
let row = 40;
let headColor = 'red';
let bodyColor = 'green';
let foodColor = 'yellow';
let borderColor = 'grey';
// 游戲全局變量
let hasFood = false;
//游戲狀態(tài)
let gamestaus = 'start';
let hasAccelerate = false;
let mainContainer = document.createElement("div");
mainContainer.style.width = 20 * row + 1 + "px";
mainContainer.style.height = 20 * row + 1 + "px";
mainContainer.style.margin = "0 auto";
mainContainer.style.position = "relative";
mainContainer.style.border = "1px solid " + borderColor;
document.body.appendChild(mainContainer);
for(let i = 0;i<row;i++){
let marginTop = 20 * i + "px";
for(let j = 0;j<row;j++){
let marginLeft = j * 20 + "px";
let tempDiv = document.createElement('div');
tempDiv.style.width = "19px";
tempDiv.style.height = "19px";
tempDiv.style.marginTop = marginTop;
tempDiv.style.marginLeft = marginLeft;
tempDiv.style.border = "0.5px solid " + borderColor;
tempDiv.style.position = "absolute";
tempDiv.id = j + "div" + i;
mainContainer.appendChild(tempDiv);
}
}
class Cell{
constructor(x, y, color){
if(isThroughTheWall){
if(x < 0) x = row-1;
if(x > row - 1) x = 0;
if(y < 0) y = row - 1;
if(y > row - 1) y = 0;
}else{
if(x < 0 || y < 0|| x > row - 1 || y > row - 1){
clearInterval(timer);
alert('游戲結(jié)束');
return;
}
}
this.x = x;
this.y = y;
this.color = color;
let tempDiv = document.getElementById(x + 'div' + y);
if(tempDiv) tempDiv.style.backgroundColor = color;
}
}
snake = {
head : {},
body : [],
dire : 1
}
let headx = Math.floor(Math.random() * 14) + 3;
let heady = Math.floor(Math.random() * 14) + 3;
snake.head = new Cell(headx, heady, headColor);
//上右下左
let direction = [1, 2, 3, 4]
snake.dire = direction[Math.floor(Math.random() * 4)];
if(snake.dire == 1){
snake.body.push(new Cell(snake.head.x, snake.head.y+1, bodyColor));
snake.body.push(new Cell(snake.head.x, snake.head.y+2, bodyColor));
snake.body.push(new Cell(snake.head.x, snake.head.y+3, bodyColor));
}
if(snake.dire == 2){
snake.body.push(new Cell(snake.head.x-1, snake.head.y, bodyColor));
snake.body.push(new Cell(snake.head.x-2, snake.head.y, bodyColor));
snake.body.push(new Cell(snake.head.x-3, snake.head.y, bodyColor));
}
if(snake.dire == 3){
snake.body.push(new Cell(snake.head.x, snake.head.y-1, bodyColor));
snake.body.push(new Cell(snake.head.x, snake.head.y-2, bodyColor));
snake.body.push(new Cell(snake.head.x, snake.head.y-3, bodyColor));
}
if(snake.dire == 4){
snake.body.push(new Cell(snake.head.x+1, snake.head.y, bodyColor));
snake.body.push(new Cell(snake.head.x+2, snake.head.y, bodyColor));
snake.body.push(new Cell(snake.head.x+3, snake.head.y, bodyColor));
}
function game(){
if(gamestaus == 'pause'){
return;
}
if(gamestaus == 'gameover'){
clearInterval(timer);
alert('游戲結(jié)束');
return;
}
initFood();
let snakeHeadX = snake.head.x;
let snakeHeadY = snake.head.y;
let color = '';
if(snake.dire == 1){
let tempDiv = document.getElementById(snakeHeadX + 'div' + (snakeHeadY-1));
if(tempDiv) color = tempDiv.style.backgroundColor;
snake.head = new Cell(snakeHeadX, snakeHeadY - 1, headColor);
}
if(snake.dire == 2){
let tempDiv = document.getElementById((snakeHeadX + 1) + 'div' + snakeHeadY);
if(tempDiv) color = tempDiv.style.backgroundColor;
snake.head = new Cell(snakeHeadX + 1, snakeHeadY, headColor);
}
if(snake.dire == 3){
let tempDiv = document.getElementById(snakeHeadX + 'div' + (snakeHeadY+1));
if(tempDiv) color = tempDiv.style.backgroundColor;
snake.head = new Cell(snakeHeadX, snakeHeadY + 1, headColor);
}
if(snake.dire == 4){
let tempDiv = document.getElementById((snakeHeadX - 1) + 'div' + snakeHeadY);
if(tempDiv) color = tempDiv.style.backgroundColor;
snake.head = new Cell(snakeHeadX - 1, snakeHeadY, headColor);
}
snake.body.unshift(new Cell(snakeHeadX, snakeHeadY, bodyColor));
if(color && color == foodColor){
hasFood = false;
initFood();
}else if(color && color == bodyColor){
gamestaus = 'gameover';
}else{
let lastBody = snake.body.pop();
new Cell(lastBody.x, lastBody.y, '');
}
}
var timer = setInterval(game, 10 / speed * 100)
/**
* 初始化食物
*/
function initFood(){
while(!hasFood){
let x = Math.floor(Math.random() * row);
let y = Math.floor(Math.random() * row);
let snakeBody = snake.body;
let enable = true;
if(snake.head.x == x && snake.head.y == y){
enable = false;
}
for(sBody of snakeBody){
if(sBody.x == x && sBody.y == y){
enable = false;
break;
}
}
if(enable){
new Cell(x, y, foodColor);
hasFood = true;
}
}
}
document.onkeydown = function(e){
if(e.keyCode == 38){
//上
if(snake.dire != 3 && snake.dire != 1){
snake.dire = 1;
}else if(snake.dire == 1){
if(!hasAccelerate){
clearInterval(timer);
hasAccelerate = true;
speed = speed * speedUpMul;
timer = setInterval(game, 10 / speed * 100)
}
}
}
if(e.keyCode == 39){
//右
if(snake.dire != 4 && snake.dire != 2){
snake.dire = 2;
}else if(snake.dire == 2){
if(!hasAccelerate){
clearInterval(timer);
hasAccelerate = true;
speed = speed * speedUpMul;
timer = setInterval(game, 10 / speed * 100)
}
}
}
if(e.keyCode == 40){
//下
if(snake.dire != 1 && snake.dire != 3){
snake.dire = 3;
}else if(snake.dire == 3){
if(!hasAccelerate){
clearInterval(timer);
hasAccelerate = true;
speed = speed * speedUpMul;
timer = setInterval(game, 10 / speed * 100)
}
}
}
if(e.keyCode == 37){
//左
if(snake.dire != 2 && snake.dire != 4){
snake.dire = 4;
}else if(snake.dire == 4){
if(!hasAccelerate){
clearInterval(timer);
hasAccelerate = true;
speed = speed * speedUpMul;
timer = setInterval(game, 10 / speed * 100)
}
}
}
//空格鍵暫停
if(e.keyCode == 32){
if(gamestaus == 'start'){
gamestaus = 'pause';
}else if(gamestaus == 'pause'){
gamestaus = 'start';
}
}
}
document.onkeyup = function(e){
if(e.keyCode == 38){
//上
if(snake.dire == 1 && hasAccelerate){
clearInterval(timer);
hasAccelerate = false;
speed = speed / speedUpMul;
timer = setInterval(game, 10 / speed * 100)
}
}
if(e.keyCode == 39){
//右
if(snake.dire == 2 && hasAccelerate){
clearInterval(timer);
hasAccelerate = false;
speed = speed / speedUpMul;
timer = setInterval(game, 10 / speed * 100)
}
}
if(e.keyCode == 40){
//下
if(snake.dire == 3 && hasAccelerate){
clearInterval(timer);
hasAccelerate = false;
speed = speed / speedUpMul;
timer = setInterval(game, 10 / speed * 100)
}
}
if(e.keyCode == 37){
//左
if(snake.dire == 4 && hasAccelerate){
clearInterval(timer);
hasAccelerate = false;
speed = speed / speedUpMul;
timer = setInterval(game, 10 / speed * 100)
}
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
微信小程序使用slider設(shè)置數(shù)據(jù)值及switch開關(guān)組件功能【附源碼下載】
這篇文章主要介紹了微信小程序使用slider設(shè)置數(shù)據(jù)值及switch開關(guān)組件功能,結(jié)合實(shí)例形式分析了slider組件及switch組件的功能與使用方法,并附帶源碼供讀者下載參考,需要的朋友可以參考下2017-12-12
引入JS文件IE6報(bào)語法錯(cuò)誤或缺少對象問題的解決方法
引入JS文件IE6報(bào)錯(cuò)或缺少對象問題想必很多朋友都有遇到過吧,這個(gè)問題在于文件編碼上,下面為大家介紹下比較不錯(cuò)的解決方法2014-01-01
Webpack打包c(diǎn)ss后z-index被重新計(jì)算的解決方法
這篇文章主要跟大家分享了Webpack打包c(diǎn)ss后z-index被重新計(jì)算的解決方法,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。2017-06-06
Bootstrap模態(tài)框禁用空白處點(diǎn)擊關(guān)閉
這篇文章主要為大家詳細(xì)介紹了Bootstrap模態(tài)框禁用空白處點(diǎn)擊關(guān)閉的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
BootStrap點(diǎn)擊下拉菜單項(xiàng)后顯示一個(gè)新的輸入框?qū)崿F(xiàn)代碼
這篇文章主要介紹了BootStrap點(diǎn)擊下拉菜單項(xiàng)后顯示一個(gè)新的輸入框?qū)崿F(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-05-05

