純原生js 貪吃蛇(鍛鍊你邏輯思維)
阿新 • • 發佈:2019-02-18
//獲取分數標籤
var score = document.getElementById('score');
// 獲取路徑地圖標籤
var map = document.getElementById('snake_map');
// 為了靈活的設定地圖的大小,以下設定兩個變數
// 用於儲存行數和列數(即方格的個數)
var rowNumber = 25;// 行數
var columnNumber = 20;// 列數;
var mapWidth = columnNumber * 20 + 'px';// 地圖的寬
var mapHeight = rowNumber * 20 + 'px';// 地圖的高
map.style.width = mapWidth;
map.style.height = mapHeight;// 設定地圖寬高
// 建立一個二維陣列,用來記錄地圖上的所有div的位置
var snakeDIVPosition = [];
// 通過雙層for迴圈來建立地圖元素
for ( var i = 0; i < rowNumber; i++) {
// 建立行div
var rowDIV = document.createElement('div');
// 設定div樣式
rowDIV.className = 'row';
// 將行div新增到路徑地圖map中
map.appendChild(rowDIV);
// 建立一個行級陣列,用來儲存當前行中的每個方塊div
var rowArray = [];
for ( var j = 0; j < columnNumber; j++) {
// 建立每一行中的方塊div
var columnDIV = document.createElement('div');
// 設定css樣式
columnDIV.className = 'col';
// 將方塊DIV新增到當前行中
rowDIV.appendChild(columnDIV);
// 同時將方塊新增到行陣列中
rowArray.push(columnDIV);
}
// 當前內層迴圈結束,將行陣列新增到二維陣列中
snakeDIVPosition.push(rowArray);
}
// 建立蛇模型
// 建立一個一維陣列,用來儲存蛇身所佔的div
var snake = [];
// 固定蛇身起始長度為3個div
for ( var i = 0; i < 3; i++) {
// 為蛇身設定不同顏色的div
snakeDIVPosition[0][i].className = 'col activeSnake';
// 儲存在蛇身陣列中
snake[i] = snakeDIVPosition[0][i];
}
// 定義變數來控制蛇
var x = 2;
var y = 0;// 蛇頭的起始位置偏移量
var scoreCount = 0;// 分數計數器,即吃了多少個蛋
var eggX = 0;// 記錄蛋所在的行位置
var eggY = 0;// 記錄蛋所在的列位置;
var direction = 'right';// 記錄蛇移動的方向,初始為向右
var changeDir = true;// 判斷是否需要改變蛇的移動方向
var delayTimer = null;// 延遲定時器
// 新增鍵盤事件監聽方向鍵來改變蛇的移動方向
document.onkeydown = function(event) {
// 先判斷是否需要改變方向,true表示需要,false表示不需要
if (!changeDir) {
return;// return空表示直接結束函式,後續程式碼不執行
}
event = event || window.event;
// 為了合理處理蛇的移動,需要判斷蛇頭和蛇身
// 假設蛇向右移動,點方向鍵左,右鍵都不需要做出響應
if (direction == 'right' && event.keyCode == 37) {
return;// 終止事件執行
}
if (direction == 'left' && event.keyCode == 39) {
return;
}
if (direction == 'up' && event.keyCode == 40) {
return;
}
if (direction == 'down' && event.keyCode == 38) {
return;
}
// 我們通過keyCode確定蛇要移動的方向
switch (event.keyCode) {
case 37:
direction = 'left';// 向左
break;
case 38:
direction = 'up';// 向上;
break;
case 39:
direction = 'right';// 向右
break;
case 40:
direction = 'down';// 向下
break;
}
changeDir = false;
delayTimer = setTimeout(function() {
// 設定是否需要改變方向
changeDir = true;
}, 300);
};
// 開始設定蛇移動邏輯
// 蛇移動函式
function snakeMove() {
// 根據上面設定的方向來設定蛇頭的位置
switch (direction) {
case 'left':
x--;
break;
case 'right':
x++;
break;
case 'up':
y--;
break;
case 'down':
y++;
break;
};
// 判斷是否遊戲結束
if (x < 0 || y < 0 || x >= columnNumber || y >= rowNumber) {
alert('Game Over!!!');
// 結束蛇移動的定時器
clearInterval(moveTimer);
return;// 終止鍵盤事件;
}
// 如果蛇吃到自己,也要結束遊戲
for ( var i = 0; i < snake.length; i++) {
// 將此時蛇頭移動後的位置與之前左右的組成蛇的div的位置進行比較,如果相同則說明吃到自己,遊戲結束
if (snake[i] == snakeDIVPosition[y][x]) {
alert('Game over!!!');
clearInterval(moveTimer);
return;
};
}
// 判斷蛇頭移動的位置是否有蛋
if (eggX == x && eggY == y) {
snakeDIVPosition[eggY][eggX].className = 'col activeSnake';
snake.push(snakeDIVPosition[eggY][eggX]);// 加入蛇身
scoreCount++;// 記錄分數
// 更新當前的分數
score.innerHTML = scoreCount;
// 隨機產生一個新的蛋
createNewEgg();
} else {
// 設定蛇碰不到蛋的邏輯
// 讓蛇移動
// 蛇尾去掉蛇自身的顏色,變成格子的顏色
snake[0].className = 'col';
// 將蛇尾div從陣列中移除
snake.shift();
// 定位到的新的蛇頭加入到蛇陣列中
snakeDIVPosition[y][x].className = 'col activeSnake';
snake.push(snakeDIVPosition[y][x]);
};
};
var moveTimer = setInterval('snakeMove()', 300);
// 定義一個生成min,max之間的隨機數函式
function random(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
};
function createNewEgg() {
// 隨機出新的egg的下標的x和y值
eggX = random(0, columnNumber - 1);
eggY = random(0, rowNumber - 1);
// 判斷如果隨機產生的蛋與蛇身重合,就重新隨機產生一個蛋
if (snakeDIVPosition[eggY][eggX].className == 'col activeSnake') {
createNewEgg();// 重新隨機新的egg
} else {
snakeDIVPosition[eggY][eggX].className = 'col egg';
}
};
createNewEgg();// 在遊戲開始的時候生成新的egg
var pause = document.getElementById('Pause');
var start = document.getElementById('Start');
var refresh = document.getElementById('Refresh');
var speed = document.getElementById('Speed');
// 新增暫停按鈕
pause.onclick = function() {
clearInterval(moveTimer);
};
// 新增開始按鈕
start.onclick = function() {
clearInterval(moveTimer);
moveTimer = setInterval('snakeMove()', speed1);
};
// 新增重新整理按鈕
refresh.onclick = function() {
window.location.reload();
};
// 新增加速按鈕
var speed1 = 300;
speed.onclick = function() {
speed1 -= 20;
clearInterval(moveTimer);
moveTimer = setInterval('snakeMove()', speed1);
};