欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 文化 > 使用Python实现经典贪吃蛇游戏教程

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

2025/3/16 21:27:52 来源:https://blog.csdn.net/m0_37825219/article/details/146275663  浏览:    关键词:使用Python实现经典贪吃蛇游戏教程

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

在这里插入图片描述

一、环境准备

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

二、游戏功能说明

  1. 基本游戏机制

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

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

三、代码结构解析

1. 游戏初始化

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

2. Snake类核心方法

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

3. 游戏主循环

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

4. 图形绘制

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

四、关键算法解析

1. 方向控制机制

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

2. 食物生成算法

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

3. 碰撞检测

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

五、运行与调试

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

六、扩展建议

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

七、完整代码

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帧/秒
  • 分数显示在窗口左上角

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词