【Python游戏开发】史上最全,从零实现贪吃蛇:Pygame实战详解与原创代码分享

目录

一、背景介绍
二、环境准备
三、核心实现步骤
四、游戏运行
五、注意事项与原创声明
六、总结

一、背景介绍

贪吃蛇(Snake Game)是电子游戏史上的经典之作,玩家通过操控蛇的移动方向,使其不断“吃”食物来增长身体,同时避免碰撞边界或自身。
为什么使用Python来开发?
1‌. 简洁高效‌:Python语法简单,适合快速开发小游戏。
‌2. Pygame库支持‌:提供图形渲染、事件处理等核心功能,无需复杂底层代码。

二、环境准备

1‌. Python 3.6+‌
‌2. Pygame库‌:用于游戏窗口、图形和事件管理。

pip install pygame

三、核心实现步骤

  1. 模块化设计:
    🐍 snake.py:处理蛇的运动逻辑、绘制、改变方向和检测自身碰撞
    🍎 food.py:食物的位置的生成和绘画食物
    🎮 game_controller.py:处理用户键盘的输入,检测墙壁和食物的碰撞以及重置游戏状态等逻辑功能
    ⚙️ settings.py:集中管理游戏的参数和颜色配置
    📋 enums.py:枚举管理方向键值
    🚀 main.py:主程序
snake_game/
├── snake.py       # 蛇类
├── food.py        # 食物类
├── game_controller.py        # 游戏逻辑控制类
├── settings.py        # 游戏界面与参数设置
├── enums.py        # 枚举方向值
└── main.py        # 主程序
  1. 游戏界面与参数设置settings.py
'''
1、游戏公共常量配置
'''
window_width = 800
window_height = 600
cell_size = 20
fps = 5

colors = {
    "background":(255,255,255), #白色
    "snake_body":(0,255,0),#绿色
    "snake_head":(0,0,0),#黑色
    "food":(255,0,0),#红色
    "text":(0,0,0)#黑色
}
  1. 枚举管理方向键值类enums.py
"""
1、枚举类型
"""
from enum import Enum

class Direction(Enum):
    UP = (0,-1)
    DOWN = (0,1)
    LEFT = (-1,0)
    RIGHT = (1,0)
  1. 蛇类:管理移动逻辑、绘制、改变方向和检测自身碰撞机制snake.py
'''
蛇类:
1、移动蛇
2、安全改变方向
3、检测自身碰撞
4、绘制蛇
'''

import pygame
from typing import  List,Tuple
from enums import Direction
from settings import cell_size,colors

class Snake:
    def __init__(self):
        self.body: List[Tuple[int, int]] = [(10, 10)] #初始蛇身位置
        self.direction = Direction.RIGHT #初始向右运动
        self.grow = False

    #移动蛇身
    def move(self):
        dx, dy = self.direction.value
        head_x, head_y = self.body[0]
        new_head = (head_x + dx, head_y + dy)
        self.body.insert(0, new_head)
        # 若非增长状态,移除身体列表的最后一个元素;否则蛇的身体长度增加,self.grow重置为False(增长效果只持续一帧/一次移动)
        if not self.grow:
            self.body.pop()
        else:
            self.grow = False

    # 安全改变方向
    def change_direction(self, new_dir: Direction):
        current_dx, current_dy = self.direction.value
        new_dx, new_dy = new_dir.value
        if (current_dx + new_dx, current_dy + new_dy) != (0, 0):
            self.direction = new_dir

    # 检测自身碰撞
    def check_self_collision(self) -> bool:
        return self.body in self.body[1:]

    # 绘制蛇
    def draw(self, surface: pygame.Surface):
        # 绘制头部
        head_x, head_y = self.body[0]
        pygame.draw.rect(
            surface, colors["snake_head"],
            (head_x * cell_size, head_y * cell_size, cell_size, cell_size)
        )
        # 绘制蛇身
        for segment in self.body[1:]:
            x, y = segment
            pygame.draw.rect(
                surface, colors["snake_body"],
                (x * cell_size, y * cell_size, cell_size, cell_size)
            )
  1. 食物类:随机生成食物位置避免与蛇身重叠和绘画食物food.py
'''
食物类:
1、食物的位置的生成
2、绘画食物
'''
import random
import pygame
from typing import List, Tuple
from settings import window_width,window_height,cell_size,colors

