|
|
当然可以!贪吃蛇游戏是一个很有趣的项目。我们可以使用HTML、CSS和JavaScript来实现这个游戏。我会加上详细的注释,便于你理解每一部分的功能。
### 1. HTML 部分
首先,我们需要一个简单的HTML页面来容纳游戏画面及相关资源。
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <title>贪吃蛇游戏</title>
- <style>
- /* 设置画布和页面的样式 */
- canvas {
- background-color: #000;
- display: block;
- margin: 0 auto;
- }
- </style>
- </head>
- <body>
- <!-- 游戏画布 -->
- <canvas id="gameCanvas" width="400" height="400"></canvas>
- <!-- 引入 JavaScript 文件 -->
- <script src="snake_game.js"></script>
- </body>
- </html>
复制代码
### 2. JavaScript 部分
接下来是主要的游戏逻辑代码。我们将把它放在一个名为`snake_game.js`的文件中。
- // 获取画布并设置上下文
- const canvas = document.getElementById('gameCanvas');
- const ctx = canvas.getContext('2d');
- // 定义蛇的初始状态
- let snake = [
- {x: 150, y: 150},
- {x: 140, y: 150},
- {x: 130, y: 150},
- {x: 120, y: 150},
- {x: 110, y: 150}
- ];
- // 初始化食物位置
- let foodX;
- let foodY;
- // 初始速度 - 蛇向右移动
- let dx = 10;
- let dy = 0;
- // 游戏运行标志
- let isGameRunning = true;
- // 创建游戏循环
- function main() {
- if (isGameRunning) {
- setTimeout(function onTick() {
- clearCanvas();
- moveSnake();
- drawSnake();
- drawFood();
- checkGameOver();
- main();
- }, 100);
- } else {
- alert("游戏结束!");
- }
- }
- // 清除画布
- function clearCanvas() {
- ctx.fillStyle = "black";
- ctx.fillRect(0, 0, canvas.width, canvas.height);
- }
- // 绘制蛇
- function drawSnake() {
- snake.forEach(snakePart => {
- ctx.fillStyle = 'lightgreen';
- ctx.strokestyle = 'darkgreen';
- ctx.fillRect(snakePart.x, snakePart.y, 10, 10);
- ctx.strokeRect(snakePart.x, snakePart.y, 10, 10);
- });
- }
- // 移动蛇
- function moveSnake() {
- const head = {x: snake[0].x + dx, y: snake[0].y + dy};
- snake.unshift(head);
- // 检查蛇是否吃到食物
- if (snake[0].x === foodX && snake[0].y === foodY) {
- createFood();
- } else {
- snake.pop();
- }
- }
- // 随机生成食物位置
- function createFood() {
- foodX = Math.floor((Math.random() * canvas.width) / 10) * 10;
- foodY = Math.floor((Math.random() * canvas.height) / 10) * 10;
- // 确保食物不会生成在蛇身体上
- snake.forEach(snakePart => {
- if (snakePart.x === foodX && snakePart.y === foodY) {
- createFood();
- }
- });
- }
- // 绘制食物
- function drawFood() {
- ctx.fillStyle = 'red';
- ctx.strokestyle = 'darkred';
- ctx.fillRect(foodX, foodY, 10, 10);
- ctx.strokeRect(foodX, foodY, 10, 10);
- }
- // 检查游戏是否结束
- function checkGameOver() {
- for (let i = 4; i < snake.length; i++) {
- if (snake[i].x === snake[0].x && snake[i].y === snake[0].y) {
- isGameRunning = false;
- }
- }
- const hitLeftWall = snake[0].x < 0;
- const hitRightWall = snake[0].x >= canvas.width;
- const hitTopWall = snake[0].y < 0;
- const hitBottomWall = snake[0].y >= canvas.height;
- if (hitLeftWall || hitRightWall || hitTopWall || hitBottomWall) {
- isGameRunning = false;
- }
- }
- // 更改方向
- document.addEventListener("keydown", changeDirection);
- function changeDirection(event) {
- const LEFT_KEY = 37;
- const RIGHT_KEY = 39;
- const UP_KEY = 38;
- const DOWN_KEY = 40;
- const keyPressed = event.keyCode;
- const goingUp = dy === -10;
- const goingDown = dy === 10;
- const goingRight = dx === 10;
- const goingLeft = dx === -10;
- if (keyPressed === LEFT_KEY && !goingRight) {
- dx = -10;
- dy = 0;
- }
- if (keyPressed === UP_KEY && !goingDown) {
- dx = 0;
- dy = -10;
- }
- if (keyPressed === RIGHT_KEY && !goingLeft) {
- dx = 10;
- dy = 0;
- }
- if (keyPressed === DOWN_KEY && !goingUp) {
- dx = 0;
- dy = 10;
- }
- }
- // 开始游戏
- createFood();
- main();
复制代码
### 3. 解释每个部分
1. **HTML部分**:
- `<canvas>`标签用于绘制游戏画面。
- `<script>`标签引入JavaScript文件,控制游戏逻辑。
2. **JavaScript部分**:
- 用于初始化游戏画布、定义蛇的初始位置及移动方向。
- `main`函数是游戏循环,每隔100毫秒更新一次游戏状态。
- `clearCanvas`函数清除画布,以便重新绘制。
- `drawSnake`和`drawFood`分别用于绘制蛇和食物。
- `moveSnake`控制蛇的移动,并检测是否吃到食物。
- `createFood`用于生成随机的食物位置。
- `checkGameOver`检测游戏是否结束。
- `changeDirection`处理键盘事件来改变蛇的移动方向。
希望这些解释能帮你更好地理解贪吃蛇游戏的实现!如果你还有其他问题或需要进一步的帮助,请告诉我。 |
|