一、引言
贪吃蛇是一款经典的小游戏,曾经风靡一时。今天,我们将使用 HTML、CSS 和 JavaScript 来实现一个简单的贪吃蛇小游戏。通过这个项目,可以了解到如何使用 HTML5 的画布元素(<canvas>)来绘制图形,以及如何使用 JavaScript 来处理游戏逻辑。
二、实现思路
1. HTML 结构
我们首先创建一个基本的 HTML 结构,包含一个 <canvas> 元素用于绘制游戏画面,以及一些必要的 <script> 和 <style> 标签。
2. CSS 样式
使用 CSS 对 <canvas> 元素进行简单的样式设置,使其具有边框,并居中显示。
3. JavaScript 逻辑
- 初始化游戏元素:定义蛇的初始位置、食物的初始位置、分数等。
- 处理用户输入:监听键盘事件,根据用户按下的方向键来改变蛇的移动方向。
- 绘制游戏画面:使用
requestAnimationFrame或setInterval函数来不断更新游戏画面,包括蛇的移动、食物的生成和绘制、分数的显示等。 - 处理碰撞检测:检测蛇是否撞到墙壁或自己的身体,如果是,则游戏结束。
- 处理食物的生成和消耗:当蛇吃到食物时,分数增加,并且生成新的食物。
三、代码实现
上述代码中,我们使用了 HTML5 的 <canvas> 元素来绘制游戏画面,通过 JavaScript 来处理游戏逻辑。具体实现步骤如下:
- 初始化游戏元素:定义蛇的初始位置、食物的初始位置、分数等。
- 监听键盘事件:根据用户按下的方向键来改变蛇的移动方向。
- 绘制游戏画面:使用
setInterval函数来不断更新游戏画面,包括蛇的移动、食物的生成和绘制、分数的显示等。 - 处理碰撞检测:检测蛇是否撞到墙壁或自己的身体,如果是,则游戏结束。
- 处理食物的生成和消耗:当蛇吃到食物时,分数增加,并且生成新的食物。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://unpkg.com/@tailwindcss/browser@4"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css" rel="stylesheet">
<title>贪吃蛇小游戏</title>
<style> #game-board {
border: 2px solid #333; display: block; margin: 20px auto; } </style>
</head>
<body class="bg-gray-100 flex flex-col items-center justify-center h-screen">
<h1 class="text-3xl font-bold mb-4">贪吃蛇小游戏</h1>
<canvas id="game-board" width="400" height="400"></canvas>
<script> const canvas = document.getElementById('game-board'); const ctx = canvas.getContext('2d'); const box = 20; let snake = []; snake[0] = {
x: 9 * box, y: 10 * box }; let food = {
x: Math.floor(Math.random() * 19) * box, y: Math.floor(Math.random() * 19) * box }; let score = 0; let d; document.addEventListener('keydown', direction); function direction(event) {
if (event.keyCode === 37 && d!== 'RIGHT') {
d = 'LEFT'; } else if (event.keyCode === 38 && d!== 'DOWN') {
d = 'UP'; } else if (event.keyCode === 39 && d!== 'LEFT') {
d = 'RIGHT'; } else if (event.keyCode === 40 && d!== 'UP') {
d = 'DOWN'; } } function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height); for (let i = 0; i < snake.length; i++) {
ctx.fillStyle = (i === 0)? 'green' : 'lightgreen'; ctx.fillRect(snake[i].x, snake[i].y, box, box); ctx.strokeStyle = 'darkgreen'; ctx.strokeRect(snake[i].x, snake[i].y, box, box); } ctx.fillStyle = 'red'; ctx.fillRect(food.x, food.y, box, box); let snakeX = snake[0].x; let snakeY = snake[0].y; if (d === 'LEFT') snakeX -= box; if (d === 'UP') snakeY -= box; if (d === 'RIGHT') snakeX += box; if (d === 'DOWN') snakeY += box; if (snakeX === food.x && snakeY === food.y) {
score++; food = {
x: Math.floor(Math.random() * 19) * box, y: Math.floor(Math.random() * 19) * box }; } else {
snake.pop(); } let newHead = {
x: snakeX, y: snakeY }; if (snakeX < 0 || snakeX >= canvas.width || snakeY < 0 || snakeY >= canvas.height || collision(newHead, snake)) {
clearInterval(game); alert(`游戏结束!你的最终得分是: ${
score}`); } snake.unshift(newHead); ctx.fillStyle = 'white'; ctx.font = '20px Arial'; ctx.fillText('Score: '+ score, 10, 30); } function collision(head, array) {
for (let i = 0; i < array.length; i++) {
if (head.x === array[i].x && head.y === array[i].y) {
return true; } } return false; } let game = setInterval(draw, 100); </script>
</body>
</html>
四、效果展示
初始界面

小蛇吃到自己,死亡结算

© 版权声明
THE END


![表情[baoquan]-拾光赋](https://blogs.ink/wp-content/themes/zibll/img/smilies/baoquan.gif)


暂无评论内容