class Food:
    def __init__(self, exclude: List[Tuple[int, int]] = None):
        self.position: Tuple[int, int] = (0, 0)
        self.generate(exclude or [])

    # 生成新食物位置
    def generate(self, exclude: List[Tuple[int, int]]):
        max_x = (window_width // cell_size) - 1
        max_y = (window_height // cell_size) - 1

        while True:
            x = random.randint(0, max_x)
            y = random.randint(0, max_y)
            if (x, y) not in exclude:
                self.position = (x, y)
                break

    # 绘制食物
    def draw(self, surface: pygame.Surface):
        x, y = self.position
        pygame.draw.rect(
            surface, colors["food"],
            (x * cell_size, y * cell_size, cell_size, cell_size)
        )
  1. 游戏逻辑控制类:处理用户键盘的输入,检测墙壁和食物的碰撞以及重置游戏状态等逻辑功能game_controller.py
'''
Game类:
1、重置游戏状态
2、检测墙壁碰撞
3、检测食物碰撞
4、处理用户输入键盘方向键
5、绘制游戏结束界面
6、通用文字绘制方法
7、游戏开始
'''
import pygame
from snake import Snake
from food import Food
from settings import *
from enums import Direction

class GameController:
    def __init__(self):
        pygame.init()
        self.screen = pygame.display.set_mode((window_width, window_height))
        pygame.display.set_caption("贪吃蛇游戏")
        self.clock = pygame.time.Clock()
        self.reset_game()

    # 重置游戏状态
    def reset_game(self):
        self.snake = Snake()
        self.food = Food(exclude=self.snake.body)
        self.score = 0
        self.game_over = False

    # 检测墙壁碰撞
    def check_wall_collision(self) -> bool:
        head_x, head_y = self.snake.body[0]
        return (
                head_x < 0 or head_x >= window_width // cell_size or
                head_y < 0 or head_y >= window_height // cell_size
        )

    # 检测食物碰撞
    def check_food_collision(self):
        if self.snake.body[0] == self.food.position:
            self.snake.grow = True
            self.score += 10
            self.food.generate(self.snake.body)

    # 处理用户输入方向上下左右方向键
    def handle_input(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            elif event.type == pygame.KEYDOWN:
                if self.game_over:
                    self.reset_game()
                    return
                if event.key == pygame.K_UP:
                    self.snake.change_direction(Direction.UP)
                elif event.key == pygame.K_DOWN:
                    self.snake.change_direction(Direction.DOWN)
                elif event.key == pygame.K_LEFT:
                    self.snake.change_direction(Direction.LEFT)
                elif event.key == pygame.K_RIGHT:
                    self.snake.change_direction(Direction.RIGHT)

    # 绘制游戏结束界面
    def draw_game_over(self):
        self.screen.fill(colors["background"])
        self._draw_text(
            f"游戏结束!得分: {self.score}", 40,
            window_width // 2, window_height // 2
        )
        self._draw_text(
            "按任意键重新开始", 30,
            window_width // 2, window_height // 2 + 50
        )

    #通用文字绘制方法
    def _draw_text(self, text: str, size: int, x: int, y: int):
        font = pygame.font.SysFont("simhei", size)
        text_surface = font.render(text, True, colors["text"])
        text_rect = text_surface.get_rect(center=(x, y))
        self.screen.blit(text_surface, text_rect)

    #游戏开始
    def run(self):
        while True:
            self.handle_input()
            if not self.game_over:
                self.snake.move()
                self.check_food_collision()
                self.game_over = (
                        self.check_wall_collision() or
                        self.snake.check_self_collision()
                )
            self.screen.fill(colors["background"])
            if self.game_over:
                self.draw_game_over()
            else:
                self.snake.draw(self.screen)
                self.food.draw(self.screen)
                self._draw_text(f"得分: {self.score}", 30, 70, 20)
            pygame.display.flip()
            self.clock.tick(fps)
  1. 主程序:开始游戏main.py
'''
1、主程序:main.py
作用:
(1)创建GameController类的实例对象game
(2)调用game的runf方法,开始游戏
'''
from game_controller import GameController

if __name__ == "__main__":
    game = GameController()
    game.run()

四、游戏运行效果

  1. 基础玩法:
    (1)方向键控制蛇的移动(上、下、左、右)
    (2)吃到红色食物后蛇身体变长,左上角显示得分,得分+10
    (3)碰撞自身或边界(可选设定)时游戏结束。游戏结束提示语:游戏结束!得分:0,按任意键重新开始
    (4)防180度转向:使用方向向量反向检查
  2. 拓展功能:
    (1)音效支持:添加蛇吃食物和碰撞音效
    (2)高分榜:记录历史最高分
    (3)可添加食物动画效果
    (4)可添加蛇的眼睛会随着移动变化而变化
  3. 运行效果图:
    在这里插入图片描述

五、注意事项与原创声明

  1. 代码原创性:本代码逻辑均为独立编写
  2. 素材合规性:未使用受保护的图片和音频,使用Python中Pygame来实现

六、总结‌

  1. 技术亮点‌: ‌
    (1)模块化设计:蛇(Snake)、食物(Food)和游戏逻辑(game_controller)完全分离,每个类有明确的职责和接口,逻辑清晰
    (2)碰撞检测‌:通过坐标比对实现高效的自身碰撞判断
    (3)蛇身增加机制:状态驱动‌,单帧生效‌,自动重置,避免手动管理增长步数。

  2. 方向控制‌:
    (1)禁止180度转向,符合经典玩法逻辑

  3. 学习价值‌:
    (1)掌握Pygame基础用法(事件循环、图形绘制)
    (2)理解游戏开发中的状态管理与实时更新机制
    (3)掌握通过坐标对比分维度处理坐标位置

  4. 扩展方向‌:
    (1)特殊食物有星形标记
    (2)蛇身有连接处细节
    (3)蛇的头部有眼睛,会随着移动方向变化
    (4)AI自动生成等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值