使用 Python 和 Pygame 的贪吃蛇游戏

PythonPythonBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本项目将指导你使用 Python 和 Pygame 库创建一个贪吃蛇游戏。该游戏将有一个游戏窗口、一条蛇、一个道具和一个分数。蛇会在游戏窗口中移动并吃掉道具。当蛇吃到道具时,蛇的长度会增加一格。分数将显示在屏幕上。

👀 预览

贪吃蛇游戏预览截图

🎯 任务

在本项目中,你将学习:

  • 如何使用 Pygame 创建一个游戏窗口
  • 如何处理用户输入以控制蛇的移动
  • 如何创建和更新蛇的位置
  • 如何在屏幕上绘制蛇和道具
  • 如何检测蛇与道具之间的碰撞
  • 如何跟踪分数
  • 如何在屏幕上显示分数

🏆 成果

完成本项目后,你将能够:

  • 使用 Pygame 创建一个图形化游戏窗口
  • 处理用户输入以控制游戏
  • 创建和更新游戏对象
  • 在游戏中检测碰撞
  • 显示和更新游戏分数

创建项目文件

创建一个名为 snake_game.py 的新文件,并在代码编辑器中打开它。

cd ~/project
touch snake_game.py
sudo pip install pygame
✨ 查看解决方案并练习

导入必要的模块

snake_game.py 文件中,导入 pygamerandom 模块:

import pygame
import random
✨ 查看解决方案并练习

初始化 Pygame

导入模块后,初始化 Pygame:

pygame.init()
✨ 查看解决方案并练习

设置游戏窗口

定义游戏窗口的宽度、高度和每秒帧数(FPS):

WIDTH = 800
HEIGHT = 600
FPS = 10
✨ 查看解决方案并练习

定义颜色

定义游戏中使用的颜色:

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
BACKGROUND_COLOR = (50, 50, 50)
✨ 查看解决方案并练习

设置游戏窗口

使用定义好的宽度和高度来设置游戏窗口:

screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Snake Game")
clock = pygame.time.Clock()

在上述代码中,pygame.display.set_mode() 用于使用指定的宽度和高度初始化显示。pygame.display.set_caption() 用于设置游戏窗口的标题。pygame.time.Clock() 用于跟踪游戏中的时间。

✨ 查看解决方案并练习

设置蛇

定义蛇的方块大小和速度:

snake_block_size = 20
snake_speed = 5

我们将方块大小设置为20,速度设置为5。这意味着蛇每次会移动5个像素。

✨ 查看解决方案并练习

设置游戏变量

定义用于显示分数的字体样式和字体大小:

font_style = pygame.font.SysFont(None, 50)
score_font = pygame.font.SysFont(None, 35)
✨ 查看解决方案并练习

设置强化道具

定义强化道具的方块大小:

powerup_block_size = 20
✨ 查看解决方案并练习

定义函数

定义以下函数:

draw_snake(snake_block_size, snake_list)

此函数在屏幕上绘制蛇:

def draw_snake(snake_block_size, snake_list):
    for x in snake_list:
        pygame.draw.rect(
            screen, GREEN, [x[0], x[1], snake_block_size, snake_block_size]
        )

在上述代码中,pygame.draw.rect() 用于在屏幕上绘制一个矩形。第一个参数是屏幕,第二个参数是颜色,第三个参数是矩形的位置和大小。

draw_powerup(powerup_x, powerup_y)

此函数在屏幕上绘制强化道具:

def draw_powerup(powerup_x, powerup_y):
    pygame.draw.rect(
        screen, RED, [powerup_x, powerup_y, powerup_block_size, powerup_block_size]
    )

在上述代码中,pygame.draw.rect() 用于在屏幕上绘制一个矩形。第一个参数是屏幕,第二个参数是颜色,第三个参数是矩形的位置和大小。

display_score(score)

此函数在屏幕上显示分数:

def display_score(score):
    value = score_font.render("Score: " + str(score), True, WHITE)
    screen.blit(value, [10, 10])

在上述代码中,score_font.render() 用于在屏幕上渲染分数。第一个参数是要显示的文本,第二个参数是抗锯齿,第三个参数是文本的颜色。screen.blit() 用于在屏幕上绘制文本。第一个参数是要显示的文本,第二个参数是文本的位置。

game_loop()

此函数包含主游戏循环:

def game_loop():
    ## 游戏循环代码在此处
✨ 查看解决方案并练习

完成游戏循环代码

通过在 while 循环中添加游戏逻辑来完成 game_loop() 函数。

def game_loop():
    game_over = False
    game_close = False

    ## 设置蛇的起始位置
    x1 = WIDTH / 2
    y1 = HEIGHT / 2
    x1_change = 0
    y1_change = 0

    ## 设置蛇的身体
    snake_list = []
    snake_length = 1

    ## 设置强化道具
    powerup_x = round(random.randrange(0, WIDTH - powerup_block_size) / 20) * 20
    powerup_y = round(random.randrange(0, HEIGHT - powerup_block_size) / 20) * 20

    ## 设置游戏循环
    while not game_over:
        while game_close:
            screen.fill(BACKGROUND_COLOR)
            message = font_style.render("Press SPACE to play again", True, YELLOW)
            screen.blit(message, [WIDTH / 2 - 200, HEIGHT / 2 - 50])
            pygame.display.flip()

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

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    x1_change = -snake_block_size
                    y1_change = 0
                elif event.key == pygame.K_RIGHT:
                    x1_change = snake_block_size
                    y1_change = 0
                elif event.key == pygame.K_UP:
                    y1_change = -snake_block_size
                    x1_change = 0
                elif event.key == pygame.K_DOWN:
                    y1_change = snake_block_size
                    x1_change = 0

        if x1 >= WIDTH or x1 < 0 or y1 >= HEIGHT or y1 < 0:
            game_close = True

        x1 += x1_change
        y1 += y1_change
        screen.fill(BACKGROUND_COLOR)
        pygame.draw.rect(
            screen, BLUE, [powerup_x, powerup_y, powerup_block_size, powerup_block_size]
        )

        snake_head = []
        snake_head.append(x1)
        snake_head.append(y1)
        snake_list.append(snake_head)
        if len(snake_list) > snake_length:
            del snake_list[0]

        for x in snake_list[:-1]:
            if x == snake_head:
                game_close = True

        draw_snake(snake_block_size, snake_list)
        display_score(snake_length - 1)

        pygame.display.flip()

        if x1 == powerup_x and y1 == powerup_y:
            powerup_x = round(random.randrange(0, WIDTH - powerup_block_size) / 20) * 20
            powerup_y = (
                round(random.randrange(0, HEIGHT - powerup_block_size) / 20) * 20
            )
            snake_length += 1

        clock.tick(snake_speed)

    pygame.quit()

在上述代码中,pygame.QUIT 用于退出游戏。pygame.KEYDOWN 用于检查是否有按键按下。pygame.K_LEFTpygame.K_RIGHTpygame.K_UPpygame.K_DOWN 分别用于检查是否按下了左、右、上、下箭头键。pygame.draw.rect() 用于在屏幕上绘制一个矩形。第一个参数是屏幕,第二个参数是颜色,第三个参数是矩形的位置和大小。pygame.display.flip() 用于更新屏幕。pygame.time.Clock() 用于在游戏中跟踪时间。pygame.time.Clock.tick() 用于设置游戏的帧率(FPS)。

✨ 查看解决方案并练习

运行游戏

在文件末尾添加以下内容以运行游戏:

game_loop()
pygame.quit()

最后,切换到桌面并使用以下命令运行该项目:

python snake_game.py
Snake game running command
✨ 查看解决方案并练习

总结

恭喜你!你已经成功地使用 Python 和 Pygame 库创建了一个贪吃蛇游戏。在这个项目中,你学习了如何设置游戏窗口、定义颜色、绘制蛇和强化道具、显示分数以及实现游戏逻辑。你现在可以运行游戏并尽情享受了。