Gặp gỡ những đối thủ mới: bot thông minh và sống động hơn
Giờ đây bot đã có cá tính — chúng trao đổi, xây dựng, đặt giá, nhắm vào người dẫn đầu và thậm chí phản ứng bằng nhãn dán. Mỗi ván đấu một khác.

Nói đơn giản
Chơi với máy trước đây có phần nhạt nhẽo: các bot cũ chỉ tung xúc xắc, mua ô mình dừng lại, và gần như chẳng làm gì hơn. Giờ thì khác rồi. Đối thủ của bạn giờ đã có cá tính thực sự, và chúng thật sự chơi để giành chiến thắng.
Mỗi bot được pha trộn từ một độ khó (dễ, trung bình hoặc khó) và một tính cách. Bạn có thể đối mặt với một chủ ngân hàng thận trọng chuyên tích trữ tiền, một con bạc liều lĩnh mê Jackpot, một chuyên gia bám theo một nhóm màu, hay một đối thủ thù dai xúm vào kẻ đang dẫn đầu — chính là bạn.
- Chúng gửi cho bạn các đề nghị trao đổi — một bất động sản dư cộng tiền mặt để đổi lấy ô chúng cần — và trả lời các đề nghị của bạn.
- Chúng xây dựng theo giá trị, đặt nhà ở nơi tiền thuê sinh lời nhanh nhất.
- Chúng đặt giá trong các phiên đấu giá, và một bot khó sẽ trả vượt mức để gom đủ một bộ.
- Chúng phản ứng trong khung chat bằng nhãn dán khi một thương vụ gây xót hoặc một khoản tiền thuê lớn ập đến.
Vì độ khó và tính cách được xáo trộn vào từng bàn chơi, không có hai ván nào diễn ra giống nhau. Giờ đây bàn cờ đã có cá tính.
Cho người thích chi tiết kỹ thuật
Mỗi bot mang một hồ sơ tùy chọn — một bậc độ khó kết hợp với một trong năm nguyên mẫu (kẻ độc quyền, chuyên gia, thù dai, kẻ liều lĩnh, con rùa), tự động pha trộn theo từng ván thành chín lối chơi. Hồ sơ là một tập các núm 0–1 định hình mọi quyết định: mua, xây, trao đổi, đặt giá đấu giá và nộp tiền bảo lãnh ra tù.
// 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
}Hồ sơ đi kèm trên PlayerState.botProfile, được nung vào engine_state của ván đấu lúc bắt đầu — y hệt trường đội — nên không có cuộc di trú cơ sở dữ liệu nào. Một bot dễ không có hồ sơ là đối thủ nguyên bản y hệt đến từng byte, đó là lý do mọi bài kiểm thử trước đây vẫn vượt qua.
Một bot khó sẽ trả cao hơn giá niêm yết để hoàn tất một thế độc quyền, có mức trần để phiên đấu giá luôn kết thúc:
// over-list bid, bounded so the auction always terminates
const maxBid = Math.round(listPrice * (1 + 0.4 * profile.aggression));Mọi thứ vẫn mang tính tất định và bảo đảm kết thúc: các giao dịch của bot bị giới hạn nghiêm ngặt (mỗi lúc chỉ một đề nghị đang mở, tần suất có seed, chỉ đưa ra những đề nghị mà bên nhận sẽ chấp nhận), và trình mô phỏng đã được kiểm thử áp lực trên 2–6 người chơi qua 400 lượt chạy fast-check ngẫu nhiên. Kiểm thử Engine 282 / daemon 91 đều xanh.
