小游戏

import pygame
import random
import sys
import os

初始化pygame

pygame.init()

屏幕设置

WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("贪吃蛇游戏 - 完整版")

颜色定义

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GRAY = (50, 50, 50) # 网格线颜色
SNAKE_HEAD_COLOR = (255, 0, 0) # 红色蛇头
SNAKE_BODY_COLOR = (0, 200, 0) # 深绿色蛇身
FOOD_COLOR = (0, 100, 255) # 亮蓝色食物
OBSTACLE_COLOR = (255, 100, 0) # 橙色障碍物

贪吃蛇类

class Snake:
def init(self):
self.size = 20
self.positions = [[WIDTH//2, HEIGHT//2]] # 初始位置在屏幕中央
self.direction = "RIGHT"
self.length = 1
self.speed = 10
self.head_color = SNAKE_HEAD_COLOR
self.body_color = SNAKE_BODY_COLOR

def change_direction(self, new_dir):
    if new_dir == "RIGHT" and not self.direction == "LEFT":
        self.direction = "RIGHT"
    if new_dir == "LEFT" and not self.direction == "RIGHT":
        self.direction = "LEFT"
    if new_dir == "UP" and not self.direction == "DOWN":
        self.direction = "UP"
    if new_dir == "DOWN" and not self.direction == "UP":
        self.direction = "DOWN"

def move(self):
    head = self.positions[0].copy()
    
    if self.direction == "RIGHT":
        head[0] += self.size
    elif self.direction == "LEFT":
        head[0] -= self.size
    elif self.direction == "UP":
        head[1] -= self.size
    elif self.direction == "DOWN":
        head[1] += self.size
    
    # 边界检查
    if head[0] >= WIDTH or head[0] < 0 or head[1] >= HEIGHT or head[1] < 0:
        return False
    
    # 检查自撞
    if head in self.positions[1:]:
        return False
    
    self.positions.insert(0, head)
    if len(self.positions) > self.length:
        self.positions.pop()
    
    return True

def grow(self):
    self.length += 1

def draw(self, surface):
    for i, pos in enumerate(self.positions):
        if i == 0:  # 头部
            pygame.draw.rect(surface, self.head_color, (pos[0], pos[1], self.size, self.size))
        else:  # 身体
            pygame.draw.rect(surface, self.body_color, (pos[0], pos[1], self.size, self.size))

食物类

class Food:
def init(self):
self.size = 20
self.position = [random.randrange(0, WIDTH-self.size, self.size),
random.randrange(0, HEIGHT-self.size, self.size)]
self.color = FOOD_COLOR

def draw(self, surface):
    pygame.draw.rect(surface, self.color, (self.position[0], self.position[1], self.size, self.size))

def respawn(self):
    self.position = [random.randrange(0, WIDTH-self.size, self.size), 
                    random.randrange(0, HEIGHT-self.size, self.size)]

障碍物类

class Obstacle:
def init(self):
self.size = 20
self.position = [random.randrange(0, WIDTH-self.size, self.size),
random.randrange(0, HEIGHT-self.size, self.size)]
self.direction = random.choice(["horizontal", "vertical"])
self.speed = random.choice([-2, -1, 1, 2]) # 随机速度和方向
self.color = OBSTACLE_COLOR

def move(self):
    if self.direction == "horizontal":
        self.position[0] += self.speed
        if self.position[0] <= 0 or self.position[0] >= WIDTH - self.size:
            self.speed = -self.speed  # 碰到边界反弹
    else:
        self.position[1] += self.speed
        if self.position[1] <= 0 or self.position[1] >= HEIGHT - self.size:
            self.speed = -self.speed

def draw(self, surface):
    pygame.draw.rect(surface, self.color, (self.position[0], self.position[1], self.size, self.size))

绘制网格线

def draw_grid():
for x in range(0, WIDTH, 20):
pygame.draw.line(screen, GRAY, (x, 0), (x, HEIGHT))
for y in range(0, HEIGHT, 20):
pygame.draw.line(screen, GRAY, (0, y), (WIDTH, y))

游戏结束显示

def show_game_over(score):
screen.fill(BLACK)

# 游戏结束标题
title_font = pygame.font.SysFont('Microsoft YaHei', 50, bold=True)
title_text = title_font.render("游戏结束", True, (255, 100, 100))

# 分数显示
score_font = pygame.font.SysFont('Microsoft YaHei', 35)
score_text = score_font.render(f"最终得分: {score}", True, WHITE)

# 选项提示
option_font = pygame.font.SysFont('Microsoft YaHei', 30)


# 绘制到屏幕
screen.blit(title_text, (WIDTH//2 - title_text.get_width()//2, HEIGHT//2 - 120))
screen.blit(score_text, (WIDTH//2 - score_text.get_width()//2, HEIGHT//2 - 50))

pygame.display.update()

游戏初始化

snake = Snake()
food = Food()
obstacles = [Obstacle() for _ in range(5)] # 初始5个障碍物
game_over = False
clock = pygame.time.Clock()
font = pygame.font.SysFont('Microsoft YaHei', 36)

游戏主循环

running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

    if event.type == pygame.KEYDOWN:
        if not game_over:
            if event.key == pygame.K_UP:
                snake.change_direction("UP")
            elif event.key == pygame.K_DOWN:
                snake.change_direction("DOWN")
            elif event.key == pygame.K_LEFT:
                snake.change_direction("LEFT")
            elif event.key == pygame.K_RIGHT:
                snake.change_direction("RIGHT")
        else:
            if event.key == pygame.K_r:
                # 重新开始游戏
                snake = Snake()
                food = Food()
                obstacles = [Obstacle() for _ in range(5)]
                game_over = False
            elif event.key == pygame.K_q:
                running = False

if not game_over:
    # 移动蛇
    if not snake.move():
        game_over = True
    
    # 移动障碍物
    for obstacle in obstacles:
        obstacle.move()
    
    # 检查是否吃到食物
    if (snake.positions[0][0] < food.position[0] + food.size and
        snake.positions[0][0] + snake.size > food.position[0] and
        snake.positions[0][1] < food.position[1] + food.size and
        snake.positions[0][1] + snake.size > food.position[1]):
        snake.grow()
        food.respawn()
        # 每吃3个食物增加一个障碍物
        if snake.length % 3 == 0 and len(obstacles) < 15:  # 最多15个障碍物
            obstacles.append(Obstacle())
    
    # 检查是否撞到障碍物
    for obstacle in obstacles:
        if (snake.positions[0][0] < obstacle.position[0] + obstacle.size and
            snake.positions[0][0] + snake.size > obstacle.position[0] and
            snake.positions[0][1] < obstacle.position[1] + obstacle.size and
            snake.positions[0][1] + snake.size > obstacle.position[1]):
            game_over = True
            break
    
    # 绘制
    screen.fill(BLACK)
    draw_grid()  # 绘制网格线
    snake.draw(screen)
    food.draw(screen)
    for obstacle in obstacles:
        obstacle.draw(screen)
    
    # 显示分数
    score_text = font.render(f"分数: {snake.length-1}", True, WHITE)
    screen.blit(score_text, (10, 10))
    
    pygame.display.update()
else:
    show_game_over(snake.length-1)

clock.tick(10)

pygame.quit()
sys.exit()

posted @ 2025-06-21 18:43  Neflibata。  阅读(23)  评论(0)    收藏  举报