Mari Bermain Jurus Bisa!
Meskipun Moogie adalah pemenang saat ini, jika ada yang bisa mengambil mahkotanya, mereka didorong untuk melakukannya
Menendang kaleng adalah permainan anak-anak. Melibatkan satu bek, dan banyak penyerang. Hari ini tidak lagi permainan seperti itu! Tugas Anda adalah menulis bot yang memainkannya, untuk menang, gaya raja-of-the-hill !
https://en.wikipedia.org/wiki/Kick_the_can
Ada beberapa perbedaan utama dalam game ini. Perbedaan utama pertama adalah bahwa gim ini multipemain (5v5). Perbedaan utama kedua adalah bahwa kedua set bot dapat membunuh dan menghilangkan pemain musuh dengan kedua ranjau dan bom yang dilempar! Bot tidak dapat melihat ranjau apa pun (berapapun jaraknya) atau pemain yang jaraknya lebih dari lima blok!
Peta adalah labirin sebagai berikut.
Labirin ini dihasilkan secara prosedural dengan terlebih dahulu menciptakan sebuah labirin menggunakan algoritma pengacakan mundur rekursif pertama yang mendalam. Dan kemudian menempatkan lubang yang ditampilkan di (serta membuat labirin lebih "tidak sempurna". Labirin adalah lebar 65x65 blok, dan nol diindeks. Dengan demikian bendera biru (dapat) berada di 1,1 dan bendera merah (dapat) adalah di 63,63. Tim biru memunculkan di 2,2 dan 3,3 4,4 dll tim merah memunculkan di 62,62 dan 61,61, 60,60 dll. Blok di cyan adalah bot di tim biru, dan blok di magenta adalah bot merah. Permainan ini selalu lima lawan lima. Setiap bot dalam tim akan menggunakan kode Anda (tetapi dapat menyimpan variabel instance lainnya (atau membuat file lokal) untuk melacak status dan membedakan peran.
Gameplay
Tambang dapat ditempatkan seperti yang Anda lihat dalam warna abu-abu. Dan bom bisa dilempar jarak maksimal hingga empat blok. Ini berjalan hingga empat blok melalui dinding dan pemain lain hanya membunuh musuh yang menghalangi jalan Anda. Setelah setiap langkah, mereka memiliki peluang 40% untuk jatuh. Jadi mereka memiliki 100% peluang 1 kisaran 60% pada 2 kisaran 36% pada 3 kisaran dan 21,6% pada tiga rentang Menempatkan tambang atau melempar bom membutuhkan satu tim amunisi. Ini dimulai pada 0 dan dapat ditingkatkan dengan mengumpulkan kotak oranye. Perhatikan bahwa empat (4) cache amunisi ini akan terpusat dengan nyaman. Bot berbaris dalam array dua merah dan dua biru. Yaitu RRRRRBBBBB. Mengukur bendera diizinkan, tetapi berhati-hatilah karena berada di dekat bendera (yaitu kurang dari lima blok) menghasilkan kelambatan, dan hanya memungkinkan bergerak. setiap tiga putaran. Arena memilih starter acak untuk setiap belokan. SAYA.
Objektif
Program lima bot Anda (masing-masing memiliki file kelas yang sama) untuk berhasil menavigasi labirin dan menyentuh kaleng yang berlawanan sambil berhati-hati untuk tidak sengaja merobohkan kaleng sendiri, atau menginjak tambang.
Pemrograman
Entri arena dan bot saat ini di Jawa namun pembungkus stdin / out ada untuk bahasa lain.
Kode arena akan tersedia tetapi di sini adalah rincian yang relevan.
Kelas Bot
public class YourUniqueBotName extends Bot{
public YourUniqueBotName(int x , int y, int team){
super(x,y,team);
//optional code
}
public Move move(){//todo implement this method
//it should output a Move();
//A move has two paramaters
//direction is from 0 - 3 as such
// 3
// 2-I-0
// 1
// a direction of 4 or higher means a no-op (i.e stay still)
//And a MoveType. This movetype can be
//MoveType.Throw
//MoveType.Mine
//MoveType.Defuse defuse any mine present in the direction given
//MoveType.Move
}
}
Metode Utama Yang Tersedia
Perhatikan bahwa menggunakan teknik apa pun untuk memodifikasi atau mengakses data yang secara umum tidak boleh Anda akses tidak diizinkan dan akan mengakibatkan diskualifikasi.
Arena.getAmmo()[team];//returns the shared ammo cache of your team
Arena.getMap();//returns an integer[] representing the map. Be careful since all enemies more than 5 blocks away (straight line distance) and all mines are replaced with constant for spaces
//constants for each block type are provided such as Bot.space Bot.wall Bot.mine Bot.redTeam Bot.blueTeam Bot.redFlag Bot.blueFlag
Arena.getAliveBots();//returns the number of bots left
getX();//returns a zero indexed x coordinate you may directly look at (but not change X)
getY();//returns a zero indexed y coordinate (y would work to, but do not change y's value)
//Although some state variables are public please do not cheat by accessing modifying these
Spesifikasi Antarmuka StdIn / Out wrapper
Antarmuka terdiri dari dua mode: inisialisasi dan berjalan.
Selama mode inisialisasi, satu frame INIT dikirim melalui stdout. Spesifikasi bingkai ini adalah sebagai berikut:
INIT
{Team Membership Id}
{Game Map}
TINI
Di mana: {Id Keanggotaan Tim} adalah karakter tunggal: R atau B. B yang berarti tim biru, R yang berarti tim merah.
{Game Map} adalah serangkaian baris karakter ascii yang mewakili satu baris peta. Karakter ascii berikut ini valid: F = bendera biru G = bendera merah O = ruang terbuka W = dinding
Gim kemudian akan melanjutkan untuk mengirim bingkai gim di stdout ke masing-masing bot dengan demikian:
FRAME
{Ammo}
{Alive Bot Count}
{Bot X},{Bot Y}
{Local Map}
EMARF
Dimana:
{Ammo} adalah string angka, nilainya akan 0 atau lebih besar {Alive Bot Count} adalah string digit, nilainya akan 0 atau lebih besar {Kotak X} adalah string digit yang mewakili koordinat X bot di peta permainan. Nilai akan menjadi 0 <= X <Lebar Peta. {Kotak Y} adalah serangkaian angka yang mewakili koordinat Y bot pada peta permainan. Nilai akan menjadi 0 <= Y <Tinggi Peta. {Local Map} adalah serangkaian baris karakter ascii yang mewakili seluruh peta yang mengelilingi bot. Karakter ascii berikut ini valid: F = bendera biru G = bendera merah O = ruang terbuka W = dinding R = bot tim merah B = bot tim biru M = tambang A = amunisi
Pengontrol mengharapkan bahwa bot Anda kemudian akan menampilkan (ke stdout) respons satu baris dalam format:
{Action},{Direction}
Dimana:
{Action} adalah salah satu dari: Move Defuse Mine Throw
{Direction} adalah satu digit antara 0 dan 4 inklusif. (lihat informasi arah sebelumnya)
CATATAN: semua string akan dibatasi oleh \ n karakter End of Line.Ini akan menjadi turnamen eliminasi. Bot sampel saya akan berpartisipasi sebagai pengisi, tetapi saya tidak akan memberi diri saya kemenangan. Dalam hal kemenangan oleh salah satu bot saya, gelar pergi ke anggota tempat kedua, dan akan berlanjut sampai ada bot yang bukan milik saya. Setiap pertandingan terdiri dari 11 putaran tendangan can. Jika tidak ada tim yang memenangkan satu pertandingan pun maka mereka berdua tersingkir. Jika ada seri skor satu nol, pertandingan tie breaker akan dimainkan. Jika dasi tetap keduanya dihilangkan. Putaran selanjutnya mungkin terdiri dari lebih banyak pertandingan. Penyemaian turnamen akan didasarkan pada jumlah upvotes per 7/31/16 (tanggal dapat berubah).
Setiap pertandingan berlangsung 4096 putaran. Kemenangan memberikan satu poin. Dasi atau kehilangan memberikan poin nol. Semoga berhasil!
Jangan ragu untuk melihat kode atau mengkritiknya di Repo GitHub ini.
https://github.com/rjhunjhunwala/BotCTF/blob/master/src/botctf/Arena.java
Perhatikan bahwa saya tidak memiliki penerjemah untuk bahasa yang terlalu banyak di komputer saya, dan saya mungkin perlu sukarelawan untuk menjalankan simulasi di komputer mereka. Atau saya bisa mengunduh juru bahasa. Harap pastikan bahwa bot Anda.
- Tanggapi dalam jumlah waktu yang wajar (katakanlah 250 ms)
- Tidak akan merusak mesin host saya
sumber
Jawaban:
NavPointBot, Java 8
Bot berwarna putih / biru
Bot ini menominasikan pemimpin dari bot ramah setiap frame yang kemudian akan menetapkan poin nav untuk setiap bot untuk menavigasi.
Pada awalnya, semua bot berada di amunisi depot mencari tugas, kemudian dua bot ditugaskan sebagai penjaga dengan sisanya mencari amunisi dan kemudian menyerang bendera musuh.
Saya menemukan bahwa permainan ini sangat tergantung pada lokasi awal depo. Karena itu saya tidak bisa mengatakan bahwa bot ini lebih baik daripada yang lain.
Jalankan dengan
java NavPointBot
sumber
Pathfinder JAVA yang Dioptimalkan
Terima kasih kepada @Moogie karena membantu saya mengoptimalkan pathfinding floodfill berantakan saya. Di sini adalah sumber untuk bot. Orang ini tahu betapa pentingnya untuk mempertahankan benderanya. Dia merelokasi tiga bek dan dua penyerang. Para pembela mundur dan mempertahankan / mengumpulkan amunisi, kedua penyerang mengambil jalan (yang cukup lurus) ke bendera (dan mengumpulkan amunisi di tengah). Dia menembak siapa pun yang dia lihat, dan harus menjadi kompetisi yang ketat. Para pembela menempatkan ranjau di sekitar bendera dan kamp sampai tidak ada oposisi yang tersisa sehingga mereka bisa pergi dan menendang kaleng.
sumber