كما كتبت منظمة العفو الدولية لاستراتيجية بدورها القائم

مرحبا بالجميع. أعتقد أنه من العنوان ، من الواضح أننا سنتحدث عن إنشاء الذكاء الاصطناعي (المشار إليه فيما يلي باسم منظمة العفو الدولية) ، وما هي القرارات التي اتخذت وما حدث في النهاية. لكن عليك أولاً أن تحصل على السرعة.

تمت كتابة اللعبة بلغة برمجة Lua ، لذلك سأقدم أمثلة على التعليمات البرمجية بهذه اللغة.

سوف أصف بعض تفاصيل اللعبة التي تعتبر مهمة بالنسبة لمنظمة العفو الدولية:

  1. اللعبة هي استراتيجية بدورها القائم. أولاً ، يمشي اللاعب ، ثم تقوم منظمة العفو الدولية بأعمالها في كل بلد. يعمل الذكاء الاصطناعي فقط عند النقر فوق الخطوة التالية وليس لديه فكرة عما يحدث في وقت آخر.
  2. تحتوي اللعبة على خريطة يمكنك من خلالها تجنيد / نقل / نشر القوات. يجب على منظمة العفو الدولية تحليلها واتخاذ القرارات اللازمة.
  3. في اللعبة ، يمكنك جعل السلام / إعلان الحرب / التوقيع على اتفاقية عدم اعتداء / إنشاء وإنهاء التحالفات. يجب أن تكون منظمة العفو الدولية قادرة على التعامل مع هذا.
  4. التكنولوجيا والمؤسسات السياسية متاحة فقط للاعب. لا تتغير مكافآت الذكاء الاصطناعى من بداية اللعبة ، على عكس اللاعب.

تبدو الوظيفة المسؤولة عن بدء الخطوة التالية كما يلي:

function next_step() --     --   ,    for k, v in pairs(game_data.lands) do calc_ai(k) end --  End 

يجب أن تكون قد لاحظت الوظيفة السحرية calc_ai ، المسؤولة عن جميع أعمال السير. لا يزال بإمكانك رؤية تفاصيل واحدة مثيرة للاهتمام: يتم تنفيذ الوظيفة بالتناوب لكل بلد.

الآن نجيب على السؤال ، ماذا يحدث في calc_ai .

 function calc_ai(land) if land == game_data.player_land or land == "Undeveloped_land" or not game_data.lands[land] then return end --    ,     for k, v in pairs(game_data.lands) do local option = math.random() --  ,       . if k == game_data.player_land then ai_data = fixed_ai_data[game_data.difficulty].player else ai_data = fixed_ai_data[game_data.difficulty] end end move_army( math.random(), land) --  balance_army( math.random(), land) --   end 

إلى أن نفهم بعمق كيف تتخذ منظمة العفو الدولية القرارات في السياسة ، نلاحظ ما يلي:

  1. هناك التحقق من أن منظمة العفو الدولية لا تذهب عن غير قصد للاعب أو عن Undeveloped_land غير المفهومة. هذه مجرد أرض بدون بلد (في الواقع ، يجب أن يكون للمقاطعة دائمًا بلد يمتلكها ، لذلك فإن Undeveloped_land هي التسمية في المقام الأول للعبة).
  2. تحدد منظمة العفو الدولية جداول مختلفة للتفاعل مع البلد ، اعتمادًا على ما إذا كان اللاعب يتحكم فيه أم لا.
  3. تنقل منظمة العفو أولاً الجيش ، وبعد ذلك فقط تستأجر.

fixed_ai_data - الجدول نفسه. تم تسمية ذلك لأنه لا يتغير (بشكل أكثر دقة ، يشير المتغير دائمًا إلى جدول الجذر).
ai_data - الجدول نفسه ، والذي يتغير اعتمادًا على ما إذا كان ai_data يتعامل مع اللاعب أم لا (يشير المتغير ببساطة إلى الجدول المطلوب).

