首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐
2025年5月25日 星期日 7:37am

Python版贪吃蛇保姆级教程

  • 25-04-25 09:21
  • 3704
  • 11980
blog.csdn.net

Python版贪吃蛇(最后附上完整代码并有详细注释):从零开始用Pygame实现经典游戏

一、前言:童年经典游戏重生

贪吃蛇作为一款经典游戏,承载着无数人的童年回忆。今天我们将用Python+pygame从零开始实现这个经典游戏!通过本教程,你不仅能掌握游戏开发的基本流程,还能学习到实用的编程技巧。先来看看最终效果:

二、开发准备

环境要求

  • Python 3.9

  • Pygame==2.6.1库(pip install pygame==2.6.1)

三、核心代码解析

3.1 游戏初始化

  1. # 初始化Pygame引擎
  2. pygame.init()
  3. # 创建游戏窗口
  4. screen = pygame.display.set_mode((800, 600))
  5. pygame.display.set_caption("贪吃蛇大作战")

3.2 游戏常量配置

  1. WINDOW_WIDTH = 800 # 窗口宽度
  2. WINDOW_HEIGHT = 600 # 窗口高度
  3. CELL_SIZE = 20 # 蛇身和食物的单位尺寸
  4. COLORS = { # 颜色字典
  5. "BLACK": (0,0,0),
  6. "WHITE": (255,255,255),
  7. "RED": (255,0,0),
  8. # ...其他颜色
  9. }

3.3 蛇的移动控制

  1. # 方向向量控制:通过元组存储方向
  2. current_dir = (1, 0) # 初始向右
  3. # 键盘事件处理(防止180度转向)
  4. if event.key == pygame.K_UP:
  5. new_dir = (0, -1)
  6. # 判断新方向是否合法(非相反方向)
  7. if (current_dir[0] + new_dir[0] != 0) or ...:
  8. current_dir = new_dir

四、关键技术实现

4.1 蛇身绘制技巧

  1. # 渐变颜色区分头身
  2. for i, (x, y) in enumerate(snake):
  3. color = COLORS["SNAKE_HEAD"] if i==0 else COLORS["SNAKE_BODY"]
  4. # 圆角矩形提升美观度
  5. pygame.draw.rect(screen, color, (x,y,CELL_SIZE-1,CELL_SIZE-1), border_radius=4)

