js手寫貪吃蛇游戲?qū)嵗创a
前端手寫貪吃蛇游戲
貪吃蛇游戲 場(chǎng)景 使用了js 和 html /css 就可以完成 一個(gè)貪吃蛇小游戲
技術(shù)分析
主要用到的幾個(gè)技術(shù)點(diǎn):
- clientWidth :元素的寬度,包含內(nèi)邊距
- clientHeight :元素的高度,包含內(nèi)邊距
- setInterval:開(kāi)啟定時(shí)器
- clearInterval:關(guān)閉定時(shí)器
- keydown:鍵盤事件
- createElement : 創(chuàng)建節(jié)點(diǎn)
首先需要一個(gè)背景板 需要吧蛇和食物 在指定內(nèi)容里 不能超出接下來(lái)就是蛇的移動(dòng) 使用定時(shí)間一秒移動(dòng)一格食物就是根據(jù)計(jì)算隨機(jī)生成當(dāng)蛇和食物的位置重疊了就可以認(rèn)為蛇吃到了食物當(dāng)蛇的x,y 大于元素的寬度/高度,就認(rèn)為碰到了墻壁直接ov
以上就是關(guān)鍵技術(shù)點(diǎn) 直接源碼
源碼
HTML
<div id="game-board"></div>
JS
<script> const gameBoard = document.getElementById("game-board"); let snake = [{ x: 0, y: 0 }]; let food = { x: 0, y: 0 }; let direction = "right"; function createSnake() { for (let segment of snake) { const snakeSegment = document.createElement("div"); snakeSegment.className = "snake"; snakeSegment.style.left = segment.x + "px"; snakeSegment.style.top = segment.y + "px"; gameBoard.appendChild(snakeSegment); } } function createFood() { const maxX = gameBoard.clientWidth - 20; const maxY = gameBoard.clientHeight - 20; food.x = Math.floor(Math.random() * maxX); food.y = Math.floor(Math.random() * maxY); const foodElement = document.createElement("div"); foodElement.className = "food"; foodElement.style.left = food.x + "px"; foodElement.style.top = food.y + "px"; gameBoard.appendChild(foodElement); } function updateGame() { const snakeHead = { x: snake[0].x, y: snake[0].y }; // Move the snake if (direction === "right") snakeHead.x += 20; else if (direction === "left") snakeHead.x -= 20; else if (direction === "up") snakeHead.y -= 20; else if (direction === "down") snakeHead.y += 20; // Check for collision with food if (snakeHead.x === food.x && snakeHead.y === food.y) { snake.push({ x: snakeHead.x, y: snakeHead.y }); const foodElement = document.querySelector(".food"); foodElement.remove(); createFood(); } // Remove the tail segment snake.pop(); // Check for collision with walls or itself if ( snakeHead.x < 0 || snakeHead.x >= gameBoard.clientWidth || snakeHead.y < 0 || snakeHead.y >= gameBoard.clientHeight ) { clearInterval(gameInterval); alert("Game Over!"); return; } for (let segment of snake) { if (segment.x === snakeHead.x && segment.y === snakeHead.y) { clearInterval(gameInterval); alert("Game Over!"); return; } } // Update the snake on the game board snake.unshift({ x: snakeHead.x, y: snakeHead.y }); const snakeSegments = document.querySelectorAll(".snake"); for (let i = 0; i < snakeSegments.length; i++) { snakeSegments[i].style.left = snake[i].x + "px"; snakeSegments[i].style.top = snake[i].y + "px"; } } createSnake(); createFood(); const gameInterval = setInterval(updateGame, 150); document.addEventListener("keydown", (event) => { if (event.key === "ArrowRight" && direction !== "left") direction = "right"; else if (event.key === "ArrowLeft" && direction !== "right") direction = "left"; else if (event.key === "ArrowUp" && direction !== "down") direction = "up"; else if (event.key === "ArrowDown" && direction !== "up") direction = "down"; }); </script>
CSS
<style> #game-board { width: 300px; height: 300px; border: 1px solid black; position: relative; } .snake { width: 20px; height: 20px; background-color: green; position: absolute; } .food { width: 20px; height: 20px; background-color: red; position: absolute; } </style>
以上就實(shí)現(xiàn)了簡(jiǎn)單的貪吃蛇功能
總結(jié)
到此這篇關(guān)于js手寫貪吃蛇游戲的文章就介紹到這了,更多相關(guān)js手寫貪吃蛇游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript dragable的Move對(duì)象
一個(gè)dragable的Move對(duì)象,大家可以運(yùn)行下,測(cè)試看下效果。2009-08-08Javascript中關(guān)于Array.filter()的妙用詳解
大家應(yīng)該都知道filter是Javascript中Array常用的操作,它用于把Array的某些元素過(guò)濾掉,然后返回剩下的元素。下面這篇文章就給大家介紹了關(guān)于Javascript中Array.filter()的妙用,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2016-12-12innerHTML,outerHTML,innerText,outerText的用法及區(qū)別解析
本篇主要是對(duì)innerHTML,outerHTML,innerText,outerText的用法及區(qū)別進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12JavaScript中的事件循環(huán)機(jī)制及其運(yùn)行原理
JavaScript中的事件循環(huán)機(jī)制是一種異步處理機(jī)制,通過(guò)維護(hù)事件隊(duì)列和消息隊(duì)列,實(shí)現(xiàn)任務(wù)的分發(fā)和執(zhí)行。事件循環(huán)機(jī)制由主線程和任務(wù)隊(duì)列構(gòu)成,主線程運(yùn)行完當(dāng)前任務(wù)后會(huì)檢查任務(wù)隊(duì)列中是否有待執(zhí)行的任務(wù),如有則執(zhí)行,否則等待2023-04-04JavaScript利用append添加元素報(bào)錯(cuò)的解決方法
這篇文章主要介紹了JavaScript利用append添加元素報(bào)錯(cuò)的解決方法,需要的朋友可以參考下2014-07-07深入理解JavaScript系列(26):設(shè)計(jì)模式之構(gòu)造函數(shù)模式詳解
這篇文章主要介紹了深入理解JavaScript系列(26):設(shè)計(jì)模式之構(gòu)造函數(shù)模式詳解,本文講解了基本用法、構(gòu)造函數(shù)與原型、只能用new嗎?、強(qiáng)制使用new、原始包裝函數(shù)等內(nèi)容,需要的朋友可以參考下2015-03-03JS+CSS實(shí)現(xiàn)鼠標(biāo)經(jīng)過(guò)彈出一個(gè)DIV框完整實(shí)例(帶緩沖動(dòng)畫漸變效果)
這篇文章主要介紹了JS+CSS實(shí)現(xiàn)鼠標(biāo)經(jīng)過(guò)彈出一個(gè)DIV框的實(shí)現(xiàn)方法,帶緩沖漸變動(dòng)畫效果,涉及鼠標(biāo)事件的響應(yīng)及結(jié)合時(shí)間函數(shù)定時(shí)觸發(fā)形成動(dòng)畫漸變效果的相關(guān)技巧,需要的朋友可以參考下2016-03-03