في الواقع ، تحتوي اللعبة على جدول واحد فقط يتعلق بـ AI ، ويبدو كما يلي:

 local ai = { standard = { peace = { conquer = 0.0001, war = 0.0002, war_neighbour = 0.004, pact = 0.005, agree_pact = 0.018, alliance = 0.001, alliance_small = 0.002, agree_alliance = 0.002, kick = 0.0005, envy = 0.02 }, war = { agree_peace = 0.005, }, player = { peace = { war = 0.0002, war_neighbour = 0.002, pact = 0.008, agree_pact = 0.08, alliance = 0.001, alliance_small = 0.002, agree_alliance = 0.002, kick = 0.0005, support = 0.005, voluntary_support = 0.002, envy = 0.01 }, war = { agree_peace = 0.02, } }, bonuses = { population_increase = 1.4, money_increase = 1.5, upgrade_province = 0.005 } }, } 

standard - مستوى الصعوبة. هناك عدة مستويات من الصعوبة ، والقيم في جداول مختلفة تختلف.

peace war - حالة البلاد. طاولة peace تستخدم في أي عمل ، طاولة war هي فقط للأفعال مع العدو.

يحتوي جدول player الثالث على جداول peace war مع القيم المتغيرة. كما تعلمون بالفعل ، في لعبة AI ، يمكن أن يكون لها موقف مختلف تجاه اللاعب والروبوت.

أعتقد أن القيم في الجداول واضحة بالاسم. ولكن على أي حال ، سوف ننظر في بعضها.

في غضون ذلك ، نحتاج إلى معرفة كيفية عمل الذكاء الاصطناعي في اللعبة. كل شيء بسيط هنا ، اعتمادًا على الحالة ، يمكن للبوت اختيار أي قيمة من القائمة. الأرقام أعلاه هي احتمال حدوث كل حدث. النظر في مثال:
pact = 0.005 - يعني أنه مع وجود فرصة 0.005 ، ستعرض دولة ما بلدًا آخر لإبرام اتفاقية عدم اعتداء. نعم ، كل شيء بسيط. يمكنك أن تقول: "كيف إذن يمكنك اللعب ، مع العلم أن الذكاء الاصطناعي يفعل كل شيء بشكل عشوائي؟" في الواقع ، ليس الأمر كذلك ، وسنحلل ذلك لاحقًا.

في غضون ذلك ، انظر إلى الوظيفة التالية:

 function get_answer(option,state) local sum_option = 0 for k, v in pairs(state) do sum_option = sum_option + v if option < sum_option then return k end end if sum_option > 1 then print("AI Error, sum_option > 1") end end 

option - رقم عشوائي من 0 إلى 1
state - حالة البلد
تقوم دالة get_answer بإرجاع إجراء عشوائي. لماذا هو مطلوب ، ولماذا لا يمكنك فقط التحقق من option <فرصة للعمل ، وأعتقد أنه ليس من الضروري أن تشرح.

يتم فحص هذه الوظيفة في جميع الإجراءات الممكنة لمنظمة العفو الدولية:

 if __ and get_answer(option, ai_data.peace) == "pact" then _ end 

كل شيء بسيط. هذا ، على ما يبدو ، يمكن الانتهاء ، ولكن لا.

دعنا نوضح بعض النقاط:

  1. تعلن منظمة العفو الدولية الحرب على الجيران وغير الجيران بفرص مختلفة ( war ، war_neighbour )
  2. من المحتمل أن تنضم الدول الصغيرة إلى النقابات أكثر من الانضمام إلى النقابات الكبرى ( alliance ، alliance_small )
  3. منظمة العفو الدولية لديها الحسد. الاسم ليس واضحًا تمامًا ، لكن هذه فرصة ستعلن بها البلاد الحرب قوية جدًا وفقًا لمعايير قوة اللعبة.
  4. لقد نسينا جدول المكافآت. إنه يخزن القيم التي لا ترتبط بأي حال بالموقف تجاه البلدان الأخرى ، على سبيل المثال ، مكافأة للنمو السكاني أو فرصة لتحسين المقاطعة.

