الذكاء الاصطناعي المرئي: نموذج جديد لتصميم الألعاب
يعتبر الذكاء الاصطناعي صندوقاً أسود في معظم الألعاب. يفعل الأعداء أشياء، وأنت تتفاعل. لا توجد طريقة لقراءة نواياهم أو توقع تحركاتهم أو التفوق عليهم ذهنيًا — فقط التفوق عليهم بردود الفعل.
ماذا لو كان سلوك الذكاء الاصطناعي مرئيًا؟ ماذا لو استطعت قراءة الـ state machine (نظام الحالات والانتقالات) للعدو واستخدامها ضده؟
هذا ما بنيناه في Trait Wars.
مشكلة الصندوق الأسود
في الذكاء الاصطناعي التقليدي للألعاب، يبدو سلوك العدو هكذا من منظور اللاعب:
Enemy does... something.
You take damage.
Why? Who knows.
تحت الغطاء، إنها فوضى من القرارات العشوائية الموزونة:
# Traditional game AI
def decide_action(enemy, player):
if enemy.hp < 30:
if random() < 0.6:
return "flee"
else:
return "desperate_attack"
elif distance(enemy, player) < 3:
if random() < 0.7:
return "melee_attack"
else:
return "block"
else:
return "approach"
أوزان عشوائية، شروط متداخلة، حالة غير مرئية. لا يستطيع اللاعب التفاعل مع هذا النظام بشكل معنوي — يمكنه فقط أن يتفاعل أسرع.
لهذا السبب يبدو معظم الذكاء الاصطناعي في الألعاب "غير عادل" أو "غبي" — لا يبدو ذكيًا أبدًا.
مبدأ الذكاء الاصطناعي المرئي
تعكس Trait Wars هذا. تملك كل وحدة في اللعبة traits (سمات — آلات حالة مرئية تحدد سلوك الوحدة). يستطيع اللاعب رؤية:
- في أي حالة يكون العدو (خامل، عدواني، مدافع، ثائر)
- ما الأحداث التي تُفعّل الـ transitions (ATTACK، TAKE_DAMAGE، LOW_HP)
- ما سيفعله العدو عندما يتم تفعيل transition (الـ effects)
يحول هذا القتال من لعبة ردود فعل إلى لعبة استراتيجية حول قراءة الـ state machines والتلاعب بها.
كيف تعمل
الـ trait: جوهر كل وحدة
تُجهَّز كل وحدة في Trait Wars بـ traits. يعتبر الـ trait (سمة — آلة حالة مرئية مرتبطة بوحدة):
{
"name": "BerserkerTrait",
"linkedEntity": "Unit",
"stateMachine": {
"states": [
{ "name": "Calm", "isInitial": true },
{ "name": "Aggressive" },
{ "name": "Enraged" }
],
"events": [
{ "key": "TAKE_DAMAGE", "name": "Take Damage" },
{ "key": "KILL_ENEMY", "name": "Kill Enemy" },
{ "key": "REST", "name": "Rest" }
],
"transitions": [
{
"from": "Calm",
"to": "Aggressive",
"event": "TAKE_DAMAGE",
"guard": ["<", "@entity.hp", ["*", "@entity.maxHp", 0.5]],
"effects": [
["set", "@entity.attackMultiplier", 1.5],
["set", "@entity.defenseMultiplier", 0.8]
]
},
{
"from": "Aggressive",
"to": "Enraged",
"event": "TAKE_DAMAGE",
"guard": ["<", "@entity.hp", ["*", "@entity.maxHp", 0.25]],
"effects": [
["set", "@entity.attackMultiplier", 2.5],
["set", "@entity.defenseMultiplier", 0.4]
]
},
{
"from": "Enraged",
"to": "Calm",
"event": "KILL_ENEMY",
"effects": [
["set", "@entity.attackMultiplier", 1.0],
["set", "@entity.defenseMultiplier", 1.0],
["set", "@entity.hp", ["*", "@entity.maxHp", 0.3]]
]
}
]
}
}
يستطيع اللاعب رؤية هذا الـ trait على وحدة العدو. يعرف:
- هادئ → إحصائيات عادية. آمن لتجاهله حاليًا.
- عدواني → 1.5 ضعف الهجوم، 0.8 ضعف الدفاع. خطير لكن هش.
- ثائر → 2.5 ضعف الهجوم، 0.4 ضعف الدفاع. مدفع زجاجي. اضربه الآن أو مُت.
- محفز القتل → إذا قتل الهائج شخصًا أثناء كونه ثائرًا، يعود لحالة الهدوء ويُشفى. لا تدعه يحصل على القتلة.
الاستراتيجية تنبثق عند اللاعب
يصبح القتال حول التلاعب بحالة العدو لأن الذكاء الاصطناعي مرئي:
الاستراتيجية 1: استدرج الهائج
- أرسل وحدة صلبة لامتصاص الضربات
- انتظر حتى يدخل الهائج حالة ثائر (2.5 ضعف الهجوم، 0.4 ضعف الدفاع)
- اضرب بوحداتك بعيدة المدى — الدفاع 0.4 ضعف يعني أنهم يذوبون
- اقتلهم قبل أن يقتلوا دبابتك (مما يُعيدهم لحالة الهدوء + شفاء)
الاستراتيجية 2: امنع إعادة الضبط
- يشفى الهائج عندما يقتل أثناء حالة الثورة
- أبقِ وحداتك منخفضة الصحة بعيدًا عن مداه
- حرمه من أهداف القتل بينما دفاعه مُنصّف
الاستراتيجية 3: مضادات الـ traits
يمكن لوحدة بـshield trait امتصاص انفجار الثورة:
ShieldTrait: Calm → Shielded (on INCOMING_ATTACK)
- Absorbs damage equal to @entity.shieldStrength
- Transitions back to Calm after 2 turns
يقرأ اللاعب كلتا الـ state machines ويركب استراتيجية مضادة. هذا ليس حجر-ورقة-مقص — إنه قراءة state machine الخصم واستغلال transitions الخاصة بها.
لماذا هذا يصنع ألعابًا أفضل
1. المهارة هي المعرفة، لا ردود الفعل
يتغلب مراهق بأصابع سريعة على استراتيجي عمره 35 عامًا في كل مرة، في لعبة قائمة على ردود الفعل. في Trait Wars، فهم الـ state machines — قراءة الحالة التي فيها العدو، توقع أي حدث سيُفعَّل تاليًا، تموضع الوحدات لاستغلال نوافذ الـ transition — هو المهارة.
2. لا إحباط من العشوائية
عندما تخسر أمام هائج، ستعرف بالضبط لماذا: تركته يصل لحالة الثورة ولم تستغل نافذة الدفاع 0.4 ضعف. الـ state machine حتمية. نفس المدخلات، نفس المخرجات. كل خسارة فرصة تعلم، لا رمية نرد.
3. تعقيد ناشئ من قواعد بسيطة
يملك كل trait ما بين 3 إلى 5 حالات. بسيط. لكن عندما يكون لوحدة 2-3 traits، وللعدو 2-3 traits، وهناك 6 وحدات لكل جانب... فضاء التفاعل هائل. ليس لأن القواعد معقدة، بل لأن التركيب يخلق الانبثاق.
4. اللاعبون يصبحون مفكرين منظوميين
تعلم اللعبة التفكير بمصطلحات:
- الحالات (ما يمكن أن يحدث)
- الـ transitions (ما يُفعّل التغيير)
- الـ guards (شروط تمنع أو تسمح بالتغيير) (ما يمنع التغيير)
- الـ effects (ما يُسبّبه التغيير)
تعد هذه نفس المفاهيم المستخدمة في هندسة البرمجيات وتصميم العمليات التجارية والتفكير المنظومي. اللعبة تُعلّم نموذجًا ذهنيًا ينتقل إلى العالم الحقيقي.
السر التصميمي: الـ traits هي ميكانيكيات اللعبة
يحدد المصممون القدرات في الكود في الألعاب التقليدية. تعني إضافة قدرة جديدة برمجة سلوك جديد.
في Trait Wars، تعتبر الـ traits ميكانيكيات اللعبة. تعد إضافة قدرات جديدة إضافة state machines جديدة:
{
"name": "VampireTrait",
"stateMachine": {
"states": [
{ "name": "Hungry", "isInitial": true },
{ "name": "Fed" }
],
"transitions": [
{
"from": "Hungry",
"to": "Fed",
"event": "DEAL_DAMAGE",
"effects": [
["set", "@entity.hp", ["+", "@entity.hp", ["*", "@payload.damage", 0.3]]],
["set", "@entity.attackMultiplier", 0.8]
]
},
{
"from": "Fed",
"to": "Hungry",
"event": "TURN_END",
"guard": [">=", "@entity.turnsSinceFed", 3],
"effects": [
["set", "@entity.attackMultiplier", 1.2]
]
}
]
}
}
يشفي مصاص الدماء 30% من الضرر المُلحق. بعد التغذية، يكون أضعف لفترة (0.8 ضعف الهجوم). بعد 3 أدوار بدون تغذية، يجوع مرة أخرى ويضرب أقوى (1.2 ضعف). يقرأ اللاعب هذا ويخطط وفقًا لذلك.
لم يُكتب كود جديد. مجرد state machine في JSON.
الرنين: تركيب الـ traits كميكانيكية لعب
تنشئ الوحدات رنينًا — مضاعفات تآزر — عندما تُجهَّز بـ traits متوافقة:
| التركيبة | effect الرنين |
|---|---|
| دفاع + ترميم | 1.5 ضعف شفاء الدرع |
| هائج + مصاص دماء | سرقة الحياة تتناسب مع الغضب |
| درع + استفزاز | 2 ضعف توليد التهديد |
ينشئ هذا طبقة بناء مجموعات فوق القتال التكتيكي. لا يختار اللاعبون وحدات فقط — بل يختارون تركيبات traits تُنشئ استراتيجيات ناشئة.
الخلاصة
لمصممي الألعاب: اجعلوا الذكاء الاصطناعي مرئيًا. عندما يستطيع اللاعبون قراءة النظام، يتفاعلون معه فكريًا. الخسائر تصبح فرص تعلم. الانتصارات تبدو مستحقة. العمق ينبثق من قواعد بسيطة قابلة للتركيب.
للمطورين: لا تقتصر الـ state machines على النماذج وسير العمل. إنها أداة تصميم ألعاب تُنشئ سلوكًا حتميًا، قابلًا للقراءة، قابلًا للتركيب — بالضبط ما يحتاجه اللاعبون والمصممون.
للاعبين: Trait Wars قادمة. وفي هذه اللعبة، يفوز اللاعب الأذكى.
تابعوا التطوير على almadar.io.