You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu下Python终端游戏无法访问MobData中JSON文件求助

路径问题解决方法

报错原因

  • 你写的/MobData/bat.json指向系统根目录,而非项目文件夹内的目录,系统根目录不存在该文件夹,因此报错。
  • 若完整路径写错(比如漏写项目所在父目录),同样会导致文件找不到。

可靠解决方案

方法1:相对路径(注意运行目录)

如果main.py与MobData文件夹在同一目录,直接使用不带开头/的相对路径:

import json
with open("MobData/bat.json", "r") as f:
    mob_data = json.load(f)

⚠️ 注意:运行main.py时,终端工作目录必须是项目根目录(即main.py所在目录),若从其他目录运行(如python /home/you/projects/game/main.py),相对路径会失效。

方法2:动态获取脚本路径(推荐)

无论从哪里运行脚本,都能精准定位文件,可使用os模块或pathlib:

用os模块实现:

import os
import json

# 获取当前脚本的绝对目录
current_dir = os.path.dirname(os.path.abspath(__file__))
# 拼接怪物数据文件路径
mob_file_path = os.path.join(current_dir, "MobData", "bat.json")

with open(mob_file_path, "r") as f:
    mob_data = json.load(f)

用pathlib实现(Python3.4+更简洁):

from pathlib import Path
import json

# 获取当前脚本所在目录的绝对路径
current_dir = Path(__file__).parent.resolve()
# 用/运算符拼接路径
mob_file_path = current_dir / "MobData" / "bat.json"

with open(mob_file_path, "r") as f:
    mob_data = json.load(f)

终端Python游戏项目建议
  • 数据管理优化

    • 将所有怪物数据合并到单个JSON文件(如mobs.json),用键值对区分不同怪物:
      {
        "bat": {"hp": 10, "attack": 2},
        "goblin": {"hp": 20, "attack": 4}
      }
      
      减少文件数量,加载时一次性读取所有数据,维护和效率都更高。
    • 用dataclasses或Pydantic将JSON字典转为Python对象,避免直接用字典键取值时的拼写错误:
      from dataclasses import dataclass
      import json
      
      @dataclass
      class Mob:
          hp: int
          attack: int
          name: str
      
      # 加载数据后转换为对象
      with open("mobs.json", "r") as f:
          mobs_raw = json.load(f)
      bat = Mob(name="bat", **mobs_raw["bat"])
      
  • 代码结构拆分

    • 不要把所有代码堆在main.py,拆分模块:比如mob.py存放Mob类及相关逻辑,data_loader.py处理数据加载,ui.py负责终端交互,main.py作为入口文件。
    • 用logging模块替代print调试,可灵活控制日志级别,生产环境可关闭调试日志:
      import logging
      logging.basicConfig(level=logging.INFO)
      logging.info("蝙蝠数据加载成功")
      
  • 终端交互体验

    • 用curses库实现彩色文字、光标定位,提升终端界面友好度,比如给怪物名标红色、提示信息标绿色。
    • 处理用户输入时添加异常捕获,避免因无效输入导致程序崩溃:
      while True:
          try:
              choice = int(input("请输入你的选择:"))
              break
          except ValueError:
              print("请输入有效的数字!")
      
  • 测试与版本控制

    • 编写简单单元测试,用Python自带的unittest或第三方库pytest验证数据加载、属性计算等逻辑,避免改代码后出现隐性bug。
    • 用Git管理代码,完成小功能后及时提交(如git commit -m "完成蝙蝠怪物数据加载"),防止代码丢失,也方便回滚错误版本。

内容的提问来源于stack exchange,提问作者LeoLeo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:12:41