# mm_os 卡牌游戏开发

## 规则（Rules）

- 卡牌游戏核心模块：卡牌管理、牌组、对战逻辑、匹配、排行
- 游戏数据表以 `game_` 前缀命名，与业务数据隔离
- 玩家操作须经服务端校验，防止篡改

## 方法（Methods）

### 步骤1：创建游戏 App

使用 `read_work develop_mm_app` 创建游戏 App，在 app.json 中标识：

```json
"game": { "type": "card_game" }
```

### 步骤2：设计数据表

| 表名 | 用途 | 关键字段 |
|:----|:-----|:---------|
| `game_card` | 卡牌模板配置 | card_id, name, type, atk, hp, skill_id |
| `game_skill` | 技能模板配置 | skill_id, name, effect, trigger |
| `game_player_card` | 玩家持有的卡牌 | player_id, card_id, level, exp |
| `game_deck` | 玩家牌组配置 | player_id, deck_name, cards |
| `game_battle_log` | 对战记录 | battle_id, player1, player2, result |
| `game_rank` | 排行榜 | player_id, rank, score, season |

### 步骤3：实现核心API

| API | 功能 | 方法 |
|:----|:-----|:------|
| `/api/game/card/list` | 获取玩家卡牌列表 | GET |
| `/api/game/card/draw` | 抽卡 | POST |
| `/api/game/deck/save` | 保存牌组 | POST |
| `/api/game/match/start` | 开始匹配 | POST |
| `/api/game/battle/action` | 对战操作 | POST |
| `/api/game/battle/result` | 获取对战结果 | GET |
| `/api/game/rank/list` | 排行榜 | GET |

### 步骤4：实现对战逻辑

```javascript
// 回合制对战核心逻辑
async function battle(player1Cards, player2Cards) {
    var turn = 0;
    while (player1.hp > 0 && player2.hp > 0 && turn < 100) {
        // 先手玩家出牌
        var action1 = await getPlayerAction(player1.id);
        // 后手玩家出牌
        var action2 = await getPlayerAction(player2.id);
        // 结算
        var result = resolveActions(action1, action2);
        applyResult(result);
        turn++;
    }
    return { winner: player1.hp > 0 ? player1.id : player2.id, log: battleLog };
}
```

### 步骤5：配置定时任务

- 每日奖励结算（`read_work develop_mm_task`）
- 赛季排行榜结算
- 数据清理

## 技巧（Tips）

- **操作队列**：每个玩家操作入队，服务端按顺序处理，防止并发问题
- **对战超时**：每回合设置时限（如30秒），超时自动跳过
- **重连机制**：玩家断线后保留对局状态，5分钟内可重连
- **反作弊**：所有战斗逻辑在服务端执行，客户端只做展示
