1. 程式人生 > >純原生js 貪吃蛇(鍛鍊你邏輯思維)

純原生js 貪吃蛇(鍛鍊你邏輯思維)

//獲取分數標籤 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); };