4.2 智能食物生成

  1. def generate_food():
  2. while True:
  3. # 随机生成坐标
  4. x = random.randint(0, (WIDTH-CELL_SIZE)//CELL_SIZE) * CELL_SIZE
  5. y = ...
  6. # 确保不在蛇身上
  7. if (x,y) not in snake:
  8. return (x,y)

4.3 碰撞检测系统

  1. # 边界检测
  2. new_head[0] < 0 or new_head[0] >= WIDTH...
  3. # 自碰检测
  4. new_head in snake
  5. # 食物碰撞检测
  6. new_head == food_pos

五、特色功能实现

5.1 速度切换系统

  1. # 按住方向键加速
  2. accelerate = any(keys[k] for k in (pygame.K_UP, ...))
  3. # 动态调整帧率
  4. Clock().tick(ACCELERATE_FPS if accelerate else BASE_FPS)

5.2 高分记录系统

  1. def load_highscore():
  2. try:
  3. with open('highscore.txt') as f:
  4. return int(f.read())
  5. except:
  6. return 0
  7. def save_highscore():
  8. with open('highscore.txt', 'w') as f:
  9. f.write(str(high_score))

六、游戏逻辑流程图

  1. graph TD
  2. A[游戏初始化] --> B[主循环]
  3. B --> C{事件处理}
  4. C -->|按键| D[更新方向]
  5. C -->|退出| E[结束游戏]
  6. B --> F[移动蛇头]
  7. F --> G{碰撞检测}
  8. G -->|碰墙/自身| H[游戏结束]
  9. G -->|吃到食物| I[增长蛇身]
  10. G -->|正常移动| J[更新位置]
  11. B --> K[重绘画面]

扩展方向

  1. 增加不同难度级别

  2. 添加多种特殊食物(加速、减速等)

  3. 实现多人对战模式

  4. 加入背景音乐和音效

七、总结

通过本教程,我们完整实现了:

  • 游戏窗口创建与绘制

  • 蛇的移动与控制逻辑

  • 智能食物生成系统

  • 完善的碰撞检测

  • 高分记录功能

  • 动态速度调节

八、完整代码

  1. # -*- coding: utf-8 -*-
  2. import pygame
  3. import random
  4. import sys
  5. # 初始化pygame(必须的步骤,用于初始化所有pygame模块)
  6. pygame.init()
  7. # === 游戏常量配置 ===
  8. WINDOW_WIDTH = 800 # 游戏窗口宽度(单位:像素)
  9. WINDOW_HEIGHT = 600 # 游戏窗口高度(单位:像素)
  10. CELL_SIZE = 20 # 网格单元格大小(单位:像素)
  11. BASE_FPS = 5 # 基础游戏帧率(控制蛇的正常移动速度)
  12. ACCELERATE_FPS = 14 # 加速时的游戏帧率
  13. # 颜色定义(RGB格式)
  14. COLORS = {
  15. "BLACK": (0, 0, 0),
  16. "WHITE": (255, 255, 255),
  17. "RED": (255, 0, 0),
  18. "GREEN": (0, 255, 0),
  19. "BLUE": (0, 100, 200),
  20. "GRID": (40, 40, 40), # 网格线颜色
  21. "SNAKE_HEAD": (0, 255, 0), # 蛇头颜色
  22. "SNAKE_BODY": (0, 200, 0) # 蛇身颜色
  23. }
  24. # === 游戏状态初始化 ===
  25. snake = [] # 用列表存储蛇身体的坐标(每个元素是一个元组)
  26. current_dir = (1, 0) # 当前移动方向(使用向量表示,初始向右)
  27. food_pos = (0, 0) # 食物位置坐标
  28. is_playing = True # 游戏是否进行中的状态
  29. score = 0 # 当前游戏分数
  30. high_score = 0 # 历史最高分记录
  31. # 初始化游戏窗口
  32. screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
  33. pygame.display.set_caption("贪吃蛇大作战") # 窗口标题
  34. def draw_grid():
  35. """绘制网格线背景,帮助玩家更好地观察位置"""
  36. # 绘制垂直网格线
  37. for x in range(0, WINDOW_WIDTH, CELL_SIZE):
  38. pygame.draw.line(screen, COLORS["GRID"], (x, 0), (x, WINDOW_HEIGHT))
  39. # 绘制水平网格线
  40. for y in range(0, WINDOW_HEIGHT, CELL_SIZE):
  41. pygame.draw.line(screen, COLORS["GRID"], (0, y), (WINDOW_WIDTH, y))
  42. def generate_food():
  43. """生成食物坐标,确保不在蛇身体上"""
  44. while True:
  45. # 计算网格坐标(确保在窗口范围内)
  46. x = random.randint(0, (WINDOW_WIDTH - CELL_SIZE) // CELL_SIZE) * CELL_SIZE
  47. y = random.randint(0, (WINDOW_HEIGHT - CELL_SIZE) // CELL_SIZE) * CELL_SIZE
  48. # 检查生成位置是否与蛇身体重叠
  49. if (x, y) not in snake:
  50. return (x, y)
  51. def reset_game():
  52. """重置游戏所有状态到初始值"""
  53. global snake, current_dir, food_pos, is_playing, score
  54. snake = [(WINDOW_WIDTH // 2, WINDOW_HEIGHT // 2)] # 蛇初始位置在窗口中心
  55. current_dir = (1, 0) # 初始方向向右
  56. food_pos = generate_food() # 生成第一个食物
  57. is_playing = True # 游戏状态设置为进行中
  58. score = 0 # 重置当前分数
  59. def show_text(content, size, color, position):
  60. """在指定位置显示文字的工具函数"""
  61. font = pygame.font.SysFont('simhei', size) # 使用黑体字
  62. text_surface = font.render(content, True, color)
  63. screen.blit(text_surface, position)
  64. def load_highscore():
  65. """从文件读取历史最高分"""
  66. try:
  67. with open('highscore.txt', 'r') as f:
  68. return int(f.read())
  69. except FileNotFoundError:
  70. return 0 # 文件不存在时返回0分
  71. def save_highscore():
  72. """保存最高分到文件"""
  73. with open('highscore.txt', 'w') as f:
  74. f.write(str(high_score))
  75. # 初始化游戏
  76. high_score = load_highscore()
  77. reset_game()
  78. # === 主游戏循环 ===
  79. while True:
  80. # 处理事件队列(包括按键、窗口关闭等)
  81. for event in pygame.event.get():
  82. if event.type == pygame.QUIT: # 点击窗口关闭按钮
  83. pygame.quit()
  84. sys.exit()
  85. elif event.type == pygame.KEYDOWN:
  86. if event.key == pygame.K_q: # Q键退出
  87. pygame.quit()
  88. sys.exit()
  89. if event.key == pygame.K_r and not is_playing: # R键重启游戏
  90. reset_game()
  91. # 方向键控制(已解决反向问题)
  92. if is_playing:
  93. new_dir = current_dir # 默认保持当前方向
  94. if event.key == pygame.K_UP:
  95. new_dir = (0, -1)
  96. elif event.key == pygame.K_DOWN:
  97. new_dir = (0, 1)
  98. elif event.key == pygame.K_LEFT:
  99. new_dir = (-1, 0)
  100. elif event.key == pygame.K_RIGHT:
  101. new_dir = (1, 0)
  102. # 禁止直接反向(只有当新方向不相反时更新)
  103. if (current_dir[0] + new_dir[0] != 0) or (current_dir[1] + new_dir[1] != 0):
  104. current_dir = new_dir
  105. # 获取当前按键状态实现加速功能
  106. keys = pygame.key.get_pressed()
  107. # 检查是否有方向键被按住(使用位运算优化判断)
  108. accelerate = any(keys[k] for k in (pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT))
  109. # 游戏进行中的逻辑处理
  110. if is_playing:
  111. # 计算新蛇头位置
  112. head_x, head_y = snake[0]
  113. dir_x, dir_y = current_dir
  114. new_head = (head_x + dir_x * CELL_SIZE, head_y + dir_y * CELL_SIZE)
  115. # 碰撞检测(边界和自身)
  116. if (new_head in snake or
  117. new_head[0] < 0 or
  118. new_head[0] >= WINDOW_WIDTH or
  119. new_head[1] < 0 or
  120. new_head[1] >= WINDOW_HEIGHT):
  121. is_playing = False
  122. # 更新最高分记录
  123. if score > high_score:
  124. high_score = score
  125. save_highscore()
  126. # 更新蛇的位置
  127. snake.insert(0, new_head)
  128. if new_head == food_pos: # 吃到食物
  129. score += 10
  130. food_pos = generate_food()
  131. else: # 没吃到食物时移除尾部
  132. snake.pop()
  133. # === 绘制游戏画面 ===
  134. screen.fill(COLORS["BLACK"]) # 填充背景色
  135. draw_grid() # 绘制网格线
  136. # 绘制蛇的身体(使用渐变颜色)
  137. for i, (x, y) in enumerate(snake):
  138. # 根据部位设置颜色(头部更亮)
  139. color = COLORS["SNAKE_HEAD"] if i == 0 else COLORS["SNAKE_BODY"]
  140. # 绘制带圆角的蛇身
  141. pygame.draw.rect(screen, color, (x, y, CELL_SIZE - 1, CELL_SIZE - 1), border_radius=4)
  142. # 绘制食物(使用圆形)
  143. center = (food_pos[0] + CELL_SIZE // 2, food_pos[1] + CELL_SIZE // 2)
  144. pygame.draw.circle(screen, COLORS["RED"], center, CELL_SIZE // 2 - 2)
  145. # 显示分数信息
  146. show_text(f"分数: {score} 最高分: {high_score}", 24, COLORS["WHITE"], (10, 10))
  147. # 游戏结束显示提示
  148. if not is_playing:
  149. text_width = 400 # 根据文字长度估算居中位置
  150. show_text("游戏结束!按 R 重新开始", 48, COLORS["WHITE"],
  151. (WINDOW_WIDTH // 2 - text_width // 2, WINDOW_HEIGHT // 2 - 30))
  152. # 更新画面并控制游戏速度
  153. pygame.display.update()
  154. # 根据加速状态动态调整帧率
  155. pygame.time.Clock().tick(ACCELERATE_FPS if accelerate else BASE_FPS)

注:本文转载自blog.csdn.net的wizonebb的文章"https://blog.csdn.net/wizonebb/article/details/145439291"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
游戏

Python版贪吃蛇保姆级教程

Python版贪吃蛇(最后附上完整代码并有详细注释):从零开始用Pygame实现经典游戏一、前言:童年经典游戏重生贪吃蛇作为一款经典游戏,承载着无数人的童年回忆。今天我们将用Python+pygame从零开始实现这个经典游戏!通过本教程,你...
2025-04-25 3704 11980
游戏

python3.x 安装pygame常见报错即处理方法

Pygame 安装报错$ sudopip3install pygameerror: externally-managed-environment× This environment is externally managed╰─>To in...
2025-04-25 2439 14188
游戏

【unity的一些快捷键】

Unity中的快捷键可以帮助你极大地提高工作效率。以下是一些常用的Unity快捷键:文件操作:Ctrl + N:新建项目。Ctrl + S:保存场景或资产。Ctrl + Shift + S:保存所有场景和资产。视图控制:Ctrl + 0:重...
2025-04-25 3348 12304
游戏

【Unity基础】Unity中角色动画的三种实现方式

在Unity中,角色动画有三种不同的实现方式:逐帧动画(Frame-by-Frame)、剪裁动画(Cutout)和骨骼动画(Skeletal),各自适用于不同的场景和需求。以下是它们的核心区别及特点:1. 逐帧动画(Frame-by-Fra...
2025-04-25 3523 9595
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

  • 1

    Python版贪吃蛇保姆级教程

  • 2

    python3.x 安装pygame常见报错即处理方法

  • 3

    【unity的一些快捷键】

  • 4

    【Unity基础】Unity中角色动画的三种实现方式

  • 5

    Unity6000下载地址

  • 6

    10 个pygame经典小游戏

  • 7

    【逆向工程】破解unity的安卓apk包

  • 8

    unity 无法安装6000版本的问题

  • 9

    Pico 4 Enterprise(企业版)与Unity的交互-打包运行及UI交互篇

  • 10

    从零开始打造属于你的Pygame小游戏:轻松入门与高效开发

134
游戏
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top