BattleAI 2018

"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 class MoveStrategy (penerapan strategy design pattern). Nama class sesuaikan dengan nama kelompok masing-masing dengan format UpperCamelCase.
Di dalam MoveStrategy, terdapat pure virtual function move 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: Catatan: Mengakses berarti bersebelahan secara vertikal atau horizontal.
Contoh jumlah produksi pada peta 'column.txt'
Berikut penjelasan produksi material pada contoh diatas:

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
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: