Compare commits

...

2 Commits

Author SHA1 Message Date
fba062598e Merge branch 'main' of git.gangary.cn:gary/maze_python 2025-06-30 14:58:47 +08:00
b307f400f1 更改存档界面大小 2025-06-30 14:58:44 +08:00
5 changed files with 459 additions and 2 deletions

View File

@ -65,5 +65,5 @@ def get_button_positions(maze_display_size=MAZE_SIZE):
'history_progress_text': (control_panel_x, 350),
'hint_text': (control_panel_x, 380),
'shortcut_text': (control_panel_x, 410),
'save_list_area': (control_panel_x, 440, 400, 200) # x, y, width, height
'save_list_area': (control_panel_x, 440, 400, 330) # x, y, width, height - 增加高度到330
}

View File

@ -11,7 +11,7 @@ class SaveLoadUI:
self.save_list = []
self.selected_save = -1
self.scroll_offset = 0
self.max_visible_saves = 8
self.max_visible_saves = 10 # 增加到10条
# 双击检测
self.last_click_time = 0

View File

@ -0,0 +1,109 @@
#!/usr/bin/env python3
"""测试存档界面显示10条存档的能力"""
import pygame
import sys
import os
# 添加项目根目录到路径
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from config import *
from save_ui import SaveLoadUI
from maze import Maze
def test_10_saves_display():
"""测试显示10条存档"""
print("=== 测试存档界面10条存档显示能力 ===")
# 初始化pygame
pygame.init()
screen = pygame.display.set_mode((UI_WIDTH, UI_HEIGHT))
pygame.display.set_caption("测试10条存档显示")
font = pygame.font.Font(FONT_FILE, FONT_SIZE)
# 创建对象
maze = Maze(wall_size=20, maze_size=200, file_name="test")
save_ui = SaveLoadUI(font)
# 检查max_visible_saves设置
print(f"max_visible_saves设置: {save_ui.max_visible_saves}")
# 模拟10条存档数据
mock_saves = []
for i in range(10):
mock_saves.append({
'name': f'test_save_{i+1:02d}.json',
'path': f'saves/test_save_{i+1:02d}.json',
'save_time': f'2024-01-{i+1:02d} 10:00:00',
'size': '5x5'
})
# 直接设置存档列表
save_ui.save_list = mock_saves
save_ui.show_save_list = True
print(f"模拟存档数量: {len(mock_saves)}")
# 计算显示参数
button_positions = get_button_positions()
list_area = button_positions['save_list_area']
print(f"存档列表区域: x={list_area[0]}, y={list_area[1]}, w={list_area[2]}, h={list_area[3]}")
# 计算可显示的存档数量
# 标题区域: 30像素
# 操作提示区域: 25像素
# 剩余区域高度: 330 - 30 - 25 = 275像素
# 每个存档项: 25像素
available_height = list_area[3] - 55 # 55 = 30(标题) + 25(提示)
max_displayable = available_height // 25
print(f"可用显示高度: {available_height}像素")
print(f"理论最大显示数量: {max_displayable}")
print(f"实际设置显示数量: {save_ui.max_visible_saves}")
# 测试显示
clock = pygame.time.Clock()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
running = False
elif event.key == pygame.K_UP:
if save_ui.selected_save > 0:
save_ui.selected_save -= 1
print(f"选中存档: {save_ui.selected_save + 1}")
elif event.key == pygame.K_DOWN:
if save_ui.selected_save < len(save_ui.save_list) - 1:
save_ui.selected_save += 1
print(f"选中存档: {save_ui.selected_save + 1}")
# 绘制
screen.fill(COLOR_WHITE)
save_ui.draw(screen)
# 绘制测试信息
info_text = [
f"存档数量: {len(save_ui.save_list)}",
f"显示设置: {save_ui.max_visible_saves}",
f"当前选中: {save_ui.selected_save + 1}",
"按↑↓键选择存档ESC退出"
]
for i, text in enumerate(info_text):
text_surface = font.render(text, True, COLOR_BLACK)
screen.blit(text_surface, (10, 10 + i * 30))
pygame.display.flip()
clock.tick(60)
pygame.quit()
print("测试完成")
if __name__ == "__main__":
test_10_saves_display()

View File

@ -0,0 +1,152 @@
#!/usr/bin/env python3
"""
测试存档界面显示数量修改
验证能否显示10条存档记录
"""
import sys
import os
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from simple_save_manager import simple_save_manager
import json
from datetime import datetime
def create_test_saves():
"""创建测试存档文件"""
print("=== 创建测试存档文件 ===")
# 确保saves目录存在
if not os.path.exists("saves"):
os.makedirs("saves")
# 创建简单的测试迷宫数据
test_maze_data = {
"maze": [
["#", "#", "#", "#", "#"],
["#", "S", " ", " ", "#"],
["#", " ", "#", " ", "#"],
["#", " ", " ", "E", "#"],
["#", "#", "#", "#", "#"]
],
"metadata": {
"name": "测试迷宫",
"test": True
}
}
# 创建12个测试存档超过10个来测试显示限制
for i in range(1, 13):
filename = f"saves/test_save_{i:02d}.json"
# 修改迷宫名称
test_data = test_maze_data.copy()
test_data["metadata"] = test_maze_data["metadata"].copy()
test_data["metadata"]["name"] = f"测试迷宫_{i:02d}"
test_data["metadata"]["save_time"] = datetime.now().isoformat()
with open(filename, 'w', encoding='utf-8') as f:
json.dump(test_data, f, indent=2, ensure_ascii=False)
print(f"创建: {filename}")
print(f"✅ 创建了12个测试存档文件")
def check_save_list():
"""检查存档列表"""
print("\n=== 检查存档列表 ===")
save_list = simple_save_manager.get_save_list()
print(f"找到存档数量: {len(save_list)}")
for i, save_info in enumerate(save_list):
print(f"{i+1:2d}. {save_info['name']} ({save_info['format']})")
return len(save_list)
def calculate_display_capacity():
"""计算显示容量"""
print("\n=== 计算显示容量 ===")
from config import get_button_positions
positions = get_button_positions()
save_area = positions['save_list_area']
print(f"存档区域尺寸: {save_area[2]}x{save_area[3]} (宽x高)")
# 计算可用高度
title_height = 25
hint_height = 25
start_offset = 55 # 实际开始位置偏移
available_height = save_area[3] - start_offset
item_height = 25
max_items = available_height // item_height
print(f"标题和提示占用: {start_offset}像素")
print(f"可用高度: {available_height}像素")
print(f"每项高度: {item_height}像素")
print(f"理论最大显示: {max_items}")
return max_items
def test_ui_layout():
"""测试UI布局说明"""
print("\n=== UI测试说明 ===")
print()
print("现在可以测试存档界面显示效果:")
print("1. 运行主程序: python main.py")
print("2. 按 Ctrl+L 打开存档界面")
print("3. 验证能否看到10条存档如果存档数量足够")
print("4. 使用↑↓键测试所有存档是否可选择")
print()
print("预期结果:")
print("- 存档界面高度增加到300像素")
print("- 最多可显示约9-10条存档")
print("- 界面不会截断或重叠")
print("- 所有存档都可以正常选择和加载")
print()
def cleanup_test_files():
"""清理测试文件"""
response = input("是否删除测试存档文件? (y/n): ")
if response.lower() == 'y':
print("\n=== 清理测试文件 ===")
for i in range(1, 13):
filename = f"saves/test_save_{i:02d}.json"
if os.path.exists(filename):
os.remove(filename)
print(f"删除: {filename}")
print("✅ 测试文件清理完成")
def main():
print("开始测试存档界面显示数量...")
# 计算理论容量
max_capacity = calculate_display_capacity()
# 创建测试文件
create_test_saves()
# 检查存档列表
save_count = check_save_list()
print(f"\n=== 结果分析 ===")
print(f"理论最大显示容量: {max_capacity}")
print(f"实际存档数量: {save_count}")
if max_capacity >= 10:
print("✅ 界面尺寸足够显示10条存档")
else:
print(f"❌ 界面尺寸只能显示{max_capacity}条存档")
# UI测试说明
test_ui_layout()
# 可选清理
cleanup_test_files()
if __name__ == "__main__":
main()

View File

