Seperti yang saya tulis AI untuk strategi turn-based

Halo semuanya. Saya pikir dari judulnya jelas bahwa kita akan berbicara tentang penciptaan kecerdasan buatan (selanjutnya hanya AI), tentang keputusan apa yang dibuat dan apa yang akhirnya terjadi. Tetapi pertama-tama Anda harus meningkatkan kecepatan Anda.

Game ini ditulis dalam bahasa pemrograman Lua, jadi saya akan memberikan contoh kode dalam bahasa ini.

Saya akan menjelaskan beberapa detail game yang penting untuk AI:

  1. Permainan adalah strategi berbasis giliran. Pertama, pemain berjalan, lalu AI melakukan aksinya untuk masing-masing negara. AI hanya berfungsi ketika Anda mengklik Langkah selanjutnya dan tidak tahu apa yang terjadi di lain waktu.
  2. Gim ini memiliki peta tempat Anda dapat merekrut / memindahkan / mengerahkan pasukan. AI harus menganalisisnya dan membuat keputusan yang diperlukan.
  3. Dalam permainan, Anda dapat membuat perdamaian / menyatakan perang / menandatangani pakta non-agresi / masuk ke dalam dan mengakhiri aliansi. AI harus mampu mengatasi ini.
  4. Institusi teknologi dan politik hanya tersedia untuk pemain. Bonus AI tidak berubah sejak awal permainan, tidak seperti pemain.

Fungsi yang bertanggung jawab untuk memulai langkah selanjutnya terlihat seperti ini:

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

Anda harus memperhatikan fungsi sulap calc_ai , yang bertanggung jawab atas semua tindakan bot. Anda masih dapat melihat satu detail menarik: fungsi dilakukan bergantian untuk setiap negara.

Sekarang kita jawab pertanyaannya, apa yang terjadi di 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 

Sampai kami sangat memahami bagaimana AI membuat keputusan dalam politik, kami mencatat hal-hal berikut:

  1. Ada cek bahwa AI tidak sengaja pergi untuk pemain atau untuk Undeveloped_land yang tidak bisa dipahami. Ini hanya tanah tanpa negara (Faktanya, sebuah provinsi harus selalu memiliki negara yang memilikinya, jadi Undeveloped_land adalah sebutan utamanya untuk permainan).
  2. AI memilih tabel yang berbeda untuk berinteraksi dengan negara, tergantung pada apakah pemain mengontrolnya atau tidak.
  3. AI pertama-tama menggerakkan tentara, dan baru kemudian mempekerjakan.

fixed_ai_data - tabel itu sendiri. Dinamai demikian karena tidak berubah (lebih tepatnya, variabel selalu merujuk ke tabel root).
ai_data - tabel itu sendiri, yang berubah tergantung pada apakah bot berurusan dengan pemain atau tidak (variabel hanya merujuk ke tabel yang diinginkan).

Faktanya, gim ini hanya memiliki satu tabel yang terkait dengan AI, dan tampilannya seperti ini:

 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 - tingkat kesulitan. Ada beberapa tingkat kesulitan, dan nilai-nilai dalam tabel yang berbeda bervariasi.

peace , war - negara bagian. Tabel peace digunakan untuk tindakan apa pun, tabel war hanya untuk tindakan dengan musuh.

Tabel player ketiga berisi tabel peace dan war dengan nilai yang diubah. Seperti yang sudah Anda ketahui, dalam sebuah game AI dapat memiliki sikap yang berbeda dengan pemain dan bot.

Nilai-nilai dalam tabel, saya pikir, jelas berdasarkan nama. Tapi bagaimanapun, kami akan mempertimbangkan beberapa dari mereka.

Sementara itu, kita perlu mencari tahu bagaimana AI bekerja dalam game. Semuanya sederhana di sini, tergantung pada keadaan, bot dapat memilih nilai apa pun dari daftar. Angka-angka di atas adalah probabilitas terjadinya setiap peristiwa. Pertimbangkan sebuah contoh:
pact = 0.005 - berarti bahwa dengan peluang 0,005 suatu negara akan menawarkan negara lain untuk menyimpulkan pakta non-agresi. Ya, semuanya sederhana. Anda dapat mengatakan: "Bagaimana Anda bisa bermain, mengetahui bahwa AI melakukan semuanya secara acak?" Sebenarnya, itu tidak begitu, dan kami akan menganalisisnya nanti.

Sementara itu, lihat fungsi berikut:

 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 - Nomor acak dari 0 hingga 1