هذا لم ينتهي هناك (ما لم تكن مهتمًا ، بالطبع). إنه أمر غريب عندما تعلن دولة الحرب دون سبب ، وأكثر غرابة عندما لا تكون جاهزة لهذه الحرب. لذلك ، منظمة العفو الدولية في اللعبة لديها استراتيجيات. سأشرح أنه بدلاً من الهجوم المفاجئ ، تبدأ الدولة في معظم الحالات استراتيجية.

كل بلد في ملف الحفظ لديه الحقول التالية:

  • strategy - معرف الاستراتيجية. يحدث ذلك:
    1. retreat - بلد يقلل جيشه من أجل توفير المال.
    2. recruit - توظف البلاد أقصى الجيش.
  • target هو الهدف. هذا هو أي بلد قررت بموجبه منظمة العفو الدولية إعلان الحرب ، ولكنها بدأت استراتيجية.
  • ultimatum - لا شيء ، إذا لم يكن هناك إنذار ، فإن البيانات على الإنذار ، إن وجدت.
  • value - عدد التحركات قبل إعلان الحرب. لم أستطع التوصل إلى اسم متغير أفضل ، آسف.

وهذا هو ، إذا بدأت منظمة العفو الدولية استراتيجية ، فهو:

  1. يقلل من جيشه ويوفر المال.
  2. يستأجر أعلى جيش ممكن.
  3. تعلن الحرب على اللاعب.



مع وجود فرصة معينة ، يمكن لدولة أن تقدم إنذارًا نهائيًا ، يتم فيه إلغاء الحرب. على سبيل المثال:
قلل جيشك في مقاطعة ليبيتسك إلى 5000 ، وإلا سنعلن الحرب عليك.

من المضحك: هناك خلل مثير للإعجاب أو حتى عيب عندما تطالب البلاد بتخفيض الجيش في المقاطعة ، ويمكن للاعب أن يفقد الإنذار حتى انتهاء صلاحيته. لا تأخذ منظمة العفو الدولية المقاطعة في الاعتبار ، وإذا لم يتم احترام الإنذار ، تعلن الحرب.



هناك نوعان من المتغيرات المسؤولة عن فرصة دعم اللاعب (نقل الذهب إلى اللاعب). الأول يعمل دائمًا ، باستثناء حالة الحرب مع البلد الذي تم حسابه من أجله. والثاني ، بأهمية كبيرة ، يؤخذ في الاعتبار عندما يكون هناك عدو مشترك.

وأضيفت أيضًا متغيرات مختلفة ، على سبيل المثال ، الخوف (كم يجب أن يتجاوز جيش العدو جيشه حتى يبدأ الذكاء الاصطناعي في التفكير في العالم). كل هذا يتم من أجل جعل تصرفات الذكاء الاصطناعي أكثر منطقية ومفهومة. لكن على أي حال ، نحن الآن نعرف أن هذا هو في الواقع حادث متنكر عادي.

لاحظت أيضًا أن اللاعبين يمنحون الذكاء الاصطناعي حقًا ببعض الميزات غير العادية بالنسبة له. على سبيل المثال ، إذا أعلن لاعب في لحظة معينة الحرب على العديد من البلدان ، فسوف يفكر أولاً وقبل كل شيء في أن هذه مؤامرة ضده ، وليس مجرد صدفة. وإذا تم إرسال اللاعب اقتراحًا لإبرام اتفاقية عدم اعتداء ، فسيظن أن الجار يخاف على أرضه. لكن لسوء الحظ ، هذا ليس كذلك. الواقع مليء بخيبة الأمل.

Source: https://habr.com/ru/post/ar473952/


All Articles