@ -0,0 +1,196 @@
#!/usr/bin/env python3
"""测试存档界面完整功能显示10条存档交互功能等"""
import pygame
import sys
import os
import json
# 添加项目根目录到路径
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from config import *
from save_ui import SaveLoadUI
from maze import Maze
def create_test_saves():
"""创建10个测试存档文件"""
print("创建测试存档文件...")
# 确保saves目录存在
os.makedirs("saves", exist_ok=True)
# 创建10个不同的测试存档
test_mazes = [
{"rows": 5, "cols": 5, "name": "小迷宫5x5"},
{"rows": 7, "cols": 7, "name": "中迷宫7x7"},
{"rows": 10, "cols": 10, "name": "大迷宫10x10"},
{"rows": 6, "cols": 8, "name": "矩形迷宫6x8"},
{"rows": 8, "cols": 6, "name": "矩形迷宫8x6"},
{"rows": 12, "cols": 12, "name": "超大迷宫12x12"},
{"rows": 5, "cols": 10, "name": "长条迷宫5x10"},
{"rows": 9, "cols": 9, "name": "正方迷宫9x9"},
{"rows": 15, "cols": 15, "name": "巨型迷宫15x15"},
{"rows": 7, "cols": 5, "name": "高窄迷宫7x5"}
]
created_files = []
for i, maze_info in enumerate(test_mazes):
filename = f"test_save_{i+1:02d}.json"
filepath = f"saves/{filename}"
# 创建简单的迷宫数据
rows, cols = maze_info["rows"], maze_info["cols"]
maze_data = []
for r in range(rows):
row = []
for c in range(cols):
if r == 0 or r == rows-1 or c == 0 or c == cols-1:
row.append(1) # 边界是墙
elif r == 1 and c == 1:
row.append(2) # 起点
elif r == rows-2 and c == cols-2:
row.append(3) # 终点
elif (r + c) % 3 == 0:
row.append(1) # 一些墙
else:
row.append(0) # 通路
maze_data.append(row)
# 创建路径数据
path_data = [
{"x": 1, "y": 1, "step": 0},
{"x": 2, "y": 1, "step": 1},
{"x": cols-2, "y": rows-2, "step": 2}
]
# 保存数据
save_data = {
"maze_info": {
"name": maze_info["name"],
"size": f"{rows}x{cols}",
"save_time": f"2024-01-{i+1:02d} {10+i}:00:00"
},
"maze_data": maze_data,
"path_data": path_data,
"game_state": {
"path_step": 0,
"is_path_complete": False
}
}
with open(filepath, 'w', encoding='utf-8') as f:
json.dump(save_data, f, indent=2, ensure_ascii=False)
created_files.append(filepath)
print(f"创建存档: {filename} ({maze_info['name']})")
print(f"总共创建了 {len(created_files)} 个测试存档文件")
return created_files
def test_save_ui_complete():
"""测试存档界面完整功能"""
print("=== 测试存档界面完整功能 ===")
# 创建测试存档
test_files = create_test_saves()
# 初始化pygame
pygame.init()
screen = pygame.display.set_mode((UI_WIDTH, UI_HEIGHT))
pygame.display.set_caption("存档界面完整测试")
font = pygame.font.Font(FONT_FILE, FONT_SIZE)
# 创建对象
maze = Maze(wall_size=20, maze_size=200, file_name="test")
save_ui = SaveLoadUI(font)
# 更新存档列表
save_ui.update_save_list(maze)
save_ui.show_save_list = True
print(f"检测到存档数量: {len(save_ui.save_list)}")
print(f"max_visible_saves设置: {save_ui.max_visible_saves}")
# 显示前10个存档的信息
for i, save_info in enumerate(save_ui.save_list[:10]):
print(f"{i+1:2d}. {save_info['name']} - {save_info['save_time']}")
clock = pygame.time.Clock()
running = True
print("\n交互测试:")
print("- ↑↓键: 选择存档")
print("- 回车键: 加载选中存档")
print("- Delete键: 删除选中存档")
print("- N键: 新建存档")
print("- ESC键: 退出")
print("- 鼠标: 点击选择,双击加载")
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
running = False
else:
# 处理存档界面事件
result = save_ui.handle_event(event, maze)
if result:
print(f"操作结果: {result}")
if result == "load_success":
print(f"成功加载存档,迷宫尺寸: {len(maze.grid)}x{len(maze.grid[0])}")
elif result == "delete_success":
print("存档删除成功")
save_ui.update_save_list(maze)
elif result == "save_success":
print("存档保存成功")
elif event.type == pygame.MOUSEBUTTONDOWN:
result = save_ui.handle_event(event, maze)
if result:
print(f"鼠标操作结果: {result}")
# 绘制
screen.fill(COLOR_WHITE)
# 绘制迷宫(如果已加载)
if hasattr(maze, 'grid') and maze.grid:
maze.draw(screen)
# 绘制存档界面
save_ui.draw(screen)
# 绘制状态信息
status_texts = [
f"存档总数: {len(save_ui.save_list)}",
f"显示设置: 最多{save_ui.max_visible_saves}",
f"当前选中: {save_ui.selected_save + 1 if save_ui.selected_save >= 0 else ''}",
f"输入模式: {'' if save_ui.input_active else ''}"
]
for i, text in enumerate(status_texts):
text_surface = font.render(text, True, COLOR_BLACK)
screen.blit(text_surface, (10, 10 + i * 25))
pygame.display.flip()
clock.tick(60)
pygame.quit()
# 清理测试文件
print("\n清理测试文件...")
for filepath in test_files:
try:
os.remove(filepath)
print(f"删除: {filepath}")
except FileNotFoundError:
pass
print("测试完成")
if __name__ == "__main__":
test_save_ui_complete()