游戏制作
import pygame
import random
import time
初始化 Pygame
pygame.init()
游戏窗口设置
WIDTH, HEIGHT = 600, 400
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("贪吃蛇小游戏")
颜色定义(RGB)
BLACK = (0, 0, 0) # 背景色
WHITE = (255, 255, 255) # 文字、边界色
RED = (255, 0, 0) # 食物颜色
GREEN = (0, 255, 0) # 蛇身体颜色
基础参数设置
SNAKE_BLOCK = 10 # 蛇块大小(像素)
SNAKE_SPEED = 15 # 蛇移动速度(帧率)
字体设置(用于显示得分、游戏结束提示)
font_style = pygame.font.SysFont(None, 30) # 得分字体
game_over_font = pygame.font.SysFont(None, 50) # 游戏结束字体
-------------------------- 函数定义 --------------------------
def display_score(score):
"""显示当前得分"""
text = font_style.render(f"得分: {score}", True, WHITE)
screen.blit(text, (10, 10)) # 文字显示在左上角
def draw_snake(snake_block, snake_list):
"""绘制蛇身体"""
for x, y in snake_list:
pygame.draw.rect(screen, GREEN, (x, y, snake_block, snake_block))
def show_game_over(score):
"""显示游戏结束提示"""
text = game_over_font.render(f"游戏结束!最终得分: {score}", True, RED)
screen.blit(text, (WIDTH//2 - 160, HEIGHT//2 - 25)) # 居中显示
pygame.display.update()
time.sleep(3) # 显示 3 秒后退出
def main():
"""游戏主逻辑"""
# 初始化蛇的状态
snake_list = [] # 存储蛇身体的坐标
snake_length = 1 # 初始长度为 1
snake_head = [WIDTH//2, HEIGHT//2] # 蛇头初始位置(窗口中心)
snake_list.append(snake_head)
# 初始化食物状态
food_pos = [
random.randrange(1, (WIDTH // SNAKE_BLOCK)) * SNAKE_BLOCK,
random.randrange(1, (HEIGHT // SNAKE_BLOCK)) * SNAKE_BLOCK
]
food_spawn = True # 标记食物是否已生成
# 初始化游戏参数
direction = "RIGHT" # 初始移动方向
game_over = False # 游戏结束标记
score = 0 # 得分
# 游戏主循环
while not game_over:
# ---------------- 事件处理 ---------------- #
for event in pygame.event.get():
if event.type == pygame.QUIT: # 点击关闭窗口
game_over = True
elif event.type == pygame.KEYDOWN: # 键盘按键
if event.key == pygame.K_UP and direction != "DOWN":
direction = "UP"
elif event.key == pygame.K_DOWN and direction != "UP":
direction = "DOWN"
elif event.key == pygame.K_LEFT and direction != "RIGHT":
direction = "LEFT"
elif event.key == pygame.K_RIGHT and direction != "LEFT":
direction = "RIGHT"
# ---------------- 蛇移动逻辑 ---------------- #
# 根据方向更新蛇头坐标
if direction == "UP":
snake_head[1] -= SNAKE_BLOCK
elif direction == "DOWN":
snake_head[1] += SNAKE_BLOCK
elif direction == "LEFT":
snake_head[0] -= SNAKE_BLOCK
elif direction == "RIGHT":
snake_head[0] += SNAKE_BLOCK
# 将新蛇头加入身体
snake_list.insert(0, list(snake_head))
# ---------------- 碰撞检测 ---------------- #
# 1. 检测是否吃到食物
if (snake_head[0] == food_pos[0] and
snake_head[1] == food_pos[1]):
score += 10 # 得分增加
food_spawn = False # 标记食物需重新生成
snake_length += 1 # 蛇长度增加
else:
# 没吃到食物则删除尾部,保持长度不变
snake_list.pop()
# 2. 检测是否生成新食物
if not food_spawn:
food_pos = [
random.randrange(1, (WIDTH // SNAKE_BLOCK)) * SNAKE_BLOCK,
random.randrange(1, (HEIGHT // SNAKE_BLOCK)) * SNAKE_BLOCK
]
food_spawn = True
# 3. 检测是否撞墙(边界碰撞)
if (snake_head[0] < 0 or snake_head[0] >= WIDTH or
snake_head[1] < 0 or snake_head[1] >= HEIGHT):
game_over = True
# 4. 检测是否撞到自己(身体碰撞)
for segment in snake_list[1:]: # 遍历身体(除蛇头)
if snake_head[0] == segment[0] and snake_head[1] == segment[1]:
game_over = True
# ---------------- 画面更新 ---------------- #
screen.fill(BLACK) # 填充背景色
draw_snake(SNAKE_BLOCK, snake_list) # 绘制蛇
pygame.draw.circle(screen, RED, (food_pos[0] + SNAKE_BLOCK//2, food_pos[1] + SNAKE_BLOCK//2), SNAKE_BLOCK//2) # 绘制食物
display_score(score) # 显示得分
pygame.display.update() # 更新画面
# 控制游戏帧率(蛇移动速度)
pygame.time.Clock().tick(SNAKE_SPEED)
# 游戏结束处理
show_game_over(score)
pygame.quit() # 退出 Pygame
quit() # 退出程序
-------------------------- 启动游戏 --------------------------
if name == "main":
main()