state - Negara bagian
Fungsi get_answer hanya mengembalikan tindakan acak. Mengapa ini diperlukan, dan mengapa Anda tidak bisa hanya memeriksa option <kesempatan bertindak, saya pikir itu tidak perlu dijelaskan.

Fungsi ini diperiksa dalam semua tindakan yang mungkin untuk AI:

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

Semuanya sederhana. Ini, tampaknya, bisa selesai, tetapi tidak.

Mari kita perjelas beberapa poin:

  1. AI menyatakan perang terhadap tetangga dan non-tetangga dengan peluang berbeda ( war , war_neighbour )
  2. Negara-negara kecil lebih cenderung bergabung dengan serikat pekerja daripada yang besar ( alliance , alliance_small )
  3. AI iri. Nama itu tidak sepenuhnya jelas, tetapi ini adalah kesempatan di mana negara akan menyatakan perang terlalu kuat menurut standar kekuatan permainan.
  4. Kami lupa tentang tabel bonus. Ini menyimpan nilai-nilai yang sama sekali tidak terkait dengan sikap terhadap negara lain, misalnya, bonus untuk pertumbuhan populasi atau kesempatan untuk meningkatkan provinsi.

Ini tidak berakhir di sana (kecuali jika Anda tertarik, tentu saja). Adalah aneh ketika suatu negara menyatakan perang tanpa alasan, dan bahkan lebih aneh lagi ketika negara itu tidak siap untuk perang ini. Karena itu, AI dalam permainan memiliki strategi. Saya akan menjelaskan bahwa alih-alih serangan mendadak, dalam banyak kasus negara ini memulai strategi.

Setiap negara dalam file simpan memiliki bidang-bidang berikut:

  • strategy - pengidentifikasi strategi. Itu terjadi:
    1. retreat - sebuah negara mengurangi tentaranya untuk menghemat uang.
    2. recruit - negara ini mempekerjakan tentara maksimum.
  • target adalah target. Ini adalah negara di mana AI kami memutuskan untuk menyatakan perang, tetapi memulai strategi.
  • ultimatum - nil, jika tidak ada ultimatum, data tentang ultimatum, jika ada.
  • value - jumlah gerakan sebelum deklarasi perang. Saya tidak bisa membuat nama variabel yang lebih baik, maaf.

Artinya, jika AI memulai strategi, maka dia:

  1. Mengurangi pasukannya dan menghemat uang.
  2. Menyewa tentara setinggi mungkin.
  3. Menyatakan perang terhadap pemain.



Dengan peluang tertentu, suatu negara dapat mengajukan ultimatum, yang dalam pelaksanaannya perang dibatalkan. Sebagai contoh:
Kurangi pasukan Anda di provinsi lipetsk menjadi 5.000, jika tidak, kami akan menyatakan perang terhadap Anda.

Dari lucu: ada satu bug yang menarik atau bahkan cacat ketika negara menuntut untuk mengurangi tentara di provinsi, dan pemain berhasil kehilangan ultimatum sampai habis masa berlakunya. AI tidak memperhitungkan provinsi dan, jika ultimatum tidak dihormati, menyatakan perang.



Ada dua variabel yang bertanggung jawab atas peluang untuk mendukung pemain (mentransfer emas ke pemain). Yang pertama selalu berhasil, kecuali untuk keadaan perang dengan negara yang diperhitungkan. Dan yang kedua, dengan sangat penting, diperhitungkan ketika ada musuh bersama.

Berbagai variabel juga ditambahkan, misalnya, ketakutan (seberapa banyak pasukan musuh harus melebihi miliknya sendiri agar AI mulai berpikir tentang dunia). Semua ini dilakukan untuk membuat tindakan AI tampak lebih logis dan dapat dimengerti. Tapi bagaimanapun, sekarang kita tahu bahwa ini sebenarnya kecelakaan biasa yang disamarkan.

Saya juga memperhatikan bahwa para pemain benar-benar memberkahi AI dengan beberapa fitur yang tidak biasa baginya. Misalnya, jika pada saat tertentu seorang pemain menyatakan perang terhadap beberapa negara, dia akan berpikir pertama-tama bahwa ini adalah konspirasi melawannya, dan bukan hanya kebetulan. Dan jika pemain dikirim proposal untuk menyimpulkan pakta non-agresi, ia akan berpikir bahwa tetangga takut akan tanahnya. Tapi, sayangnya, tidak demikian. Realitas penuh dengan kekecewaan.

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


All Articles