小游戏

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。  阅读(62)  评论(0)    收藏  举报