Merge branch 'main' of git.gangary.cn:gary/maze_python
This commit is contained in:
commit
ecb9f0531b
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
109
tests/test_10_saves_display.py
Normal file
109
tests/test_10_saves_display.py
Normal 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()
|
152
tests/test_save_ui_capacity.py
Normal file
152
tests/test_save_ui_capacity.py
Normal 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()
|
196
tests/test_save_ui_complete.py
Normal file
196
tests/test_save_ui_complete.py
Normal 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()
|
Loading…
Reference in New Issue
Block a user