代码如下:
import pygame
import sys
import random
import datetime
# 初始化pygame
pygame.init()
# 游戏窗口大小
WIDTH, HEIGHT = 1000, 600
GRID_SIZE = 20
GRID_WIDTH = WIDTH // GRID_SIZE
GRID_HEIGHT = HEIGHT // GRID_SIZE
# 颜色定义
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
# 获取当前日期和时间
def get_date_time():
now = datetime.datetime.now()
return now.strftime("%Y-%m-%d %H:%M:%S")
# 贪吃蛇类
class Snake:
def __init__(self):
self.body = [(GRID_WIDTH // 2, GRID_HEIGHT // 2)]
self.direction = (0, 1)
self.head_image = pygame.image.load("snake_head.png")
self.head_image = pygame.transform.scale(self.head_image, (GRID_SIZE, GRID_SIZE))
self.body_image = pygame.image.load("snake_body.png")
self.body_image = pygame.transform.scale(self.body_image, (GRID_SIZE, GRID_SIZE))
def move(self):
head = self.body[0]
x, y = head
dx, dy = self.direction
new_head = ((x + dx) % GRID_WIDTH, (y + dy) % GRID_HEIGHT)
self.body.insert(0, new_head)
self.body.pop()
def grow(self):
head = self.body[0]
x, y = head
dx, dy = self.direction
new_head = ((x + dx) % GRID_WIDTH, (y + dy) % GRID_HEIGHT)
self.body.insert(0, new_head)
def change_direction(self, direction):
self.direction = direction
# 食物类
class Food:
def __init__(self):
self.position = (random.randint(0, GRID_WIDTH - 1), random.randint(0, GRID_HEIGHT - 1))
self.image = pygame.image.load("food.png")
self.image = pygame.transform.scale(self.image, (GRID_SIZE, GRID_SIZE))
def respawn(self):
self.position = (random.randint(0, GRID_WIDTH - 1), random.randint(0, GRID_HEIGHT - 1))
# 游戏类
class Game:
def __init__(self, speed):
self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
self.clock = pygame.time.Clock()
self.snake = Snake()
self.food = Food()
self.score = 0
self.game_over = False
self.font = pygame.font.Font("simhei.ttf", 25)
self.game_over_font = pygame.font.Font("simhei.ttf", 74) # 游戏结束字体
self.speed = speed
def handle_events(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP and self.snake.direction != (0, 1):
self.snake.change_direction((0, -1))
elif event.key == pygame.K_DOWN and self.snake.direction != (0, -1):
self.snake.change_direction((0, 1))
elif event.key == pygame.K_LEFT and self.snake.direction != (1, 0):
self.snake.change_direction((-1, 0))
elif event.key == pygame.K_RIGHT and self.snake.direction != (-1, 0):
self.snake.change_direction((1, 0))
def update(self):
self.snake.move()
if self.snake.body[0] == self.food.position:
self.snake.grow()
self.food.respawn()
self.score += 1
if self.snake.body[0] in self.snake.body[1:]:
self.game_over = True
def draw(self):
# 加载并绘制背景图片
background_image = pygame.image.load("background.jpg")
background_image = pygame.transform.scale(background_image, (WIDTH, HEIGHT))
self.screen.blit(background_image, (0, 0))
# 绘制贪吃蛇
for i, segment in enumerate(self.snake.body):
position = (segment[0] * GRID_SIZE, segment[1] * GRID_SIZE)
if i == 0:
self.screen.blit(self.snake.head_image, position)
else:
self.screen.blit(self.snake.body_image, position)
# 绘制食物
food_position = (self.food.position[0] * GRID_SIZE, self.food.position[1] * GRID_SIZE)
self.screen.blit(self.food.image, food_position)
# 绘制得分
score_text = self.font.render(f"得分: {self.score}", True, WHITE)
self.screen.blit(score_text, (10, 10))
# 绘制班级姓名和学号
class_text = self.font.render("XX专业X班", True, WHITE)
self.screen.blit(class_text, (WIDTH - 190, 5))
name_text = self.font.render("姓名", True, WHITE)
self.screen.blit(name_text, (WIDTH - 190, 35))
id_text = self.font.render("学号", True, WHITE)
self.screen.blit(id_text, (WIDTH - 190, 65))
# 绘制日期和时间
date_time_text = self.font.render(get_date_time(), True, WHITE)
self.screen.blit(date_time_text, (WIDTH - 250, HEIGHT - 30))
pygame.display.flip()
def draw_game_over(self):
self.screen.fill((0, 0, 0))
game_over_text = self.game_over_font.render("游戏结束", True, RED)
score_text = self.game_over_font.render(f"得分: {self.score}", True, WHITE)
game_over_rect = game_over_text.get_rect(center=(WIDTH / 2, HEIGHT / 2 - 50))
score_rect = score_text.get_rect(center=(WIDTH / 2, HEIGHT / 2 + 50))
self.screen.blit(game_over_text, game_over_rect)
self.screen.blit(score_text, score_rect)
pygame.display.flip()
def run(self):
while not self.game_over:
self.handle_events()
self.update()
self.draw()
self.clock.tick(self.speed)
while True:
self.handle_events()
self.draw_game_over()
# 难度选择菜单类
class Menu:
def __init__(self):
self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
self.font = pygame.font.Font("simhei.ttf", 74) # 使用黑体,大小为74
self.prompt_font = pygame.font.Font("simhei.ttf", 48) # 提示字体
self.options = ["简单", "中等", "困难"]
self.selected_option = 0
self.background_image = pygame.image.load("menu_background.jpg")
self.background_image = pygame.transform.scale(self.background_image, (WIDTH, HEIGHT))
def draw(self):
self.screen.blit(self.background_image, (0, 0))
prompt_text = self.prompt_font.render("请选择挑战的难度(通过方向键和回车)", True, WHITE)
prompt_rect = prompt_text.get_rect(center=(WIDTH / 2, HEIGHT / 2 - 150))
self.screen.blit(prompt_text, prompt_rect)
for i, option in enumerate(self.options):
color = GREEN if i == self.selected_option else WHITE
text = self.font.render(option, True, color)
text_rect = text.get_rect(center=(WIDTH / 2, HEIGHT / 2 + i * 100))
self.screen.blit(text, text_rect)
pygame.display.flip()
def handle_events(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
self.selected_option = (self.selected_option - 1) % len(self.options)
elif event.key == pygame.K_DOWN:
self.selected_option = (self.selected_option + 1) % len(self.options)
elif event.key == pygame.K_RETURN:
return self.selected_option
return None
def run(self):
while True:
selected_option = self.handle_events()
if selected_option is not None:
return selected_option
self.draw()
if __name__ == "__main__":
menu = Menu()
selected_option = menu.run()
# 根据选择的难度设置速度
if selected_option == 0:
speed = 5 # 简单
elif selected_option == 1:
speed = 10 # 中等
else:
speed = 15 # 困难
game = Game(speed)
game.run()
运行如下: