maze_python/maze.py
2025-06-29 19:22:54 +08:00

212 lines
8.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import pygame
from maze_generator import MazeGenerator
from SourceCollector import SourceCollector
from tanxin import *
from simple_save_manager import simple_save_manager
import time
class Maze:
def __init__(self, wall_size, maze_size, file_name):
self.wall_size = wall_size
self.maze_size = maze_size
self.size = int(maze_size / wall_size)
self.file_name = file_name
self.grid = []
self.generater = MazeGenerator(self.size, self.file_name)
self.source_collector = None
self.path_step = 0 # 当前显示到路径的第几步
self.full_path = [] # 完整路径
self.is_path_complete = False # 路径是否完全显示
def generate(self):
seed = int(time.time() * 1000) % (2**32)
self.generater.generate(seed=seed)
self.source_collector = SourceCollector(maze=self.generater.maze)
self.source_collector.run()
self.full_path = self.source_collector.get_path()
self.path_step = 0
self.is_path_complete = False
self.grid = self.generater.maze # 使用原始迷宫数据
print(f"路径长度: {len(self.full_path)}")
def next_path_step(self):
"""显示路径的下一步"""
if self.path_step < len(self.full_path):
self.path_step += 1
self.update_grid_with_path()
return True
return False
def reset_path(self):
"""重置路径显示"""
self.path_step = 0
self.is_path_complete = False
self.grid = self.generater.maze if self.generater.maze else []
def auto_advance_path(self):
"""自动推进路径显示"""
if not self.is_path_complete:
if not self.next_path_step():
self.is_path_complete = True
def update_grid_with_path(self):
"""根据当前步数更新网格显示"""
if not self.full_path or not self.generater.maze:
return
# 从原始迷宫开始
self.grid = [row[:] for row in self.generater.maze] # 深拷贝
# 只显示到当前步数的路径
for idx in range(min(self.path_step, len(self.full_path))):
y, x = self.full_path[idx]
if self.grid[y][x].startswith('s') or self.grid[y][x].startswith('e'):
continue
if self.grid[y][x].startswith('g') or self.grid[y][x].startswith('t'):
self.grid[y][x] = f"{self.grid[y][x]}p{idx}"
continue
self.grid[y][x] = f"p{idx}"
def export_to_csv(self, filename):
"""导出迷宫到CSV文件兼容旧版本"""
self.generater.export_to_csv(filename=filename)
def save_game(self, save_name=None):
"""保存包含路径信息的迷宫到CSV文件"""
if len(self.grid) == 0:
print("没有生成迷宫,无法保存")
return None
return simple_save_manager.save_maze_with_path(self, save_name)
def load_game(self, save_file):
"""从CSV存档文件加载游戏状态"""
load_data = simple_save_manager.load_maze_from_csv(save_file)
if load_data is None:
return False
try:
# 恢复迷宫数据
self.generater.maze = load_data['original_grid']
self.size = len(load_data['original_grid'])
# 恢复路径数据
self.full_path = load_data['path_sequence']
self.path_step = len(self.full_path) # 显示完整路径
self.is_path_complete = True
# 重新创建SourceCollector以便后续操作
self.source_collector = SourceCollector(maze=self.generater.maze)
# 使用包含路径信息的网格作为显示网格
self.grid = load_data['path_grid']
print(f"成功加载游戏状态,路径长度: {len(self.full_path)}")
print(f"当前显示完整路径")
return True
except Exception as e:
print(f"加载游戏状态失败: {str(e)}")
return False
def get_save_list(self):
"""获取所有可用的存档列表"""
return simple_save_manager.get_save_list()
def draw(self, screen, wall_texture, coin_texture, trap_texture):
tile_size = wall_texture.get_width()
if len(self.grid) == 0:
return
for y in range(self.size):
for x in range(self.size):
if self.grid[y][x] == '1':
screen.blit(wall_texture, (x * tile_size, y * tile_size))
continue
if self.grid[y][x].startswith('g'):
screen.blit(coin_texture, (x * tile_size, y * tile_size))
font = pygame.font.SysFont(None, tile_size // 2)
path = self.grid[y][x].rfind('p')
if path == -1:
continue
path = self.grid[y][x][path+1:]
center = (x * tile_size + tile_size // 2, y * tile_size + tile_size // 2)
radius = tile_size // 3
text = font.render(path, True, (255, 255, 255))
text_rect = text.get_rect(center=center)
screen.blit(text, text_rect)
if self.grid[y][x].startswith('t'):
screen.blit(trap_texture, (x * tile_size, y * tile_size))
font = pygame.font.SysFont(None, tile_size // 2)
path = self.grid[y][x].rfind('p')
if path == -1:
continue
path = self.grid[y][x][path+1:]
center = (x * tile_size + tile_size // 2, y * tile_size + tile_size // 2)
radius = tile_size // 3
text = font.render(path, True, (255, 255, 255))
text_rect = text.get_rect(center=center)
screen.blit(text, text_rect)
if self.grid[y][x].startswith('|') or self.grid[y][x].startswith('-'):
font = pygame.font.SysFont(None, tile_size // 2)
num = int(self.grid[y][x][1:])
center = (x * tile_size + tile_size // 2, y * tile_size + tile_size // 2)
radius = tile_size // 3
pygame.draw.circle(screen, (255, 215, 0), center, radius)
if num:
text = font.render(str(num), True, (0, 0, 0))
text_rect = text.get_rect(center=center)
screen.blit(text, text_rect)
continue
if self.grid[y][x].startswith('s'):
font = pygame.font.SysFont(None, tile_size // 2)
text = "s"
center = (x * tile_size + tile_size // 2, y * tile_size + tile_size // 2)
radius = tile_size // 3
pygame.draw.circle(screen, (255, 215, 0), center, radius)
if text:
text = font.render(text, True, (0, 0, 0))
text_rect = text.get_rect(center=center)
screen.blit(text, text_rect)
continue
if self.grid[y][x].startswith('e'):
font = pygame.font.SysFont(None, tile_size // 2)
text = "e"
center = (x * tile_size + tile_size // 2, y * tile_size + tile_size // 2)
radius = tile_size // 3
pygame.draw.circle(screen, (255, 215, 0), center, radius)
if text:
text = font.render(text, True, (0, 0, 0))
text_rect = text.get_rect(center=center)
screen.blit(text, text_rect)
if self.grid[y][x].startswith('p'):
font = pygame.font.SysFont(None, tile_size // 2)
text = self.grid[y][x][1:]
center = (x * tile_size + tile_size // 2, y * tile_size + tile_size // 2)
radius = tile_size // 3
pygame.draw.circle(screen, (255, 215, 0), center, radius)
if text:
text = font.render(text, True, (0, 0, 0))
text_rect = text.get_rect(center=center)
screen.blit(text, text_rect)
pygame.draw.line(screen, (0, 0, 0), (self.maze_size, 0), (self.maze_size, self.maze_size), 5)