【python】文字版农场游戏 —— 架构设计文档

🏗️ 文字版农场游戏 ------ 架构设计文档

基于《农场文字版策划案.md》的软件架构设计

目标语言:Python 3.10+ | 运行模式:终端 CLI | 存储:JSON 本地持久化


运行游戏

基本集成了土地,播种,浇水,售后,商店等功能,随时间而收获

一、整体架构概览

复制代码
┌─────────────────────────────────────────────────────┐
│                    main.py                          │
│              (游戏入口 / 主循环)                      │
└──────────┬──────────────────────────────┬───────────┘
           │                              │
    ┌──────▼──────┐              ┌───────▼──────────┐
    │   Game      │              │   MenuManager    │
    │  (游戏核心)  │◄────────────►│  (选单导航引擎)   │
    └──┬──┬──┬──┬─┘              └──────────────────┘
       │  │  │  │
  ┌────┘  │  │  └──────┐
  ▼       ▼  ▼          ▼
┌──────┐ ┌──────┐ ┌──────┐ ┌──────────┐
│ Land  │ │ Crop │ │ Econ │ │ Inventory│
│ System│ │System│ │System│ │(背包/装饰)│
└───────┘ └──────┘ └──────┘ └──────────┘
                              ┌──────────┐
                              │ SaveLoad │
                              │ (数据持久化)│
                              └──────────┘

二、目录结构

复制代码
farm_game/
├── main.py                 # 程序入口,启动游戏
├── game.py                 # Game 类 ------ 游戏核心状态与主循环
├── menu.py                 # MenuManager ------ 选单导航与渲染
│
├── systems/
│   ├── __init__.py
│   ├── land.py             # LandSystem ------ 地块管理
│   ├── crop.py             # CropSystem ------ 作物数据与生长逻辑
│   ├── economy.py          # EconomySystem ------ 金币/经验/等级
│   ├── store.py            # StoreSystem ------ 商店购买逻辑
│   ├── inventory.py        # InventorySystem ------ 背包与装饰
│   └── achievement.py      # AchievementSystem ------ 成就/签到
│
├── data/
│   └── crops.json          # 作物静态数据表
│
├── save/
│   └── (运行时生成)        # save_*.json 存档文件
│
└── utils/
    ├── __init__.py
    ├── display.py          # 格式化输出(表格、颜色、图标)
    └── time_helper.py      # 时间工具(倒计时、时间戳转换)

三、核心类设计

1. Game ------ 游戏核心

复制代码
┌─────────────────────────────────────────────┐
│                   Game                      │
├─────────────────────────────────────────────┤
│ - player_data: dict                         │
│ - land_system: LandSystem                   │
│ - crop_system: CropSystem                   │
│ - economy: EconomySystem                    │
│ - store: StoreSystem                        │
│ - inventory: InventorySystem                │
│ - achievement: AchievementSystem            │
│ - menu: MenuManager                         │
├─────────────────────────────────────────────┤
│ + new_game()                                │
│ + load_game(save_id)                        │
│ + save_game()                               │
│ + main_loop()                               │
│ + tick()              # 检查成熟/枯萎状态    │
│ + get_overview()      # 主界面概况文本       │
└─────────────────────────────────────────────┘
  • Game 是唯一的状态持有者,所有子系统通过它访问共享数据。
  • main_loop() 驱动「显示菜单 → 等待输入 → 分发动作 → 刷新状态」循环。
  • tick() 在每次操作前调用,检查所有地块的成熟/枯萎状态。

2. LandSystem ------ 地块管理

复制代码
┌─────────────────────────────────────────────┐
│                LandSystem                   │
├─────────────────────────────────────────────┤
│ - lands: list[dict]   # 地块数组            │
│   # 每块: { id, status, crop_id,            │
│   #         plant_time, water_count }        │
│ - max_lands: int                            │
├─────────────────────────────────────────────┤
│ + get_land(land_id) -> dict                 │
│ + get_lands_by_status(status) -> list       │
│ + plant(land_id, crop_id) -> bool           │
│ + harvest(land_id) -> dict  # 收益          │
│ + water(land_id) -> bool                    │
│ + fertilize(land_id) -> bool                │
│ + till(land_id) -> bool  # 翻地             │
│ + unlock_lands(count) -> bool               │
│ + update_all(timestamp)  # 更新生长状态      │
└─────────────────────────────────────────────┘

地块状态机:

