# openra_play **Repository Path**: qingtinggit/openra_play ## Basic Information - **Project Name**: openra_play - **Description**: openra竞赛通关 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-03 - **Last Updated**: 2025-09-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Code Alert 本项目目前用于openra code altert竞赛通关,时间,知识等方面原因,不保证对战时候工具完整性。 本项目用mcp方式来完成整个游戏的操作控制。 # MCP 一键启动示例 本项目为 MCP 的简化演示版,提供一键启动的 MCP 服务端与 SSE 客户端。 ## 📦 项目结构 ``` mcp/ ├── mcp_tools/ │ ├── mcp_server.py # MCP 服务端(基于 FastAPI + SSE) │ └── mcp_client.py # MCP 客户端(基于 SSE + OpenAI/DeepSeek) ├── main.py # ✅ 一键启动脚本:同时启动服务端和客户端 ├── requirements.txt # 所需依赖 └── README.md # 使用说明 └── .env # 大模型接口 ``` ## ⚙️ 安装环境依赖 我的环境都是用conda管理的,所以后面的命令会有conda 建议使用 Python 3.10+,并创建虚拟环境: ```bash pip install -r requirements.txt ``` 额外安装: ```bash pip install sounddevice numpy scipy pip install funasr torch torchaudio pip install aioconsole ``` ## 🔐 配置大模型接口 你需要手动配置自己的 API Key 和模型访问地址。 打开 `.env` 文件,填写你的大模型接口信息: ## 🚀 启动方式 直接运行 `main.py`,即可同时启动 MCP Server 与 Client: ```bash python main.py ``` 你会看到如下提示: ``` [启动] MCP Server [✔] MCP Server 已就绪 [启动] MCP Client MCP SSE 客户端已启动,输入 /bye 退出 >>> ``` 客户端将连接 `http://127.0.0.1:8000/sse`,并与大模型对话交互。 为了方便调试和发现问题,我们这里更多时候采用另外一种方式,整个环境我们通过conda来配置的: 单独运行服务端: ```bash cd .\mcp conda activate game_ra python mcp_tools/mcp_server.py --debug ``` 单独运行客户端: ```bash cd .\mcp conda activate game_ra python .\mcp_tools\mcp_client_yuyin_asr_mult.py http://127.0.0.1:8000/sse ``` 我们支持三种模式 命令模式要进一步输入 /cmd 进入命令行模式,命令行模式是我们测试,实验和争取闯关时间的关键工具。例如:第四关我们只要两条组合在一起的命令就可以完成任务: ```bash [ {"tool": "smart_form_group", "params": {"group_id": "1", "type": "雅克战机", "num": 20, "healthy": "80"}}, {"client_tool": "smart_surp_attack", "params": {"pos": [7, 41], "group_id": 1, "time_sec": 10}} ] ``` 注意我们的命令是可以多行多个命令的,所有一个换行不会代表结束,必须两个连续的换行开始执行操作。 上面的这个命令,第一条smart_form_group就是血条大于80%的雅克战机一共20架组成1队, 第二条smart_surp_attack的意思是1组到位置pos上袭击敌方基地,袭击时间10秒后返回。 这个命令会在比较短的时间就完成任务,但经常会损失2,3架飞机。最高不会到190分。 再比如第七关,我们有非常多的打法,比如下面这组命令: ```bash [{"tool":"all_move_attack_80","params":{"p":[45,24]}}] [{"tool":"all_move_attack_80","params":{"p":[39,35]}}] [{"tool":"all_move_attack_80","params":{"p":[39,12]}}] [{"tool":"all_move_attack_build","params":{"p":[[43,25], [45,10], [35,35]], "target_building_types": ["核电站", "发电厂", "建造厂"]}}] ``` 这组命令能完成第七关,四个命令是分别执行的,先打完一个点才继续打下一个点,最后这个是推掉建筑。运气好的话,能打到190分左右 all_move_attack_80这个命令的意思的80%战斗单位到达目标点就算完成这个任务 all_move_attack_build这个命令的意思是所有战斗单位到指定的位置列表攻击指定的建筑列表。 第七关第二种玩法,需要先打过一次且执行过如下命令的前提下可以用这种玩法: ```bash [{"client_tool": "smart_surp_attack", "params": {"pos": [44, 13], "group_id": 1, "time_sec": 20, "target_id": 147}}] ``` 执行这个操作会有数据的自动记录,记住整个地图。然后就可以用下面这个方式打了。 ```bash [{ "client_tool": "to_safe_point", "params": { "surf_pos": [50, 20] }}] [{ "client_tool": "move_on", "params": { "pos": [40, 20] }}] [{ "client_tool": "move_on", "params": { "pos": [35, 20] }}] [{ "client_tool": "move_on", "params": { "pos": [29, 20] }}] [{ "client_tool": "move_on", "params": { "pos": [29, 38] }}] [{ "client_tool": "auto_group", "params": { "group_num": 4 }}] [{"tool":"all_move_attack_build","params":{"p":[[43,25], [45,10], [35,35]], "target_building_types": ["核电站", "发电厂", "建造厂"]}}] ``` 这里几个命令,也是要按顺序分别执行。 to_safe_point可以按我们指定的期望攻击地点找到一个最近的安全位置并让全体攻击单位停下来。 move_on 就是智能攻击,按照血量的不同站队攻击,让血量低的单元在后面受到保护。慢慢往目标位置推进,直到到达目的地。这几个目标地点走完,基本也就打完了战斗单位。 auto_group的作用是自动组队,group_num表示组队的数量,每个队会包含所有兵种,以互相配合输出 最后再全体攻击建筑物。这种打法麻烦一些,但分数显著提高到200分以上 第七关第三种玩法,也是建立在自动记录过地图的基础上的操作,但这个更简单直接,两条条命令完成 ```bash [{ "client_tool": "tiny_ctrl", "params": { "surf_pos": [60, 25], "path": [[45, 25], [40, 25], [40, 15], [35, 15], [35, 25], [35, 30], [35, 35]] }}] [{"tool":"all_move_attack_build","params":{"p":[[43,25], [45,10], [35,35]], "target_building_types": ["核电站", "发电厂", "建造厂"]}}] ``` tiny_ctrl:执行极度谨慎的战斗控制:每次只移动2-3单位,完全停下来等待战斗完成再打下一个位置,surf_pos是我们想开始袭击的起始位置,path是攻击路径。这样打下来就打光对方战斗单位。接着执行拆建筑即可。 分数也是在220甚至更高一点点。 第七关第四种玩法: ```bash [{"client_tool": "client_army_fight", "params": {}}] [{"tool":"all_move_attack_build","params":{"p":[[43,25], [45,10], [35,35]], "target_building_types": ["核电站", "发电厂", "建造厂"]}}] ``` client_army_fight的意思是智能军团作战,包含选择战斗对象,就近选择,选择被克制,多对一打击,低血逃离。参数可以放位置p作为参数,以引导军团找到敌方,一旦开始就会打到某方无战斗单元, 最后再拆掉建筑。运气好能到230分左右。 ### 更多命令使用看闯关文件 [missions.md](./missions.md) 其他攻击方式: ```bash [{"tool":"simple_move_attack","params":{"p":[38,10],"ex": ["火箭兵"]}}] [{"tool":"simple_kill","params":{"type": ["火箭兵"]}}] [{"tool":"all_move_attack","params":{"p":[45,25]}}] ``` 开发的模式过多,导致某些情况下可能会出bug.虽然每个客户端都包含所有的模式,但按照我们的推荐运行会比较顺利。上面这部分我们就运行命令模式最好。其他模式用下面的文件运行。 语音模式 ```bash cd .\mcp conda activate game_ra python .\mcp_tools\mcp_client_yuyin.py http://127.0.0.1:8000/sse ``` 这里我们运行语音模式和文字模式会比较好 文字模式(按照运行起来后的提示输入相应的模式即可) /mode text 进入文字模式即可通过文字进行操作 ``` >>> 生产一个电厂 >>> 查询当前状态 >>> 派出部队攻击敌人 ``` 每个输入都将通过 LLM 转换为 JSON 工具调用,服务端处理后返回结果。 语音模式 /mode voice 按提示录入语音,自动翻译成文字通过llm转换为 JSON 工具调用,服务端处理后返回结果。 ## 🛠 部分细节讲解 工具方法讲解: around_enimy:绕着敌方走,更多详细看[missions.md](./missions.md)和代码,这里只列了另一个文件没讲到的几个方法 client_follow_strong: """ 跟跑功能:让多个快速单位带领其他单位移动到指定位置 Args: fast_ids: 领跑单位ID列表(如多辆坦克) follow_ids: 跟随单位ID列表(如小兵) pos: 目标位置 [x, y] Returns: bool: 任务是否成功 back_health: 当单位血量低于指定值时,让单位按照指定路径逃跑。 :param health: 血量阈值,单位血量低于此值时逃跑 :param path: 逃跑路径,由一系列坐标点组成 client_hp 获取所有单位的信息 my_not_full_hp 获取所有我方单位中血量未满的单位信息 client_my_hp 获取所有单位的信息 ## 🧼 清理与退出 - 输入 `/bye` 可退出客户端 - 按 `Ctrl+C` 可中断整个运行 ## 📋 其他说明