212 lines
8.5 KiB
Python
212 lines
8.5 KiB
Python
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)
|
||
|