复制代码
  ┌──────────┐  播种   ┌──────────┐  时间到   ┌──────────┐
  │  空地    │ ──────► │ 生长中   │ ────────► │  成熟    │
  │ (闲置)   │         │ (倒计时)  │           │ (可收获)  │
  └──────────┘         └──────────┘           └────┬─────┘
       ▲                                            │ 30min未收
       │  翻地                                       ▼
       │                                      ┌──────────┐
       └────────────────────────────────────── │  枯萎    │
                                              │ (需翻地)  │
                                              └──────────┘

3. CropSystem ------ 作物数据

复制代码
┌─────────────────────────────────────────────┐
│               CropSystem                    │
├─────────────────────────────────────────────┤
│ - crops_db: dict[str, CropData]             │
│   # crop_id -> { name, price, mature_time,  │
│   #              sell_price, exp, level_req }│
├─────────────────────────────────────────────┤
│ + get_crop(crop_id) -> CropData             │
│ + get_available_crops(level) -> list        │
│ + get_mature_seconds(crop_id, planted_at)   │
│   -> int  # 剩余秒数                         │
│ + load_from_json(path)                      │
└─────────────────────────────────────────────┘

CropData 可定义为 dataclass

python 复制代码
@dataclass
class CropData:
    crop_id: str
    name: str
    seed_price: int
    mature_seconds: int    # 成熟所需秒数
    sell_price: int
    exp: int
    level_required: int

4. EconomySystem ------ 经济与等级

复制代码
┌─────────────────────────────────────────────┐
│             EconomySystem                   │
├─────────────────────────────────────────────┤
│ - gold: int                                 │
│ - exp: int                                  │
│ - level: int                                │
├─────────────────────────────────────────────┤
│ + add_gold(amount)                          │
│ + spend_gold(amount) -> bool                │
│ + add_exp(amount)                           │
│ + get_level() -> int                        │
│ + get_exp_to_next_level() -> int            │
│ - _calculate_level(exp) -> int              │
└─────────────────────────────────────────────┘

等级公式(示例):

复制代码
下一级所需总经验 = 100 × level²
等级 总经验
1 0
2 100
3 400
4 900
5 1600
... ...

5. StoreSystem ------ 商店

复制代码
┌─────────────────────────────────────────────┐
│              StoreSystem                    │
├─────────────────────────────────────────────┤
│ (依赖 CropSystem 和 EconomySystem)          │
├─────────────────────────────────────────────┤
│ + buy_seed(crop_id) -> bool                 │
│ + get_store_list(level) -> list             │
│ + buy_decoration(item_id) -> bool           │
└─────────────────────────────────────────────┘

6. InventorySystem ------ 背包与装饰

复制代码
┌─────────────────────────────────────────────┐
│            InventorySystem                  │
├─────────────────────────────────────────────┤
│ - decorations: list[str]   # 已购装饰 ID    │
│ - seeds: dict[str, int]    # 种子库存        │
├─────────────────────────────────────────────┤
│ + add_seed(crop_id, count)                  │
│ + use_seed(crop_id) -> bool                 │
│ + add_decoration(item_id)                   │
│ + get_active_decoration_text() -> str       │
└─────────────────────────────────────────────┘

7. AchievementSystem ------ 成就与签到

复制代码
┌─────────────────────────────────────────────┐
│          AchievementSystem                  │
├─────────────────────────────────────────────┤
│ - achievements: dict[str, bool]             │
│ - total_harvests: int                       │
│ - planted_set: set[str]                     │
│ - sign_in_days: int                         │
│ - last_sign_in: str / None                  │
├─────────────────────────────────────────────┤
│ + check_achievements() -> list[str]  # 新成就│
│ + record_harvest(crop_id)                   │
│ + sign_in() -> dict  # 签到奖励              │
│ + get_achievement_list() -> list             │
└─────────────────────────────────────────────┘

复制代码
┌─────────────────────────────────────────────┐
│              MenuManager                    │
├─────────────────────────────────────────────┤
│ - game: Game   (反向引用)                   │
├─────────────────────────────────────────────┤
│ + show_main_menu()                          │
│ + show_farm_view()                          │
│ + show_store()                              │
│ + show_plant_menu()                         │
│ + show_harvest_menu()                       │
│ + show_water_menu()                         │
│ + show_till_menu()                          │
│ + show_inventory()                          │
│ + show_achievements()                       │
│ + show_decoration_shop()                    │
│ - _get_input(prompt) -> int                 │
│ - _wait_return()                            │
└─────────────────────────────────────────────┘
  • 每个 show_xxx() 方法对应策划案中的一个选单界面。
  • 方法内部:打印界面 → 读取数字输入 → 调用 game 对应方法 → 回到主菜单。
  • 选单之间不嵌套调用 ,全部归流到 main_loop()

