用 Python 实现贪吃蛇游戏的完整指南

贪吃蛇游戏是一款经典的小游戏,适合用来学习编程和游戏开发。在这篇文章中,我将带你一步步实现一个简单的贪吃蛇游戏,使用 Python 编程语言和 Pygame 库。首先,我们将讨论实现该游戏的整体流程,然后逐步深入每个代码部分。

整体流程

下面是实现贪吃蛇游戏的步骤:

步骤 描述
1 设置 Pygame 环境
2 创建窗口
3 初始化相关变量(蛇、食物、分数等)
4 主循环(事件处理、游戏逻辑、绘制)
5 结束游戏并显示分数

步骤详解

1. 设置 Pygame 环境

首先,确保安装了 Pygame 库。可以使用以下命令来安装:

pip install pygame
2. 创建窗口

接下来,我们来创建一个基本的窗口。代码如下:

import pygame
import time
import random

# 初始化 Pygame
pygame.init()

# 设定窗口的宽和高
window_width = 600
window_height = 400

# 创建窗口
window = pygame.display.set_mode((window_width, window_height))

# 设定窗口标题
pygame.display.set_caption('贪吃蛇游戏')

注释:

  • 我们先导入所需的库,初始化 Pygame。
  • 接着设置窗口的宽度和高度,创建了一个窗口并定义了标题。
3. 初始化相关变量

创建蛇、食物和分数等变量。代码如下:

# 颜色
black = (0, 0, 0)
white = (255, 255, 255)
red = (213, 50, 80)
green = (0, 255, 0)

# 蛇的初始设置
snake_block = 10
snake_speed = 15

# 创建时钟
clock = pygame.time.Clock()

# 蛇的初始坐标
snake_list = []
length_of_snake = 1
snake_head_x = window_width / 2
snake_head_y = window_height / 2

注释:

  • 设定颜色为 RGB 值。
  • 定义蛇的块大小和速度。
  • 创建一个时钟来控制游戏速度。
  • 创建蛇的初始坐标和长度。
4. 主循环

主循环处理游戏逻辑。代码如下:

# 游戏主循环
def game_loop():
    game_over = False
    game_close = False
    
    # 食物随机位置
    food_x = round(random.randrange(0, window_width - snake_block) / 10.0) * 10.0
    food_y = round(random.randrange(0, window_height - snake_block) / 10.0) * 10.0

    while not game_over:

        while game_close == True:
            window.fill(white)
            font_style = pygame.font.SysFont("bahnschrift", 25)
            message = font_style.render("You Lost! Press C-Play Again or Q-Quit", True, red)
            window.blit(message, [window_width / 6, window_height / 3])
            pygame.display.update()

            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        game_over = True
                        game_close = False
                    if event.key == pygame.K_c:
                        game_loop()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True

        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            snake_head_x -= snake_block
        if keys[pygame.K_RIGHT]:
            snake_head_x += snake_block
        if keys[pygame.K_UP]:
            snake_head_y -= snake_block
        if keys[pygame.K_DOWN]:
            snake_head_y += snake_block

        # 游戏逻辑
        snake_head = []
        snake_head.append(snake_head_x)
        snake_head.append(snake_head_y)
        snake_list.append(snake_head)
        if len(snake_list) > length_of_snake:
            del snake_list[0]

        # 判断游戏结束
        for x in snake_list[:-1]:
            if x == snake_head:
                game_close = True

        # 更新显示
        window.fill(black)
        pygame.draw.rect(window, green, [food_x, food_y, snake_block, snake_block])
        for x in snake_list:
            pygame.draw.rect(window, white, [x[0], x[1], snake_block, snake_block])

        pygame.display.update()

        if snake_head_x == food_x and snake_head_y == food_y:
            food_x = round(random.randrange(0, window_width - snake_block) / 10.0) * 10.0
            food_y = round(random.randrange(0, window_height - snake_block) / 10.0) * 10.0
            length_of_snake += 1

        clock.tick(snake_speed)

    pygame.quit()
    quit()

# 启动游戏
game_loop()

注释:

  • game_loop 函数是游戏的核心,处理了所有的游戏逻辑。
  • 通过 pygame.event.get() 监测按键事件,控制蛇的移动。
  • 绘制蛇和食物,判断游戏是否结束(如蛇撞墙或撞到自己),并根据情况调整分数和蛇的长度。

5. 结束游戏并显示分数

在游戏结束时, Fenster 闭合并退出程序。我们可以在该位置添加分数显示逻辑。

序列图

sequenceDiagram
    participant 用户
    participant 游戏界面
    用户->>游戏界面: 播放游戏
    游戏界面->>用户: 显示可控制的蛇
    用户->>游戏界面: 控制蛇移动
    游戏界面->>用户: 更新游戏状态
    用户->>游戏界面: 结束游戏
    游戏界面->>用户: 显示游戏结果

关系图

erDiagram
    游戏 {
        int id
        string name
        int score
    }
    蛇 {
        int id
        int length
        int position_x
        int position_y
        游戏 --o 蛇: "含有"
    }
    食物 {
        int id
        int position_x
        int position_y
        游戏 --o 食物: "含有"
    }

结尾

通过以上步骤,我们实现了一个简单的贪吃蛇游戏。你可以在这款游戏的基础上继续扩展功能,比如增加关卡、增加障碍物、改变蛇的速度等。代码实现虽然简单,但掌握了这些基本概念后,你就可以往更复杂的游戏开发方向发展了。享受编程的乐趣吧!