小游戏
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()

浙公网安备 33010602011771号