四、数据存储设计 (JSON Schema)

存档文件 save_001.json

json 复制代码
{
  "version": 1,
  "player": {
    "name": "玩家",
    "gold": 520,
    "exp": 350,
    "level": 3
  },
  "lands": [
    {
      "id": 1,
      "status": "growing",
      "crop_id": "carrot",
      "plant_time": 1719715200.0,
      "water_count": 0
    },
    {
      "id": 2,
      "status": "mature",
      "crop_id": "strawberry",
      "plant_time": 1719714000.0,
      "water_count": 1
    }
  ],
  "inventory": {
    "seeds": {
      "carrot": 5,
      "potato": 2
    },
    "decorations": []
  },
  "achievements": {
    "first_harvest": true,
    "total_harvests": 12,
    "planted_crops": ["carrot", "potato"],
    "sign_in": {
      "last_date": "2026-07-01",
      "continuous_days": 3
    }
  }
}

静态作物数据 crops.json

json 复制代码
[
  {
    "crop_id": "carrot",
    "name": "萝卜",
    "seed_price": 10,
    "mature_seconds": 120,
    "sell_price": 20,
    "exp": 1,
    "level_required": 1
  }
]

五、主循环流程(伪代码)

复制代码
function main_loop():
    while True:
        tick()                              # 刷新所有地块状态
        print(main_menu_text())             # 渲染主界面
        choice = input("请输入数字选择: ")

        if choice == 0:                     # 退出
            save_game()
            break
        elif choice == 1:   menu.show_farm_view()
        elif choice == 2:   menu.show_store()
        elif choice == 3:   menu.show_plant_menu()
        elif choice == 4:   menu.show_harvest_menu()
        elif choice == 5:   menu.show_water_menu()
        elif choice == 6:   menu.show_unlock_land()
        elif choice == 7:   menu.show_till_menu()
        elif choice == 8:   menu.show_inventory()
        elif choice == 9:   menu.show_achievements()

数据流方向:

复制代码
输入 ──► MenuManager ──► Game ──► SubSystem
                                      │
                        ◄─────────────┘
                          返回结果/状态
                               │
                    ┌──────────▼──────────┐
                    │ 自动保存 (每3次操作) │
                    └─────────────────────┘

六、时间机制

  • 使用 time.time() 记录 plant_time(播种时间戳)。

  • 每次用户操作时调用 tick()

    复制代码
    剩余时间 = (plant_time + mature_seconds) - now
  • 不依赖后台线程 / 定时器,纯被动刷新。

  • 浇水效果:mature_seconds -= 60(减少 1 分钟),最少不低于 10 秒。

  • 枯萎判定:成熟时间戳 + 1800 秒(30 分钟)→ 标记为 withered


七、浇水/施肥机制

动作 效果 冷却
浇水 剩余生长时间 -60s 每块地每 30s 可浇一次
施肥 剩余生长时间 -120s 消耗背包中的肥料(后续版本)

八、依赖关系图

复制代码
                    Game
                  /  |   \
                 /   |    \
                ▼    ▼     ▼
          LandSystem  EconomySystem  InventorySystem
              |            |              |
              ▼            ▼              |
          CropSystem   StoreSystem        |
                            |              |
                            ▼              ▼
                      AchievementSystem  (装饰数据)
  • 所有子系统之间不直接依赖 ,仅通过 Game 协调。
  • MenuManager 依赖 Game(通过它访问所有子系统)。
  • StoreSystem 依赖 CropSystem(读取作物数据)和 EconomySystem(扣钱判断)。

九、开发路线(对应策划案 MVP)

阶段 内容 涉及模块
Phase 1 核心循环:土地 + 种植 + 收获 + 倒计时 LandSystem, CropSystem, Game, MenuManager
Phase 2 商店 + 经济系统 + 等级解锁 StoreSystem, EconomySystem
Phase 3 多作物 + 等级解锁过滤 CropSystem 完善 + 等级校验
Phase 4 装饰 + 成就 + 签到 InventorySystem, AchievementSystem

github源码下载