From c0798d127b913a53be65d12d637ff204c5f54b9c Mon Sep 17 00:00:00 2001 From: "Mr.Xia" <1424473282@qq.com> Date: Sat, 4 Apr 2026 17:08:45 +0800 Subject: [PATCH] =?UTF-8?q?test(=E8=B5=9B=E9=A9=AC=E6=8F=92=E4=BB=B6):=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=A8=A1=E6=8B=9F=E8=B5=9B=E9=A9=AC=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增测试命令“测试模拟赛马”,用于验证赛马引擎的核心逻辑。该命令会: - 自动创建包含8匹随机命名赛马的房间 - 运行赛马引擎直至比赛结束 - 验证进度渲染格式的正确性 - 输出比赛结果和进度片段 这有助于在开发过程中快速验证赛马功能的完整性和正确性。 --- .../group_horse_racing/test_commands.py | 104 +++++++++++++++++- 1 file changed, 103 insertions(+), 1 deletion(-) diff --git a/danding_bot/plugins/group_horse_racing/test_commands.py b/danding_bot/plugins/group_horse_racing/test_commands.py index ded7831..79f8cd5 100644 --- a/danding_bot/plugins/group_horse_racing/test_commands.py +++ b/danding_bot/plugins/group_horse_racing/test_commands.py @@ -2,7 +2,10 @@ from nonebot import on_command from nonebot.adapters.onebot.v11 import Bot, Event, GroupMessageEvent, PrivateMessageEvent from . import plugin_config as config -from .commands import get_scope, check_access, room_store, points_service +from .commands import get_scope, check_access, room_store, points_service, race_engine +from .models import Horse, HorseState, RoomState + +import random async def check_tester(event: Event) -> bool: @@ -104,3 +107,102 @@ async def handle_test_force_start(bot: Bot, event: Event): return await test_force_start_cmd.finish("测试强制开赛命令") + + +def _generate_random_horse_names(count: int) -> list[str]: + prefixes = ["赤焰", "踏雪", "追风", "流星", "疾电", "破晓", "青岚", "玄影", "星尘", "霜刃", "烈阳", "苍穹"] + cores = ["奔", "跃", "影", "翼", "刃", "雷", "岚", "焰", "星", "雪", "风", "光"] + suffixes = ["号", "骑", "王", "将", "卫", "客", "影", "者", "马", "军"] + + names: set[str] = set() + attempts = 0 + while len(names) < count and attempts < 500: + attempts += 1 + name = f"{random.choice(prefixes)}{random.choice(cores)}{random.choice(suffixes)}" + if len(name) > 10: + name = name[:10] + names.add(name) + + while len(names) < count: + names.add(f"测试马{len(names) + 1}") + + return list(names)[:count] + + +test_simulate_race_cmd = on_command("测试模拟赛马", priority=5) + + +@test_simulate_race_cmd.handle() +async def handle_test_simulate_race(bot: Bot, event: Event): + if not await check_tester(event): + await test_simulate_race_cmd.finish("权限不足") + return + + scope = get_scope(event) + lock = room_store.get_lock(scope) + + async with lock: + race_engine.stop_race(scope) + room_store.delete_room(scope) + room = room_store.create_room(scope) + + horse_names = _generate_random_horse_names(8) + for idx, horse_name in enumerate(horse_names, start=1): + owner_id = f"sim_user_{idx}" + room.horses[horse_name] = Horse(owner_id=owner_id, name=horse_name, state=HorseState.RACING) + + room.state = RoomState.RUNNING + + progress_samples: list[str] = [] + last_progress = "" + finished = [] + + for _ in range(1_000): + finished = race_engine.tick(room) + last_progress = race_engine.format_progress(room) + if len(progress_samples) < 3: + progress_samples.append(last_progress) + if finished: + break + + if not finished: + race_engine.stop_race(scope) + room_store.delete_room(scope) + await test_simulate_race_cmd.finish("模拟失败:超过最大回合仍未结束") + return + + champion = race_engine.determine_champion(finished) + room.champion_name = champion.name + room.state = RoomState.FINISHED + + expected_lines = 1 + len(room.horses) + actual_lines = len(last_progress.splitlines()) + if actual_lines != expected_lines: + race_engine.stop_race(scope) + room_store.delete_room(scope) + await test_simulate_race_cmd.finish(f"模拟失败:进度渲染行数不匹配(期望{expected_lines},实际{actual_lines})") + return + + missing_names = [name for name in room.horses.keys() if name not in last_progress] + if missing_names: + race_engine.stop_race(scope) + room_store.delete_room(scope) + await test_simulate_race_cmd.finish(f"模拟失败:进度渲染缺少马名:{', '.join(missing_names)}") + return + + race_engine.stop_race(scope) + room_store.delete_room(scope) + + sample_block = "\n\n".join(progress_samples[-2:] + [last_progress] if len(progress_samples) >= 2 else [last_progress]) + await test_simulate_race_cmd.finish( + "\n".join( + [ + "模拟赛马完成", + f"参赛马匹:{', '.join(horse_names)}", + f"冠军:{room.champion_name}", + f"总回合:{room.tick_count}", + "进度片段:", + sample_block, + ] + ) + )