文章目录
- 环境准备
- 依赖库
- 实现思路
- 核心模块设计
- 代码框架
- 运行效果
- 优化建议
- 总结
- 通过本框架可实现基础版贪吃蛇游戏,关键点在于:
- 典型问题解决方案:
环境准备
依赖库
主要依赖
- Python 3.6+
- pygame 2.1.2 # 用于图形界面渲染
安装命令
pip install pygame
实现思路
核心模块设计
- 游戏初始化
- 创建游戏窗口
- 设置颜色常量(蛇身/食物/背景)
- 初始化计分系统
- 蛇体控制
# 伪代码示例
def handle_movement():
while True:
监听键盘事件 ← 方向键控制
更新蛇头坐标
维护蛇身长度
- 食物生成
- 随机坐标生成算法
- 碰撞检测避免与蛇体重叠
- 碰撞检测
- 边界碰撞检测
- 自碰撞检测
代码框架
import pygame
import random
import sys
# 游戏设置
SCREEN_WIDTH = 800 # 屏幕宽度
SCREEN_HEIGHT = 600 # 屏幕高度
GRID_SIZE = 20 # 网格大小
GRID_WIDTH = SCREEN_WIDTH // GRID_SIZE # 网格宽度
GRID_HEIGHT = SCREEN_HEIGHT // GRID_SIZE # 网格高度
# 颜色定义
WHITE = (255, 255, 255) # 白色
BLACK = (0, 0, 0) # 黑色
RED = (255, 0, 0) # 红色
GREEN = (0, 255, 0) # 绿色
GRAY = (128, 128, 128) # 灰色
# 方向定义
UP = (0, -1) # 向上
DOWN = (0, 1) # 向下
LEFT = (-1, 0) # 向左
RIGHT = (1, 0) # 向右
class Snake:
def __init__(self):
# 蛇的初始位置在屏幕中央
self.positions = [((SCREEN_WIDTH // 2), (SCREEN_HEIGHT // 2))]
# 随机选择一个初始方向
self.direction = random.choice([UP, DOWN, LEFT, RIGHT])
self.grow = False # 是否增长
self.is_over = False # 游戏是否结束
def get_head_position(self):
# 获取蛇头的位置
return self.positions[0]
def turn(self, point):
# 转向,但不能直接反向
if (point[0] * -1, point[1] * -1) == self.direction:
return
else:
self.direction = point
def move(self):
# 移动蛇的位置
cur = self.get_head_position()
x, y = self.direction
new = (((cur[0] + (x * GRID_SIZE)) % SCREEN_WIDTH), (cur[1] + (y * GRID_SIZE)) % SCREEN_HEIGHT)
if new in self.positions[2:]:
# 如果蛇头碰到身体,游戏结束
self.game_over()
else:
self.positions.insert(0, new)
if not self.grow:
self.positions.pop()
else:
self.grow = False
def game_over(self):
# 游戏结束
self.is_over = True
def reset(self):
# 重置蛇的位置和方向
self.positions = [((SCREEN_WIDTH // 2), (SCREEN_HEIGHT // 2))]
self.direction = random.choice([UP, DOWN, LEFT, RIGHT])
self.grow = False
def grow_snake(self):
# 让蛇增长
self.grow = True
def draw(self, surface):
# 绘制蛇
for p in self.positions:
r = pygame.Rect((p[0], p[1]), (GRID_SIZE, GRID_SIZE))
pygame.draw.rect(surface, GREEN, r)
pygame.draw.rect(surface, BLACK, r, 1)
class Food:
def __init__(self):
# 初始化食物位置和颜色
self.position = (0, 0)
self.color = RED
self.randomize_position()
def randomize_position(self):
# 随机生成食物位置
self.position = (random.randint(0, GRID_WIDTH - 1) * GRID_SIZE, random.randint(0, GRID_HEIGHT - 1) * GRID_SIZE)
def draw(self, surface):
# 绘制食物
r = pygame.Rect((self.position[0], self.position[1]), (GRID_SIZE, GRID_SIZE))
pygame.draw.rect(surface, self.color, r)
pygame.draw.rect(surface, BLACK, r, 1)
def main():
pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), 0, 32)
surface = pygame.Surface(screen.get_size())
surface = surface.convert()
snake = Snake()
food = Food()
myfont = pygame.font.SysFont("monospace", 16)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
snake.turn(UP)
elif event.key == pygame.K_DOWN:
snake.turn(DOWN)
elif event.key == pygame.K_LEFT:
snake.turn(LEFT)
elif event.key == pygame.K_RIGHT:
snake.turn(RIGHT)
snake.move()
if snake.is_over:
break
if snake.get_head_position() == food.position:
snake.grow_snake()
food.randomize_position()
# snake.grow_snake()
surface.fill(WHITE)
snake.draw(surface)
food.draw(surface)
screen.blit(surface, (0, 0))
text = myfont.render("Score {0}".format(len(snake.positions)), 1, BLACK)
screen.blit(text, (5, 10))
pygame.display.update()
clock.tick(20)
myfont = pygame.font.SysFont("monospace", 50)
myfont.set_bold(True)
myfont.set_italic(True)
text = myfont.render("Game Over!", 1, BLACK, GRAY)
screen.blit(text, (300, 300))
pygame.display.update()
pygame.time.wait(2000)
if __name__ == "__main__":
main()
运行效果
优化建议
难度系统:通过得分逐步提升移动速度
音效增强:添加进食音效和背景音乐
存档功能:记录最高分数到本地文件
皮肤系统:允许自定义蛇体外观
总结
通过本框架可实现基础版贪吃蛇游戏,关键点在于:
- 合理设计游戏循环时序
- 精确的碰撞检测实现
- 高效的画面刷新机制
完整实现代码约120-150行,建议在以下环境测试:
操作系统:Windows/MacOS/Linux
显示器分辨率:1920x1080(向下兼容)
开发提示:调试时建议先关闭画面渲染,使用控制台打印坐标进行逻辑验证
典型问题解决方案:
# 常见问题1:方向键反方向无效处理
```python
if event.key == pygame.K_UP and current_direction != 'DOWN':
direction = 'UP'
#其他方向同理
#...