使用Python实现经典贪吃蛇游戏教程

embedded/2025/3/20 3:56:04/

运行效果图如下,完整代码在文末

在这里插入图片描述

一、环境准备

  1. 安装Python 3.x
  2. 安装pygame库:
    pip install pygame
    

二、游戏功能说明

  1. 基本游戏机制

    • 方向控制:↑ ↓ ← → 键控制蛇移动方向
    • 得分规则:每吃1个食物得1分
    • 碰撞检测:撞墙或自碰游戏结束
    • 自动生成:食物随机生成且不与蛇体重叠
  2. 特色功能

    • 分数实时显示
    • 游戏结束后2秒自动重置
    • 不同颜色区分蛇头和身体
    • 方向输入缓冲机制(防止180°急转)

三、代码结构解析

1. 游戏初始化

python">pygame.init()  # 初始化引擎
screen = pygame.display.set_mode((WIDTH, HEIGHT))  # 创建窗口

2. Snake类核心方法

  • reset(): 重置游戏状态
  • move(): 处理蛇的移动逻辑
  • check_food(): 检测是否吃到食物
  • generate_food(): 生成新食物位置
  • check_collision(): 碰撞检测

3. 游戏主循环

python">while running:# 事件处理# 游戏逻辑更新# 画面绘制# 刷新显示

4. 图形绘制

  • 使用pygame.draw.rect绘制方形元素
  • 蛇头使用绿色,身体使用白色
  • 食物使用红色方块

四、关键算法解析

1. 方向控制机制

python"># 方向有效性检查:不能直接反向
if (当前方向和新方向不相反):更新方向

2. 食物生成算法

python">def generate_food(self):while True:生成随机位置if 位置不在蛇身上:return 该位置

3. 碰撞检测

python"># 边界检测
if 蛇头坐标超出窗口范围:return True# 自碰检测
for 每个身体段:if 蛇头坐标 == 身体段坐标:return True

五、运行与调试

  1. 直接运行python文件
  2. 常见问题解决:
    • 如果出现导入错误:确认pygame是否安装成功
    • 窗口无响应:检查事件循环是否正常退出
    • 食物生成位置异常:检查CELL_SIZE是否为20的倍数

六、扩展建议

  1. 难度分级:通过速度分级增加可玩性
  2. 音效添加:吃食物和碰撞时添加音效
  3. 排行榜功能:记录历史最高分
  4. 界面美化:使用图片替代纯色方块

七、完整代码

