Tantangan ini diinspirasi oleh tantangan luar biasa @HelkaHomba Merah vs Biru - Pixel Team Battlebots . Tantangan itu mungkin adalah yang terbaik yang pernah saya lihat di situs ini. Pernah.
Tantangan saya masih jauh berbeda, tetapi @HelkaHomba layak mendapat pujian karena inspirasi.
Ikhtisar
Ini adalah tim king-of-the-hill tempat tim Anda menang dengan membiarkan semua pemain tetap hidup di tim Anda. Dengan kata lain, kedudukan tim terakhir menang. Pengundian akan dilakukan kembali.
Anda berada di papan tulis. Anda tahu posisi Anda di babak pertama (centang 0). Anda juga tahu siapa yang ada di sekitar Anda:
Dalam hal ini, Anda sendirian (atau begitulah menurut Anda) tanpa ada orang di sekitar Anda. Anda dapat melihat item di sekitarnya dalam argumen pertama ke ontick
penangan Anda . Lebih lanjut tentang API nanti.
Tim Anda
Tim Anda ditentukan oleh ID pengguna Anda. Untuk mengetahuinya, klik pada gambar profil Anda:
Kemudian cari ID pengguna Anda di bilah alamat:
Jika aneh, Anda berada di tim biru.
Jika bahkan, Anda berada di tim merah.
Sama-sama untuk lingkaran yang digambar tangan.
Nama (bot) Anda
Nama bot Anda dimulai dengan huruf pertama dari tim Anda ("r" atau "b"). Itu harus cocok dengan regex /^(r|b)[A-Za-z_-]$/
. Selain itu, Anda dapat memilih nama bot Anda. Tolong jangan gunakan yang sudah ada.
Mulai
Pemain merah akan mulai di dekat bagian atas peta, dan biru akan mulai di dekat bagian bawah. Anda diberi info khusus pada centang pertama (belok) di environment
parameter untuk ontick
fungsi. Saya sarankan menyimpannya. Lihat API untuk detailnya.
Sekarang giliranmu
Ubah urutan awalnya secara acak, tetapi kemudian tetap sama.
Putar tindakan
Anda hanya dapat melakukan satu tindakan per giliran.
Pindah
Saat Anda ingin pindah, Anda memanggil
this.move(num)
API.num
adalah sel yang ingin Anda pindahkan:Lokasi relatif dari angka yang dapat Anda pindahkan disimpan dalam konstanta global
threeByThree
:
[
[0, 1, 2],
[3, undefined, 4],
[5, 6, 7]
]
Jika Anda pindah ke dinding, atau pemain lain, tidak ada yang terjadi.
Memutar
Untuk memutar, Anda menelepon
this.rotate(num)
. Num adalah arah yang ingin Anda putar:Rotasi mutlak.
Membunuh
Jika pemain lain (dari tim lain) ada di sel yang Anda hadapi, Anda dapat memanggil
this.kill()
dan membunuh mereka. Jika tidak ada seorang pun di sana, atau mereka ada di tim Anda, ini tidak melakukan apa-apa. Contoh:Jika Anda beralih ke
0
, Anda dapat membunuh hijau. Jika Anda berubah menjadi 1, Anda dapat membunuh biru. Jika Anda berubah menjadi 2, Anda dapat membunuh oranye. Jika Anda berubah menjadi 3, Anda dapat membunuh kuning.Bom
Pemboman membunuh semua pemain termasuk Anda dan rekan satu tim di 9 kotak di sekitar Anda. Contoh:
Mengapa Anda ingin melakukan ini? Kamikaze . Jika ada lebih banyak pemain yang tidak ada dalam tim Anda di 9 sel di sekitar Anda, maka ada di tim Anda, Anda mungkin mempertimbangkan untuk melakukan pengeboman. (Saya sarankan Anda memberi tahu teman Anda terlebih dahulu!)
Tempatkan ranjau darat
Ini menciptakan kotak kematian bagi orang lain yang tidak ada di tim Anda. Ketika Anda menempatkan ranjau darat, Anda juga bergerak sehingga Anda tidak menginjaknya. Anda menyebut di
this.landMine(num)
mana num adalah kotak yang ingin Anda tuju. Contoh:Kemudian Anda menelepon
this.landMine(4)
:Lihat itu "M"? Itu ranjau darat. Orang lain dapat melihatnya ... untuk saat ini. Siapa pun, bahkan mereka yang tidak di tim Anda, dapat melihat ranjau darat pada kutu yang ditempatkan. Tetapi setelah kutu itu selesai, tidak seorang pun, bahkan Anda tidak dapat melihatnya. Tapi itu akan meledak segera setelah musuh melewatinya. Contoh:
Biru pindah ranjau darat Anda, dan BOOM! Anda baru saja mendapat pembunuhan lain.
Untuk setiap 2 pembunuhan yang Anda dapatkan (dari pembunuhan langsung atau ranjau darat), Anda mendapatkan 1 ranjau darat tambahan untuk ditempatkan. Anda juga mendapatkan satu di awal.
Menggali
Saat Anda menggali, Anda mencari ranjau darat di area 5x5 yang berpusat di sekitar Anda. Ini tidak menunjukkan tim bot yang menempatkan ranjau darat. (Ingatlah bahwa Anda tidak dapat dibunuh oleh ranjau darat yang ditempatkan oleh seseorang di tim Anda.) Misalnya, jika ini adalah kotak di sekitar Anda:
Maka nilai kembalinya
this.dig()
adalah:
[undefined,undefined,undefined,true,undefined,
undefined,undefined,undefined,undefined,undefined,
undefined,undefined,undefined,undefined,
undefined,undefined,true,undefined,undefined,
true,undefined,undefined,undefined,undefined]
Indeks array berasal dari mulai di kiri atas, ke kanan, daripada ke bawah, tidak termasuk Anda:
Total ada 23, dan lokasi relatifnya disimpan dalam konstanta global fiveByFive
:
[
[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[10, 11, undefined, 12, 13],
[14, 15, 16, 17, 18],
[19, 20, 21, 22, 23]
]
Perhatikan bahwa penggalian mengungkapkan ranjau yang ditempatkan pada kutu sebelumnya, tidak seperti aroundMe
.
Komunikasi
Ketika Anda ingin berbicara dengan seseorang, Anda menelepon this.sendMessage(recipients, team, data)
. Data dapat berupa apa pun yang Anda inginkan, dan Anda dapat mengirimkannya kepada siapa pun yang Anda inginkan, bahkan pemain di tim lain. Ini dapat digunakan untuk mengelabui bot yang tidak terprogram, tetapi semua pemain dapat melihat siapa yang mengirim pesan dan siapa tim mereka.
Contoh:
Kirim sesuatu ke bot bernama "redisbest":
this.sendMessage("redisbest", undefined, "Hi!");
Kirim sesuatu ke bot bernama "redisbest" dan "blueiscool":
this.sendMessage(["redisbest", "blueiscool"], undefined, {hello: "there"});
Kirim sesuatu ke seluruh tim merah
this.sendMessage(undefined, "red", {hello: "red"});
Kirim sesuatu ke semua orang
this.sendMessage(undefined, "*", {hello: "everyone"});
Kirim sesuatu ke seluruh tim merah dan bot bernama "blueiscool":
this.sendMessage("blueiscool", "red", {hello: "bots"});
API
Kode Anda harus terdiri dari satu panggilan ke createBot
fungsi. Tidak ada lagi. Kode sampel:
createBot({
ontick: function(environment) {
return new Promise((resolve, reject)=>{
this.move(0);//example
resolve();//please call this when you are done
});
},
onmessage: function(data, from, fromBot) {
console.log("onMessage: " + this.name + " from " + this.team + " got message ", data, " from " + from + ", on team " + fromTeam);
this.sendMessage(["bot", "otherbot"], "team", "some data");
},
team: "red",//your team
name: "rmyteamname",//team name must begin with the first letter of your team's name
onkill: function(){
//say goodbye
}
});
(Anda bebas menyalin-menempelkan ini. Cukup modifikasi untuk tim Anda, dll.)
Metode
ontick(environment)
Disebut kapan giliran Anda. Harus mengembalikan
Promise
yang menyelesaikan dalam 1 detik atau kurang atau itu akan diabaikan. Ini untuk alasan kinerja dan memiliki efek samping yang bagus karena tidak memiliki tab hang.this
(ketika dalam ontick)landMines
Berapa banyak ranjau darat yang tersisa. Semakin banyak pembunuhan yang Anda miliki, semakin banyak ranjau darat yang Anda dapatkan. Untuk setiap 2 bot yang Anda bunuh, Anda mendapatkan 1 ranjau darat lagi. Anda juga mendapatkan 1 untuk memulai.direction
Arah yang Anda hadapi.storage
Penyimpanan yang tetap ada di antara panggilan keonTick
danonMessage
. Objek kosong di awal. Ubah untuk tujuan apa pun, tetapi pastikan array atau objek selalu untuk memastikannya tetap benar.move(num)
Pindah ke posisi yang ditentukan. Tidak melakukan apa pun jika tidak valid. Lihat detail di atas.rotate(num)
Putar ke posisi yang ditentukan. Tidak melakukan apa pun jika tidak valid. Lihat detail di atas.kill()
Membunuh pemain yang Anda hadapi, jika ada dan tidak ada di tim Anda. Lihat detail di atas.bomb()
Membunuh siapa pun di 9 kotak di sekitar Anda, termasuk diri Anda.landMine(num)
Tempatkan ranjau darat di tempat Anda berada, dan kemudian pindah ke posisi yang ditentukan. Tidak melakukan apa pun jika tidak validnum
atau Anda tidak memiliki yang tersisa. Lihat detail di atas.dig()
baru! Mengembalikan serangkaian info tentang ranjau darat di area 5x5 yang berpusat di sekitar Anda. Lihat detail di atas.sendMessage(recipients, team, data)
recipients
dapat berupa bot tunggal (string), array bot, atauundefined
/null
. Ini adalah siapa yang ingin Anda kirimi pesan.team
adalah serangkaian tim yang ingin Anda kirimi pesan. Gunakan"*"
untuk mengirim pesan ke semua orang.data
adalah segala sesuatu yang dapat diteruskan ke fungsi JS. Itu dikirim ke penerima. Jika itu adalah objek atau array, itu dilewatkan dengan referensi , sehingga Anda dan penerima dapat menyimpannya ke merekastorage
dan setiap modifikasi pada objek mempengaruhi salinan bot keduanya. Perhatikan bahwa penerima yang berada di salah satu daftar bots, bot yang tepat yang ditetapkan dalam string, atau bot di tim Anda tentukan, maka akan mendapatkan pesan.
environment
Pada centang pertama
x
: Posisi x pemain Anday
: Posisi-Y pemain AndagridWidth
: Lebar kotak (dalam sel)gridHeight
: Tinggi kotak (dalam sel)Pada semua kutu
aroundMe
: Array pemain dan ranjau darat. Para pemain adalah benda yang terlihat seperti{name: "bot name", team: "bot team"}
, dan ranjau darat{team: "team of bot who placed mine"}
. Indeks array:Perhatikan bahwa ranjau darat yang ditempatkan pada kutu selain yang sekarang tidak akan ditampilkan.
aroundMe
contoh:Katakanlah ini adalah kisi (Anda merah):
Anda
aroundMe
akan terlihat seperti ini:
[
{name: "bexamplebluebot", team: "blue"},
undefined,//sparse array, nothing in index 1
undefined,//there is technically a landmine here, but it wasn't placed this tick, so it is not shown
undefined,//nothing in 3
{name: "yexampleyellowbot", team: "yellow"},
{team: "red"},//this is a landmine, you can tell is not a bot because it has no name. mines have the team name of the player they were placed by. This mine was placed this tick, otherwise you couldn't see it
//nothing else after index 5, so the array's length is 5.
]
Indeks array dijelaskan di sini:
Bot Anda secara efektif melihat ini:
onmessage(data, fromBot, fromTeam)
this
(ketika di onmessage)sendMessage(recipients, team, data)
Fungsi pengiriman pesan standar.storage
Penyimpanan standar.
data
Data yang dikirim dari pengirim.fromPlayer
Pemain dari mana pesan itu dikirim.fromTeam
Tim dari mana pesan itu dikirim.onkill()
this
(ketika di onkill)sendMessage(recipients, team, data)
Fungsi pengiriman pesan standar.
Susunan global yang nyaman (konstan):
threeByThree
:
[
[0, 1, 2],
[3, undefined, 4],
[5, 6, 7]
]
Berguna untuk meneruskan data ke fungsi pemindahan serta menafsirkan aroundMe
. Lihat di atas.
fiveByFive
:
[
[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[10, 11, undefined, 12, 13],
[14, 15, 16, 17, 18],
[19, 20, 21, 22, 23]
]
Berguna untuk this.dig()
fungsi dalam ontick
penangan.
Cobalah!
Pengontrol akan dijalankan dari mesin saya di localhost untuk alasan kinerja, tetapi Anda dapat menggunakan CodePen untuk menguji bot Anda.
Perhatikan bahwa Anda harus menempelkan kode Anda di konsol dan tekan Enter
sebelum Anda mengklik jalankan. Anda dapat menempelkan bot sebanyak yang diinginkan. "Bot uji" adalah contoh yang bisa Anda uji. Jika Anda bisa mengalahkan atau mengikat semuanya, Anda memiliki setidaknya bot yang layak.
Pengajuan
Aturan
Aturan (diberlakukan oleh pengontrol)
ontick
Kode utama Anda tidak boleh lebih dari 1 detik. Kami tidak ingin putaran untuk selamanya. Jika kode Anda membutuhkan> 1 detik, itu akan dihentikan.- Jika Anda mencoba melakukan lebih dari 1 tindakan per giliran, atau melakukan tindakan yang tidak valid (mis.
this.move(-1)
Atau pindah ke dinding), itu akan diabaikan. - Lebih banyak akan datang segera ...
Aturan (diberlakukan oleh saya, dapat menghasilkan DQ)
- Jangan menulis variabel global ( membaca baik-baik saja ).
- Kode Anda harus bekerja di Nodejs (jika pengontrol porting ke Nodejs), jadi
JSON.parse(...)
baik-baik saja, tetapialert()
tidak. - Anda tidak diizinkan untuk memanggil
createBot
atau mengganggu pengontrol dengan cara apa pun . - Jangan gunakan kode orang lain tanpa izin dan perubahan signifikan. Tidak ada salinan.
- Tolong, tidak ada celah!
- Lebih banyak akan datang segera ...
Bot saya
Inilah beberapa bot:
Bot ini secara acak memilih tindakan. Yah, ini acak, tetapi masih cukup acak. Jika Anda dapat membunuh bot ini (itu akhirnya akan membunuh dirinya sendiri, itu tidak masuk hitungan), daripada setidaknya Anda memiliki bot yang layak. Posting dan lihat apa yang terjadi!
Bot saya memiliki nama yang dimulai dengan "x" dan tim "tidak ada". Anda dipersilakan untuk menggunakan beberapa kode ini, tetapi harap lakukan setidaknya beberapa modifikasi. Jika Anda tidak dapat diganggu untuk setidaknya men-tweak nomor, Anda tidak akan menang.
Memformat kiriman Anda
Silakan gunakan format ini:
# rmyamazingbot
createBot({
ontick: function(environment) {
return new Promise((resolve, reject)=>{
this.move(0);//example
resolve();//please call this when you are done
});
},
onmessage: function(data, fromTeam, fromBot) {
console.log("onMessage: " + this.name + " from " + this.team + " got message ", data, " from " + from + ", on team " + fromTeam);
this.sendMessage(["bot", "otherbot"], "team", "some data");
},
team: "red",//your team
name: "rmyteamname",//team name must begin with the first letter of your team's name
onkill: function(){
//say goodbye
}
});
Long, but cool explanation...
Permintaan fitur, bug, pertanyaan, dll?
Komentar dibawah! Silakan periksa untuk melihat apakah sudah ada komentar dengan itu. Jika sudah ada, upvote.
Ingin berbicara dengan tim Anda?
Gunakan ruang obrolan untuk merah dan biru .
Bahasa
Saat ini, hanya JS dan sesuatu yang mengkompilasi ke JS yang didukung, tetapi jika Anda mengetahui cara agar bahasa lain dapat bekerja dengan Nodejs, saya akan dengan senang hati mengirim port controller ke Nodejs.
Catatan akhir
Gagasan strategi
Bantu tim Anda! Membuat bot yang dirancang untuk membantu bot lain dan bekerja bersama. Strategi ini berhasil dengan baik untuk Merah dan Biru - Pixel Team Battlebots
Pencari perwakilan
Saya akan menerima jawaban dengan suara terbanyak di tim pemenang. Perlu diingat bahwa jawaban sebelumnya cenderung mendapatkan lebih banyak suara, tetapi kelemahan mereka lebih cenderung ditemukan dan dieksploitasi.
Juga, jika Anda segera menjawab, Anda mungkin mendapatkan hadiah +100.