From b307f400f16a8cb60cccc6cee287e37f0d13ddfb Mon Sep 17 00:00:00 2001 From: Gary Gan Date: Mon, 30 Jun 2025 14:58:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E5=AD=98=E6=A1=A3=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E5=A4=A7=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.py | 2 +- save_ui.py | 2 +- tests/test_10_saves_display.py | 109 ++++++++++++++++++ tests/test_save_ui_capacity.py | 152 +++++++++++++++++++++++++ tests/test_save_ui_complete.py | 196 +++++++++++++++++++++++++++++++++ 5 files changed, 459 insertions(+), 2 deletions(-) create mode 100644 tests/test_10_saves_display.py create mode 100644 tests/test_save_ui_capacity.py create mode 100644 tests/test_save_ui_complete.py diff --git a/config.py b/config.py index 64c27cb..cb3f967 100644 --- a/config.py +++ b/config.py @@ -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 } diff --git a/save_ui.py b/save_ui.py index d0b8f62..8bc8e31 100644 --- a/save_ui.py +++ b/save_ui.py @@ -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 diff --git a/tests/test_10_saves_display.py b/tests/test_10_saves_display.py new file mode 100644 index 0000000..8249bc4 --- /dev/null +++ b/tests/test_10_saves_display.py @@ -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() diff --git a/tests/test_save_ui_capacity.py b/tests/test_save_ui_capacity.py new file mode 100644 index 0000000..3537692 --- /dev/null +++ b/tests/test_save_ui_capacity.py @@ -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() diff --git a/tests/test_save_ui_complete.py b/tests/test_save_ui_complete.py new file mode 100644 index 0000000..6a930e8 --- /dev/null +++ b/tests/test_save_ui_complete.py @@ -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()