python">import pygame
import random
import time# 初始化Pygame
pygame.init()# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)# 游戏窗口设置
WIDTH = 800
HEIGHT = 600
CELL_SIZE = 20
SPEED = 15# 初始化窗口
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("贪吃蛇游戏")clock = pygame.time.Clock()class Snake:def __init__(self):self.reset()def reset(self):self.body = [[WIDTH//2, HEIGHT//2]]self.direction = "RIGHT"self.new_direction = "RIGHT"self.score = 0def move(self):# 方向有效性检查if (self.direction == "UP" and self.new_direction != "DOWN") or \(self.direction == "DOWN" and self.new_direction != "UP") or \(self.direction == "LEFT" and self.new_direction != "RIGHT") or \(self.direction == "RIGHT" and self.new_direction != "LEFT"):self.direction = self.new_directionhead = self.body[0].copy()if self.direction == "UP":head[1] -= CELL_SIZEelif self.direction == "DOWN":head[1] += CELL_SIZEelif self.direction == "LEFT":head[0] -= CELL_SIZEelif self.direction == "RIGHT":head[0] += CELL_SIZEself.body.insert(0, head)if not self.check_food():self.body.pop()def check_food(self):global food_posif self.body[0] == food_pos:self.score += 1food_pos = self.generate_food()return Truereturn Falsedef generate_food(self):while True:new_food = [random.randrange(1, (WIDTH//CELL_SIZE)-1) * CELL_SIZE,random.randrange(1, (HEIGHT//CELL_SIZE)-1) * CELL_SIZE]if new_food not in self.body:return new_fooddef check_collision(self):# 边界检测if (self.body[0][0] < 0 or self.body[0][0] >= WIDTH orself.body[0][1] < 0 or self.body[0][1] >= HEIGHT):return True# 自碰检测for segment in self.body[1:]:if self.body[0] == segment:return Truereturn Falsedef show_score(score):font = pygame.font.SysFont(None, 35)text = font.render(f"分数: {score}", True, BLUE)screen.blit(text, (10, 10))def game_over():font = pygame.font.SysFont(None, 72)text = font.render("游戏结束!", True, RED)screen.blit(text, (WIDTH//2-120, HEIGHT//2-40))pygame.display.flip()time.sleep(2)# 初始化蛇和食物
snake = Snake()
food_pos = snake.generate_food()# 游戏主循环
running = True
while running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_UP:snake.new_direction = "UP"elif event.key == pygame.K_DOWN:snake.new_direction = "DOWN"elif event.key == pygame.K_LEFT:snake.new_direction = "LEFT"elif event.key == pygame.K_RIGHT:snake.new_direction = "RIGHT"snake.move()if snake.check_collision():game_over()snake.reset()food_pos = snake.generate_food()# 绘制画面screen.fill(BLACK)# 绘制食物pygame.draw.rect(screen, RED, (food_pos[0], food_pos[1], CELL_SIZE, CELL_SIZE))# 绘制蛇for idx, segment in enumerate(snake.body):color = GREEN if idx == 0 else WHITEpygame.draw.rect(screen, color, (segment[0], segment[1], CELL_SIZE, CELL_SIZE))show_score(snake.score)pygame.display.update()clock.tick(SPEED)pygame.quit()

运行效果:

  • 窗口尺寸:800x600
  • 蛇身初始长度:1节
  • 移动速度:15帧/秒
  • 分数显示在窗口左上角

赶紧复制代码体验自己实现的经典游戏吧!后续可以基于这个基础版本进行更多个性化修改和功能扩展。


http://www.ppmy.cn/embedded/174042.html

相关文章

革新协作体验 | 集和诚KMDA-2631协作机器人控制器重磅上市!

随着制造业对柔性生产的需求激增&#xff0c;协作机器人正成为工业升级的核心力量。它们以安全、灵活、易用的特点&#xff0c;与人类并肩完成精密任务。而这一切的背后&#xff0c;离不开一颗强大的“大脑”——KMDA-2631协作机器人控制器&#xff0c;作为集和诚研发中心的全新…

2025-03-17 学习记录--C/C++-PTA 习题4-7 最大公约数和最小公倍数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 习题4-7 最大公约数和最小公倍数 本题要求两个给定正整数的最大公约数和最小公倍数。 输入格式: 输入在一…

Ansible命令行模式常用模块使用案例(三)

在Ansible中&#xff0c;命令行模式&#xff08;Ad-Hoc 模式&#xff09;是一种快速执行任务的方式&#xff0c;适合临时任务或简单操作。以下是 Ansible 命令行模式中常用模块的使用案例&#xff08;第三部分&#xff09;。 1 user 功能特性&#xff1a;用于管理用户账户&…

[HelloCTF]PHPinclude-labs超详细WP-Level 6Level 7Level 8Level 9-php://协议

由于Level 6-9 关的原理都是通用的, 这里就拿第6关举例, 其他的关卡同理 源码分析 定位到代码 isset($_GET[wrappers]) ? include("php://".$_GET[wrappers]) : ; 与前几关发生变化的就是 php:// 解题分析 这一关要求我们使用 php协议 php:// 协议 php://filte…

设计C语言的单片机接口

一、主要内容 (一)控制引脚 1、定义管脚 // 定义管脚的结构体 struct pin{ int id; // 管脚编号 int mode; // 模式&#xff0c;输入为1&#xff0c;输出为0 int pull; // 输入电阻 int driver; // 功率 } 2、输出电平 语法&#xff1a; void pin_output(s…

c++ 基础题目lambda

1. auto lambda = [](double x) { return static_cast<int>(x); }; 是 匿名函数对象 ,不可直接声明 a.可以赋值给一个与其类型兼容的 std::function 类型的对象 std::function<int(int, int)> lambda = [](int x, int y) { return x + y; }; b.使用具体的 lambda …

Java List 接口的核心 API

1. 添加元素 方法&#xff1a; boolean add(E e)&#xff1a;将元素添加到列表末尾。 void add(int index, E element)&#xff1a;将元素插入到指定位置。 boolean addAll(Collection<? extends E> c)&#xff1a;将集合中的所有元素添加到列表末尾。 boolean addA…

Deepseek API+Python测试用例一键生成与导出-V1.0.2【实现需求文档图片识别与用例生成自动化】

在测试工作中&#xff0c;需求文档中的图片&#xff08;如界面设计图、流程图&#xff09;往往是测试用例生成的重要参考。然而&#xff0c;手动提取图片并识别内容不仅耗时&#xff0c;还容易出错。本文将通过一个自研小工具&#xff0c;结合 PaddleOCR 和大模型&#xff0c;自…