"Talk is cheap. Show me the code." - Linus Torvalds
BattleAI adalah turnamen yang terinspirasi dari Battlecode (www.battlecode.org) yang merupakan kompetisi sekaligus salah satu matakuliah di MIT. Turnamen ini diadakan dengan tujuan untuk meningkatkan semangat dan kemampuan mahasiswa dalam membuat program berbasis algoritma AI.
BattleAI 2018 diperuntukkan untuk mahasiswa Artificial Intelligence kelas LN01. BattleAI akan digunakan sebagai nilai Tugas Mandiri. Untuk mendapatkan nilai, AI masing-masing kelompok akan diadu dengan sistem turnamen, juara 1 dalam kompetisi dipastikan mendapat nilai 100. Dosen juga akan menyediakan AI yang relatif mudah untuk dikalahkan. Bila AI yang disediakan gagal dikalahkan akan mendapat nilai 0-65 (tergantung kualitas code). Bila berhasil akan mendapat nilai 75-100 (tergantung kualitas code). Mahasiswa bebas menerapkan algoritma apa pun (batas waktu komputasi tiap putaran: 15 detik), boleh menggunakan library apa pun. Berikut plot penilaiannya:
Keterangan
Nilai
Tidak mengerjakan, plagiat, freeriding, atau tindakan curang lainnya
0
Gagal mengalahkan AI dari dosen
0 - 65
Berhasil mengalahkan AI dari dosen
75 - 100
Menang turnamen
100
Code yang digunakan dapat diambil di: https://github.com/mrp130/BattleAI-2018. Code dibuat dalam bahasa C++.
Tiap kelompok membuat AI untuk game tersebut dengan cara membuat class baru yang merupakan turunan dari abstract classMoveStrategy (penerapan strategy design pattern). Nama class sesuaikan dengan nama kelompok masing-masing dengan format UpperCamelCase.
Di dalam MoveStrategy, terdapat pure virtual functionmove yang harus di-override. Fungsi move memiliki parameter berupa Map. Map yang dioper adalah hasil deep copy dari Map asli yang digunakan di dalam permainan. Silahkan gunakan deep copy ini untuk keperluan komputasi AI. Fungsi move akan mengembalikan nilai sebuah string yang digunakan untuk menjalankan permainan. Untuk mengganti strategi pergerakan tim, ubah di Map.cpp.
Penentuan strategi masing-masing tim di Map.cpp
Kumpulkan class yang telah Anda buat ke mikaelphang@gmail.com
Format subject email: BATTLEAI_2018_[NamaKelompok]
Contoh subject: BATTLEAI_2018_DemiLulusAI
Deadline: 31 Desember 2018
Penjelasan Gameplay
Permainan memiliki peta berukuran 5 x 5 dengan sistem koordinat mirip dengan notasi catur (huruf dan angka). Permainan akan berlangsung selama 20 putaran. Di dalam permainan terdapat dua tim, tim A dan tim B. Masing-masing tim memiliki material yang dapat digunakan untuk membangun base (huruf kapital sesuai dengan nama tim) atau unit (huruf kecil sesuai dengan nama tim). Terdapat beberapa mine (tambang, huruf 'M') yang tersebar di dalam peta. Dalam peta juga terdapat dinding yang tidak bisa dilewati, disimbolkan dengan karakter '#'. Di setiap awal permainan, masing-masing tim akan memiliki 1 buah base dan 5 material. Setiap putaran, aksi pergerakan tim akan dijalankan secara simultan.
Tampilan awal peta 'less_wall.txt'
Material
Material dapat dimanfaatkan untuk membangun base atau unit. Base memiliki biaya sebesar 10 material dan mengorbankan satu unit. Unit memiliki biaya sebesar 4 material.
Material dapat diproduksi setiap putarannya dengan perhitungan sebagai berikut:
Tiap base memproduksi 2 material
Tiap unit yang mengakses sebuah mine memproduksi 1 material
Tiap base yang mengakses sebuah mine memproduksi 2 material tambahan
Bila ada tim lain yang memiliki akses terhadap sebuah mine, produksi berhenti sementara. Mine hanya bisa digunakan bila tim berhasil memonopoli akses.
Catatan: Mengakses berarti bersebelahan secara vertikal atau horizontal.
Contoh jumlah produksi pada peta 'column.txt'
Berikut penjelasan produksi material pada contoh diatas:
Tim A memiliki 2 buah base di A3 dan A4: 2 x 2 = +4
Base tim A di koordinat A4 memonopoli mine A5: +2
Unit tim A di koordinat C2 memonopoli mine C1: +1
Total produksi tim A: +7
Tim B memiliki 1 buah base di E3: +2
Unit tim B di koordinat E2 memonopoli mine E1: +1
Unit tim B di koordinat D5 memonopoli mine D4: +1
Unit tim B di koordinat C4 memonopoli mine D4: +1
Total produksi tim B: +5
Mine di C3 tidak bisa ditambang karena bisa diakses kedua tim.
Move
Dalam permainan, format notasi yang digunakan adalah [koordinat awal]['-'][koordinat akhir], contoh A3-B3. Terdapat beberapa gerakan yang dapat dilakukan, yaitu:
Mengirim unit baru
Menggerakkan unit
Membangun base
Mengirim unit baru
Untuk mengirim unit baru, koordinat awal adalah base tim sendiri. koordinat akhir adalah koordinat yang valid untuk melakukan gerakan (akan dijelaskan di bagian 'menggerakkan unit'). Material harus cukup ketika ingin mengirim unit baru.
Peta sebelum (kiri), peta sesudah tim A dan tim B mengirim unit (kanan)
Menggerakkan unit
Untuk menggerakkan unit, koordinat awal adalah unit tim sendiri. koordinat akhir adalah koordinat yang valid untuk melakukan gerakan. Koordinat akhir yang valid adalah koordinat yang bersebelahan (secara horizontal atau vertikal) dengan unit tersebut. Koordinat akhir tersebut haruslah koordinat yang ditempati musuh atau tempat kosong. Bila koordinat akhir tidak bersebelahan, unit bisa bergerak menembus mine, base milik sendiri, serta unit milik sendiri, yang saling bersebelahan.
Peta sebelum (kiri), peta sesudah (kanan)
Pada peta diatas, tim A menggerakkan unit ke tempat kosong di kiri koordinat sebelumnya. Tim B menggerakkan unit ke tempat kosong di kanan koordinat sebelumnya.
Peta sebelum (kiri), peta sesudah (kanan)
Pada peta diatas, tim A menggerakkan unit melewati 2 unit dan 1 mine di B2, B3, dan B4. Menyerang unit tim B di koordinat C4.
Tim B mengirim unit baru dari base C5 ke koordinat kosong di D2. Melewati C4, D4, dan D3.
Membangun base
Untuk membangun base, koordinat awal adalah unit tim sendiri. koordinat akhir adalah koordinat yang sama dengan koordinat awal. Material harus cukup ketika ingin membangun base. Setelah base berhasil dibangun, unit pada koordinat tersebut akan dihilangkan dari peta.
Peta sebelum (kiri), peta sesudah tim A dan tim B membangun base baru (kanan)
Akhir putaran
Semua pergerakan tim akan dilakukan secara simultan, sehingga memungkinkan tim bisa saling serang di koordinat tujuan yang sama, atau unit kabur ke koordinat lain. Setelah semua pergerakan tim dijalankan, bila ada lebih dari satu tim menempati koordinat yang sama, maka semua base dan unit di koordinat tersebut akan dimusnahkan.
Game Over
Permainan berakhir bila satu tim berhasil menghancurkan semua base lawan. Tim yang masih memiliki base tersebut dinyatakan sebagai pemenangnya. Bila sampai putaran ke-20 tidak ada tim yang kehilangan semua base-nya, maka permainan dihentikan dan tim yang memiliki total poin lebih banyak dinyatakan sebagai pemenangnya. Poin dihitung sebagai berikut: