从零开始用 Python 打造经典贪吃蛇游戏:代码+详解

举报
跟着小郑学前端 发表于 2024/12/10 10:30:46 2024/12/10
【摘要】 贪吃蛇是一个经典的益智游戏。它不仅容易上手,也是学习 Python 游戏开发的好入门项目。本文将通过使用 pygame 模块实现一个简单的贪吃蛇游戏,并进行详细讲解。 1. 安装 pygame在开始之前,需要确保安装了 pygame 模块。使用以下命令安装:pip install pygame 2. 完整代码以下是贪吃蛇游戏的完整实现代码:import pygameimport random...

贪吃蛇是一个经典的益智游戏。它不仅容易上手,也是学习 Python 游戏开发的好入门项目。本文将通过使用 pygame 模块实现一个简单的贪吃蛇游戏,并进行详细讲解。

1. 安装 pygame

在开始之前,需要确保安装了 pygame 模块。使用以下命令安装:

pip install pygame

2. 完整代码

以下是贪吃蛇游戏的完整实现代码:

import pygame
import random
import time

# 初始化 pygame
pygame.init()

# 屏幕大小
WIDTH, HEIGHT = 600, 400
CELL_SIZE = 20

# 定义颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)

# 创建屏幕
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('贪吃蛇')

# 初始化时钟
clock = pygame.time.Clock()

def draw_snake(snake_body):
    """绘制蛇的身体"""
    for segment in snake_body:
        pygame.draw.rect(screen, GREEN, pygame.Rect(segment[0], segment[1], CELL_SIZE, CELL_SIZE))

def show_message(text, color, size, position):
    """显示信息"""
    font = pygame.font.Font(None, size)
    message = font.render(text, True, color)
    screen.blit(message, position)

def main():
    # 初始化蛇
    snake_pos = [100, 50]  # 蛇头初始位置
    snake_body = [[100, 50], [80, 50], [60, 50]]  # 蛇身体
    direction = 'RIGHT'  # 蛇头初始方向
    change_to = direction

    # 初始化食物
    food_pos = [random.randrange(1, WIDTH // CELL_SIZE) * CELL_SIZE, 
                random.randrange(1, HEIGHT // CELL_SIZE) * CELL_SIZE]
    food_spawn = True

    # 初始化分数
    score = 0

    running = True
    while running:
        # 监听按键事件
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP and direction != 'DOWN':
                    change_to = 'UP'
                elif event.key == pygame.K_DOWN and direction != 'UP':
                    change_to = 'DOWN'
                elif event.key == pygame.K_LEFT and direction != 'RIGHT':
                    change_to = 'LEFT'
                elif event.key == pygame.K_RIGHT and direction != 'LEFT':
                    change_to = 'RIGHT'

        direction = change_to

        # 更新蛇头位置
        if direction == 'UP':
            snake_pos[1] -= CELL_SIZE
        elif direction == 'DOWN':
            snake_pos[1] += CELL_SIZE
        elif direction == 'LEFT':
            snake_pos[0] -= CELL_SIZE
        elif direction == 'RIGHT':
            snake_pos[0] += CELL_SIZE

        # 增加蛇头
        snake_body.insert(0, list(snake_pos))

        # 检测是否吃到食物
        if snake_pos == food_pos:
            score += 10
            food_spawn = False
        else:
            snake_body.pop()

        if not food_spawn:
            food_pos = [random.randrange(1, WIDTH // CELL_SIZE) * CELL_SIZE, 
                        random.randrange(1, HEIGHT // CELL_SIZE) * CELL_SIZE]
        food_spawn = True

        # 游戏结束条件
        if (
            snake_pos[0] < 0 or snake_pos[0] >= WIDTH or
            snake_pos[1] < 0 or snake_pos[1] >= HEIGHT
        ):
            running = False

        # 检测蛇是否碰到自己
        for block in snake_body[1:]:
            if snake_pos == block:
                running = False

        # 绘制屏幕
        screen.fill(BLACK)
        draw_snake(snake_body)
        pygame.draw.rect(screen, RED, pygame.Rect(food_pos[0], food_pos[1], CELL_SIZE, CELL_SIZE))
        show_message(f'Score: {score}', WHITE, 20, (10, 10))

        pygame.display.update()
        clock.tick(10)

    # 游戏结束信息
    screen.fill(BLACK)
    show_message("Game Over!", RED, 50, (WIDTH // 2 - 100, HEIGHT // 2 - 30))
    show_message(f"Your Score: {score}", WHITE, 30, (WIDTH // 2 - 90, HEIGHT // 2 + 20))
    pygame.display.update()
    time.sleep(3)

    pygame.quit()

if __name__ == "__main__":
    main()

3. 代码讲解

3.1 窗口设置

通过 pygame.display.set_mode() 创建窗口,WIDTH 和 HEIGHT 定义屏幕大小,CELL_SIZE 定义单元格大小,用于蛇的移动和食物生成。

3.2 蛇的定义和绘制

蛇通过一个列表 snake_body 存储位置,每个元素是 [x, y] 坐标。draw_snake() 函数绘制蛇的每个部分。

3.3 方向控制

通过监听键盘事件 (pygame.KEYDOWN) 控制蛇的方向变化。用 change_to 确保快速按键不会导致蛇逆行。

3.4 食物生成和检测

食物的位置由 food_pos 确定,使用 random 随机生成。蛇吃到食物后增长身体并刷新食物位置。

3.5 游戏结束条件

蛇头碰到边界。
蛇头碰到自身。

3.6 显示分数

使用 pygame.font.Font() 绘制得分。

4. 运行效果

游戏运行后:

  • 蛇会按照指定方向移动。
  • 吃到红色方块(食物)后,蛇会变长,分数增加。
  • 蛇碰到屏幕边界或自身后游戏结束。

5. 总结

这段代码使用了 pygame 的核心功能,如绘制图形、监听事件和更新屏幕等。通过学习此项目,你可以掌握如何用 Python 开发一个完整的游戏,并进一步扩展功能,如增加障碍物、调整游戏速度、设计多关卡等。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。