玩法
认识你的新对手:更聪明、更鲜活的机器人
机器人现在有了个性——它们会交易、建造、出价、盯上领跑者,甚至用贴纸做出反应。每一局都各不相同。

通俗版
过去和电脑对战总觉得有点平淡:旧机器人掷骰子、买下落到的格子,也就这些了。如今不一样了。你的对手现在有了真正的个性,而且它们真的是为了赢而玩。
每个机器人都由一个难度(简单、中等或困难)和一种性格混合而成。你可能遇到一个谨慎囤钱的银行家,一个酷爱大奖的鲁莽赌徒,一个紧盯某个颜色组的专家,或是一个心怀怨恨、专门围攻领跑者的对手——也就是你。
- 它们会向你发出交易报价——用一处多余的地产加上现金换取它们需要的格子——也会回应你的报价。
- 它们按价值建造,把房子盖在租金回报最快的地方。
- 它们会在拍卖中出价,困难机器人甚至会为凑齐一组而多花钱。
- 当一笔交易让人肉痛、或落下一笔大额租金时,它们会在聊天里用贴纸做出反应。
想来一局轻松的?简单机器人玩起来和经典、温和的对手一模一样——休闲对局里什么都不会变。
由于难度和性格会被混入每一张牌桌,没有哪两局会以相同的方式展开。如今这块棋盘有了自己的个性。
技术细节
每个机器人都带有一个可选的档案——一个难度等级与五种原型(垄断者、专家、报复型、冒险家、乌龟)之一交叉,按每局自动混合成九种打法。该档案是一组 0–1 的旋钮,左右着每一个决策:购买、建造、交易、拍卖出价以及监狱保释。
ts
// packages/game-engine/src/bot/profile.ts
export type Difficulty = 'easy' | 'medium' | 'hard';
export type Archetype =
| 'monopolist' // hoards a colour group, denies opponents' sets
| 'specialist' // commits to one or two groups
| 'vindictive' // piles pressure on the net-worth leader
| 'risktaker' // bids high, plays the Jackpot
| 'turtle'; // builds slowly, hoards cash
export interface BotProfile {
difficulty: Difficulty;
archetype: Archetype;
aggression: number; // 0..1 — buy/bid/build appetite
tradeAppetite: number; // 0..1 — how often it proposes deals
}该档案承载于 PlayerState.botProfile,在开局时烘焙进游戏的 engine_state ——和队伍字段一模一样——因此没有任何数据库迁移。一个没有档案的简单机器人,逐字节就是原来的那个对手,这也是为什么之前的每一项测试都依然通过。
困难机器人会出高于标价的价格来完成垄断,但设有上限,使拍卖始终能够结束:
ts
// over-list bid, bounded so the auction always terminates
const maxBid = Math.round(listPrice * (1 + 0.4 * profile.aggression));一切都保持确定性并保证能够结束:机器人的交易受到严格限制(同一时间只有一份未结报价、带种子的频率、只发出接收方会接受的报价),而且模拟器在 2–6 名玩家、400 次随机 fast-check 运行中经受了压力测试。Engine 282 / daemon 91 测试全部通过。
