تعرّف على خصومك الجدد: روبوتات أذكى وأكثر حيوية
صارت للروبوتات الآن شخصيات — تعقد الصفقات وتبني وتزايد وتستهدف المتصدّر بل وتتفاعل بالملصقات. كل مباراة تبدو مختلفة.

بكلمات بسيطة
كان اللعب ضد الكمبيوتر فيما مضى رتيبًا بعض الشيء: الروبوتات القديمة كانت ترمي النرد وتشتري ما تحطّ عليه، ولا شيء يُذكر سوى ذلك. لم يعد الأمر كذلك. صارت لخصومك الآن شخصيات حقيقية، وهم يلعبون فعلًا من أجل الفوز.
كل روبوت مزيج من مستوى صعوبة (سهل أو متوسط أو صعب) وشخصية. قد تواجه مصرفيًا حذرًا يكنز المال، أو مقامرًا متهوّرًا يعشق الجائزة الكبرى، أو متخصّصًا يطارد مجموعة لون واحدة، أو منافسًا حقودًا يتكاتف ضد من يتصدّر — أي ضدّك أنت.
- يرسلون إليك عروض صفقة — عقار فائض مع مبلغ نقدي مقابل الحقل الذي يحتاجونه — ويردّون على عروضك.
- يبنون وفق القيمة، فيضعون البيوت حيث يعود الإيجار بالربح الأسرع.
- يزايدون في المزادات، والروبوت الصعب سيدفع أكثر من اللازم لإكمال مجموعة.
- يتفاعلون في الدردشة بالملصقات حين تؤلم صفقة أو يحطّ إيجار كبير.
ولأن مستويات الصعوبة والشخصيات تُخلط في كل طاولة، لا تتشابه مباراتان أبدًا في مجراهما. صار للوحة شخصية الآن.
للمهتمين بالتفاصيل التقنية
يحمل كل روبوت ملفًا تعريفيًا اختياريًا — مستوى صعوبة متقاطع مع واحد من خمسة أنماط (المحتكِر، المتخصّص، الحقود، المخاطِر، السلحفاة)، يُمزج تلقائيًا في كل مباراة إلى تسعة أساليب لعب. الملف عبارة عن مجموعة من المقابض بقيمة 0–1 تُشكّل كل قرار: الشراء، والبناء، والصفقات، والمزايدة في المزاد، وكفالة الخروج من السجن.
// 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 الخاص بالمباراة عند البداية — تمامًا مثل حقل الفريق — لذا لم تكن هناك أي ترحيل لقاعدة البيانات. الروبوت السهل الذي لا ملف له هو الخصم الأصلي بايتًا ببايت، ولهذا ما زال كل اختبار سابق ينجح.
سيدفع الروبوت الصعب أكثر من السعر المعلن لإتمام احتكار، بحدّ أقصى يضمن أن تُحسَم المزادات دائمًا:
// 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 ناجحة.
