游戏制作

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()

posted @ 2025-06-22 15:59  千树(好困版)  阅读(21)  评论(0)    收藏  举报