import pygame import random # 初始化Pygame pygame.init() # 定义常量 SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 WHITE = (255, 255, 255) RED = (255, 0, 0) GREEN = (0, 255, 0) BLACK = (0, 0, 0) CELL_SIZE = 40 # 迷宫地图 maze = [ "XXXXXXXXXXXXXXXXXXXX", "X X X X X X", "X XXXXX XXX X X X X X", "X X X X X X X X", "X XXX X X X X X X X X", "X X X X X X X X", "X X XXXXXX XXX XXX X X", "X X X X X X", "X XXX X XXXXXXXXX X X", "X X X X X X", "X X X XXXXXXXXX X X X", "X X X X X X", "X X XXX XXXXX X XXX X", "X X X X X X", "X XXXXX XXXXXXXXX X X", "X X X X", "XXXXX XXXXXXXXXXXXX X", "X X X", "XXXXXXXXXXXXXXXXXXXX", ] # 创建游戏窗口 screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption("Cheese Maze") # 定义角色类 class Player(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = pygame.Surface((CELL_SIZE, CELL_SIZE)) self.image.fill(RED) self.rect = self.image.get_rect() self.rect.topleft = (CELL_SIZE, CELL_SIZE) def move(self, dx, dy): if self.is_valid_move(dx, dy): self.rect.x += dx self.rect.y += dy def is_valid_move(self, dx, dy): new_rect = self.rect.move(dx, dy) for y, row in enumerate(maze): for x, cell in enumerate(row): if cell == "X" and new_rect.colliderect(pygame.Rect(x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE)): return False return True # 定义反派类 class Villain(pygame.sprite.Sprite): def __init__(self, player): super().__init__() self.image = pygame.Surface((CELL_SIZE, CELL_SIZE)) self.image.fill(GREEN) self.rect = self.image.get_rect() self.player = player self.generate_random_position() def generate_random_position(self): while True: x = random.randint(1, 18) y = random.randint(1, 13) if maze[y][x] != "X": self.rect.topleft = (x * CELL_SIZE, y * CELL_SIZE) break def move_towards_player(self): dx = self.player.rect.x - self.rect.x dy = self.player.rect.y - self.rect.y if abs(dx) > abs(dy): dx = dx // abs(dx) * CELL_SIZE dy = 0 else: dx = 0 dy = dy // abs(dy) * CELL_SIZE if self.is_valid_move(dx, dy): self.rect.x += dx self.rect.y += dy def is_valid_move(self, dx, dy): new_rect = self.rect.move(dx, dy) for y, row in enumerate(maze): for x, cell in enumerate(row): if cell == "X" and new_rect.colliderect(pygame.Rect(x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE)): return False return True # 定义奶酪类 class Cheese(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = pygame.Surface((CELL_SIZE // 2, CELL_SIZE // 2)) self.image.fill((255, 255, 0)) # 设置奶酪为黄色 self.rect = self.image.get_rect() self.generate_random_position() def generate_random_position(self): while True: x = random.randint(1, 18) y = random.randint(1, 13) if maze[y][x] != "X": self.rect.topleft = (x * CELL_SIZE, y * CELL_SIZE) break # 创建玩家、奶酪和反派组 all_sprites = pygame.sprite.Group() player = Player() all_sprites.add(player) cheeses = pygame.sprite.Group() for _ in range(10): # 创建10个奶酪 cheese = Cheese() all_sprites.add(cheese) cheeses.add(cheese) villain = Villain(player) all_sprites.add(villain) # 游戏循环 running = True clock = pygame.time.Clock() while running: # 事件处理 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 玩家控制 keys = pygame.key.get_pressed() dx, dy = 0, 0 if keys[pygame.K_LEFT]: dx = -CELL_SIZE if keys[pygame.K_RIGHT]: dx = CELL_SIZE if keys[pygame.K_UP]: dy = -CELL_SIZE if keys[pygame.K_DOWN]: dy = CELL_SIZE player.move(dx, dy) # 反派追击玩家 villain.move_towards_player() # 检测反派和玩家的碰撞 if pygame.sprite.collide_rect(player, villain): print("Game Over!") running = False # 绘制迷宫和角色 screen.fill(BLACK) for y, row in enumerate(maze): for x, cell in enumerate(row): if cell == "X": pygame.draw.rect(screen, WHITE, (x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE)) all_sprites.draw(screen) # 刷新屏幕 pygame.display.flip() # 控制帧率 clock.tick(10) # 退出Pygame pygame.quit()