当前位置: 首页 > article >正文

Python小游戏开发:从零实现贪吃蛇游戏

Python小游戏开发:从零实现贪吃蛇游戏

在这里插入图片描述

文章目录

  • Python小游戏开发:从零实现贪吃蛇游戏
    • 前言
    • 游戏简介
    • 使用的工具与依赖
      • 安装 Pygame
    • 项目功能设计
    • 代码实现
      • 1. 初始化与基础设置
      • 2. 显示得分
      • 3. 蛇与食物的绘制
      • 4. 游戏结束界面
      • 5. 主要游戏循环
    • 运行游戏
    • 运行结果
    • 总结

前言

最近,我花了一些时间用 Python 和 Pygame 实现了一个经典的小游戏——贪吃蛇。这个游戏不仅充满了童年的回忆,同时也非常适合作为学习编程的练手项目。本篇博客将分享完整的代码实现,并从项目结构、功能点以及优化技巧等多个方面进行详细解析。如果你是 Python 的初学者,或对游戏开发感兴趣,相信这篇文章会对你有所帮助!


游戏简介

贪吃蛇是一款经典的益智休闲游戏,玩家通过键盘控制蛇的方向,吃掉食物让蛇变得更长,游戏的难度随着蛇的长度增加而逐步提高。一旦蛇撞墙或撞到自己的身体,游戏结束。

我们实现的版本中,还增加了“游戏结束后按钮操作”功能——玩家可以选择重新开始或退出游戏。


使用的工具与依赖

  • Python 版本:建议使用 Python 3.6 以上版本
  • Pygame:一个基于 Python 的简单游戏开发框架,提供了图形、声音和事件处理的支持。

安装 Pygame

在开始之前,确保你已经安装了 pygame,如果未安装,可以使用以下命令:

pip install pygame

项目功能设计

在开始写代码前,我们需要明确贪吃蛇游戏的核心功能点:

  1. 游戏窗口:定义游戏画布的大小、颜色等。
  2. 蛇的移动:通过键盘方向键控制蛇的运动。
  3. 食物生成:随机生成食物的位置,供蛇“吃”。
  4. 得分统计:每次蛇吃掉食物,得分加一,同时蛇身变长。
  5. 游戏结束逻辑:当蛇撞墙或撞到自身时,显示“游戏结束”界面,并提供按钮选择。
  6. 中文支持:优化字体显示,确保文字支持中文。

代码实现

下面是完整的代码实现。每个模块都有详细的注释,方便大家理解。

1. 初始化与基础设置

import pygame
import random

# 初始化 Pygame
pygame.init()

# 定义屏幕大小和颜色
screen_width = 800
screen_height = 600
block_size = 20
black = (0, 0, 0)
white = (255, 255, 255)
red = (255, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)
gray = (200, 200, 200)

# 创建屏幕对象
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("贪吃蛇游戏")

# 定义时钟
clock = pygame.time.Clock()

# 加载支持中文的字体文件
chinese_font = pygame.font.Font("C:/Windows/Fonts/simhei.ttf", 25)
score_font = pygame.font.Font("C:/Windows/Fonts/simhei.ttf", 35)

2. 显示得分

显示得分是游戏的基础功能,每次吃到食物后会更新得分:

def display_score(score):
    value = score_font.render("得分: " + str(score), True, green)
    screen.blit(value, [0, 0])

3. 蛇与食物的绘制

蛇的身体通过一系列的矩形块构成,随着食物被吃掉,蛇的长度逐渐增加:

def draw_snake(block_size, snake_list):
    for block in snake_list:
        pygame.draw.rect(screen, blue, [block[0], block[1], block_size, block_size])

4. 游戏结束界面

当蛇撞墙或撞到自身时,显示“游戏结束”提示,并添加按钮让玩家选择继续游戏或退出游戏:

def button(msg, x, y, w, h, inactive_color, active_color, action=None):
    mouse = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()
    if x < mouse[0] < x + w and y < mouse[1] < y + h:
        pygame.draw.rect(screen, active_color, [x, y, w, h])
        if click[0] == 1 and action is not None:
            action()
    else:
        pygame.draw.rect(screen, inactive_color, [x, y, w, h])

    text = chinese_font.render(msg, True, black)
    screen.blit(text, [x + (w - text.get_width()) / 2, y + (h - text.get_height()) / 2])

5. 主要游戏循环

游戏的核心逻辑包括:

  • 控制蛇的移动方向。
  • 检测蛇是否撞墙或撞到自身。
  • 生成随机食物位置。
  • 更新得分和蛇的长度。
def game_loop():
    game_over = False
    game_close = False

    # 初始位置和运动方向
    x = screen_width / 2
    y = screen_height / 2
    x_change = 0
    y_change = 0

    # 蛇的身体
    snake_list = []
    length_of_snake = 1

    # 食物位置
    food_x = round(random.randrange(0, screen_width - block_size) / 20.0) * 20.0
    food_y = round(random.randrange(0, screen_height - block_size) / 20.0) * 20.0

    while not game_over:

        while game_close:
            screen.fill(black)
            display_message("游戏结束!", red)

            # 添加按钮
            button("继续游戏", 250, 400, 150, 50, gray, green, restart_game)
            button("退出游戏", 450, 400, 150, 50, gray, red, quit_game)

            pygame.display.update()

        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 and x_change == 0:
                    x_change = -block_size
                    y_change = 0
                elif event.key == pygame.K_RIGHT and x_change == 0:
                    x_change = block_size
                    y_change = 0
                elif event.key == pygame.K_UP and y_change == 0:
                    y_change = -block_size
                    x_change = 0
                elif event.key == pygame.K_DOWN and y_change == 0:
                    y_change = block_size
                    x_change = 0

        if x >= screen_width or x < 0 or y >= screen_height or y < 0:
            game_close = True

        x += x_change
        y += y_change
        screen.fill(black)

        # 画食物
        pygame.draw.rect(screen, red, [food_x, food_y, block_size, block_size])

        # 更新蛇的位置
        snake_head = []
        snake_head.append(x)
        snake_head.append(y)
        snake_list.append(snake_head)
        if len(snake_list) > length_of_snake:
            del snake_list[0]

        # 检查是否撞到自己
        for block in snake_list[:-1]:
            if block == snake_head:
                game_close = True

        draw_snake(block_size, snake_list)
        display_score(length_of_snake - 1)

        pygame.display.update()

        # 吃食物
        if x == food_x and y == food_y:
            food_x = round(random.randrange(0, screen_width - block_size) / 20.0) * 20.0
            food_y = round(random.randrange(0, screen_height - block_size) / 20.0) * 20.0
            length_of_snake += 1

        clock.tick(15)

    pygame.quit()
    quit()

运行游戏

将代码保存为 snake_game.py,运行程序即可开始游戏:

python snake_game.py

运行结果

在这里插入图片描述
在这里插入图片描述

总结

通过这次项目,我们了解了如何使用 Pygame 构建一个简单的 2D 游戏,包括事件监听、图形绘制、碰撞检测等。未来可以考虑进一步优化:

  1. 增加背景音乐。
  2. 提升食物种类和得分机制。
  3. 蛇的速度随长度增加逐渐变快。

希望这篇博客对你有所帮助,欢迎在评论区留言你的问题和建议!🎮


http://www.kler.cn/a/447786.html

相关文章:

  • Django-路由
  • 计算机网络:应用层 —— 应用层概述
  • BERT模型入门(12)字节对编码(Byte Pair Encoding,BPE)
  • 【数据库系统概论】—— 关系数据库
  • stm32制作CAN适配器4--WinUsb的使用
  • 植物大战僵尸杂交版v3.0.2最新版本(附下载链接)
  • 云图库平台(二)前端项目初始化
  • 二进制分析的新兴趋势:塑造安全的移动应用
  • Kubernates
  • Ubuntu24版 最新安装CUDA驱动方式
  • dify工作流+github actions实现翻译并创建PR
  • 智能体实战(需求分析助手)二、需求分析助手第一版实现(支持需求提取、整理、痛点分析、需求分类、优先级分析、需求文档生成等功能)
  • Spring(二)AOP、切入点表达式、AspecJ常用通知的类型、Spring中的事务管理
  • 【期末复习】JavaEE(上)
  • powershell美化
  • 使用 Docker 打包和运行 Vue 应用
  • Suno Api V4模型无水印开发「人声伴奏分离」 —— 「Suno Api系列」第7篇
  • 成方金融科技后端部分笔试题 - 解析
  • Pytorch | 利用VMI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
  • Pytorch | 从零构建MobileNet对CIFAR10进行分类