Hunger Gaming - Eat or Die
Jika kamu tidak makan, kamu mati. Jika Anda makan, Anda hidup (sampai Anda mati). Kamu akan mati, jadi cobalah untuk mati terakhir.
Gambaran
Ada sebuah pulau yang dihuni kawanan binatang buas. Anda mengontrol sekelompok lima predator. Objek Anda adalah untuk menjaga paket Anda tetap hidup. Lakukan ini dengan memakan mangsa. Sebaliknya, mangsa cenderung lari dari pemangsa, dan mencoba bertahan dalam kawanan. Tentu saja, bungkusan Anda akan berada di bidang yang sama dengan bungkusan lainnya , sehingga pesaing akan mencoba memakannya sebelum Anda bisa. Jangan biarkan ini membuat Anda kecil hati, atau Anda akan kelaparan.
Cara bermain
Buat dan kirimkan program baris perintah untuk mengarahkan paket Anda. Ini akan menerima informasi status dari program kontrol pada STDIN, dan output perintah pada STDOUT. Formatnya diuraikan secara terperinci di bawah ini. Setiap program hanya akan dijalankan sekali dan harus tetap berjalan sampai tidak ada lagi anggota paket yang hidup. Anda perlu membaca input saat masuk, dan merespons dengan cepat. Ada batas waktu 200ms untuk setiap respons. Jika Anda belum menjawab, paket Anda tidak akan menerima instruksi baru untuk giliran saat ini.
Jika program Anda tidak dapat dijalankan oleh controller, itu tidak akan dianggap valid. Harap sertakan string baris perintah yang perlu saya gunakan untuk menjalankan kiriman Anda. Jika ada instruksi khusus (untuk mengatur kompiler, dll), harap sertakan. Jika saya tidak bisa membuatnya berfungsi, saya akan meminta bantuan Anda dalam komentar. Jika Anda tidak merespons, saya tidak akan dapat menerima kiriman Anda.
Turnamen akan diadakan pada sistem Linux 64bit. Ingatlah hal ini ketika memberikan arahan yang diperlukan.
Detail
Posisi dan arah setiap makhluk adalah dalam bentuk sepasang angka floating point presisi ganda (misalnya
double
) yang mewakili masing-masingx
dany
koordinatnya.Setiap makhluk dianggap titik. Ini berarti mereka dapat tumpang tindih dan menempati ruang yang sama. Anda tidak akan terbentur ke samping, dan tidak ada konsep tabrakan dengan makhluk lain.
Pulau ini berbentuk bujur sangkar, 500 unit di satu sisi. Jika Anda mencoba menjelajah melampaui batas itu, Anda akan dijepit ke tepian. Asalnya
{0,0}
di kiri atas, denganx
meningkatnya ke kanan dany
meningkat ke bawah. Sekali lagi, peta tidak terbungkus .Permainan dimulai dengan 1500 + (packCount * 50) hewan mangsa. Mereka akan dikumpulkan di tengah pulau, tetapi dengan cepat memutuskan untuk mulai bergerak.
Paket akan diatur dalam lingkaran dengan jarak yang sama di sekeliling perimeter. Pesanan paket dikocok, jadi jangan mengandalkan mulai di lokasi tertentu.
Hewan mangsa dapat melihat semua hewan lain dalam radius 30 unit. Mereka dapat bergerak maksimal 6,0 unit per putaran.
Predator dapat melihat semua hewan lain dalam radius 50 unit. Mereka dapat bergerak maksimal 6,1 unit per putaran. Ini berarti mereka dapat melihat mangsa sebelum terlihat dan (nyaris) berlari lebih cepat dari mereka.
Predator hidup dan mati sesuai dengan tingkat kelaparan mereka . Itu dimulai pada 1000 , dan berkurang satu setiap belokan. Jika, setelah bergerak, predator berada dalam 1 unit mangsa, ia akan memakannya secara otomatis. Ini menghilangkan mangsa dan mengatur rasa lapar predator ke 1000. Setiap predator hanya makan satu mangsa per giliran. Jika ada lebih dari satu dalam jangkauan, ia akan memakan yang mana satu loop sampai yang pertama (belum tentu yang terdekat). Seorang predator mati jika rasa laparnya mencapai nol.
Paket mulai dengan masing-masing lima anggota . Setiap 5.000 putaran, semua paket yang masih dalam game akan menelurkan satu anggota baru. Ini akan ditempatkan dalam jangkauan yang terlihat dari sesama anggota paket. Pastikan entri Anda dapat menangani lebih dari lima anggota.
Setiap 1000 putaran, lebih banyak mangsa yang akan muncul. Jumlah mangsa baru akan menjadi jumlah predator hidup dikurangi satu.
Predator tidak dapat menyerang predator lainnya. Mereka memakan mangsa saat mereka menangkapnya. Itu dia.
Urutan dalam belokan adalah:
- Semua mangsa membuat keputusan
- Semua predator membuat keputusan
- Semua mangsa bergerak
- Semua pemangsa bergerak / makan
Urutan setiap paket untuk membuat keputusan / perpindahan mereka akan diacak pada setiap belokan.
Protokol (Umum)
Semua komunikasi dilakukan dalam format string US-ASCII
. Angka dikonversi ke string menggunakan Java Double.toString()
atau Integer.toString()
. Output Anda harus diformat sehingga dapat dibaca oleh Java Double.valueOf(String)
(Anda tidak akan menghasilkan bilangan bulat). Untuk detail tentang format yang dapat diuraikan, lihat dokumentasi untukDouble
. Semua bidang pada baris dipisahkan oleh \t
karakter standar , dan baris baru \n
. Seluruh string akan diakhiri dengan null byte \0
.
Dalam contoh di bawah ini, saya menggunakan <>
untuk menandai bidang demi keterbacaan. Ini tidak hadir dalam string yang sebenarnya.
Protokol (Input)
Panjang string input bervariasi, tergantung pada berapa banyak makhluk yang terlihat oleh paket Anda. Itu bisa melebihi 100 ribu karakter, jadi bersiaplah untuk itu. Pengaturan dasar adalah:
Baris 0: Informasi dasar tentang permainan.
turn
adalah nomor belokan saat ini, dan jumlah adalah jumlah total mangsa dan predator yang tersisa di lapangan. Iniinteger
dalam bentuk string.<turn>\t<preyCount>\t<predatorCount>\n
Baris 1: Id unik dan tingkat kelaparan anggota pack Anda. Ini tidak diberikan dalam urutan yang sama untuk setiap input. Gunakan id unik untuk melacak masing-masing anggota, bukan urutan kemunculannya di input. Sekali lagi, ini adalah
integer
string. Untuk satu pak dua, ini akan menjadi:<id[0]>\t<hunger[0]>\t<id[1]>\t<hunger[1]>\n
Baris 2: Posisi anggota pack Anda, dalam urutan yang sama seperti yang diberikan pada baris 1 . Ini
double
sebagai string:<x[0]>\t<y[0]>\t<x[1]>\t<y[1]>\n
Baris berikut adalah visibilitas setiap anggota paket, dalam urutan yang sama seperti yang diberikan pada baris 1 . Ini akan diberikan sebagai dua baris per anggota.
Yang pertama untuk masing-masing terdiri dari lokasi untuk mangsa yang bisa dia lihat. Yang kedua adalah lokasi untuk predator yang bisa dia lihat. Lokasi-lokasi ini tidak unik secara keseluruhan. Misalnya, jika dua anggota paket dapat melihat hewan yang sama, itu akan berada di string kedua anggota. Juga, anggota paket Anda sendiri akan disertakan. Jika Anda ingin mengecualikan mereka, Anda mungkin ingin membandingkan lokasi dengan anggota Anda sendiri. Semua lokasi dalam double
format string.
Untuk setiap anggota yang masih hidup:
<prey[0].x>\t<prey[0].y>\t<prey[1].x>\t<prey[1].y>\n
<predator[0].x>\t<predator[0].y>\t<predator[1].x>\t<predator[1].y>\n
Akhirnya, karakter terakhir adalah \0
, di awal baris berikutnya.
Pengecualian: Jika Anda menerima input dead\0
, paket Anda sudah mati. Akhiri program Anda dengan anggun. Pengontrol harus mematikan semua proses hidup ketika ditutup, tetapi saya lebih suka tidak memiliki proses zombie di semua tempat. Sebagai rasa hormat, Anda dapat memasukkan batas waktu input. Sebagai contoh, kelas contoh saya berakhir jika tidak menerima input selama 15 detik.
Protokol (Keluaran)
Outputnya sederhana. Anda akan memberikan sepasang double
nilai untuk setiap anggota paket langsung. Ini mewakili gerakan yang Anda ingin mereka lakukan pada giliran ini. Misalnya, jika makhluk Anda saat ini di {100.0, 100.0}
dan Anda memberi mereka perintah {-1.0, 1.0}
, mereka akan pindah ke {99.0, 101.0}
. Semua angka akan berada pada satu baris, dipisahkan oleh tab.
Misalnya, jika Anda memiliki 3 anggota pack hidup, ini akan menjadi respons yang valid:
1.0\t-1.0\t2.0\t-2.0\t3.0\t-3.0\0
Hal ini akan memindahkan makhluk Anda dengan {1.0,-1.0}
, {2.0,-2.0}
, dan {3.0,-3.0}
. Urutannya sama dengan yang diterima dalam input. Jangan lupa bagian akhirnya \0
!
Jika Anda memberikan input yang tidak valid, hasil yang buruk akan mengikuti. Jika salah satu nomor tidak dapat diuraikan menjadi double
, itu akan menjadi nol. Jika string secara keseluruhan tidak dapat diuraikan, tidak ada instruksi baru yang akan diberikan, dan seluruh paket Anda akan menggunakan petunjuk dari giliran sebelumnya.
Semua arah akan dijepit ke jarak maksimum 6,1 unit. Anda bisa bergerak lebih lambat dari ini jika mau. Misalnya, {1, 0}
akan memindahkan Anda satu unit. {6,8}
(jarak 10) hanya akan menggerakkan Anda 6,1 unit, dan akan berkurang menjadi sekitar {3.66, 4.88}
. Arahnya tetap konstan.
Penting: Program kontrol membaca STDOUT dan STDERR Anda. Jika Anda melempar pengecualian dan mencetak ke STDERR, sangat kecil kemungkinannya bahwa pesan akan berbentuk respons yang valid. Cobalah untuk menghindari melakukan ini.
Program Kontrol / Pengujian
Sumber untuk controller dapat ditemukan di sini di bitbucket.org . Anda harus mengompilasinya sebelum dijalankan. Kelas utamanya adalah Game
, dan semua kelas ada dalam paket default. Untuk menjalankan, masukkan perintah setiap paket sebagai argumen terpisah. Misalnya, jika Anda ingin menjalankan Java ChaserPack dan Python LazyPack.py, Anda bisa menggunakan:
java Game "java ChaserPack" "python LazyPack.py"
Pada peta, mangsa muncul berwarna hijau, dan predator berwarna merah. Namun, paket mana pun yang merupakan paket pertama yang diberikan sebagai argumen akan berwarna biru. Ini dimaksudkan untuk membedakan mereka lebih mudah untuk tujuan pengujian. Predator juga akan berkedip putih selama lima frame saat mereka makan.
Permainan akan berlanjut hingga predator terakhir kelaparan, menulis ke konsol saat kelaparan atau peristiwa kepunahan terjadi. Setelah permainan selesai, skor akan diberikan untuk setiap paket. Jika Anda ingin tidak ingin melihat peristiwa kelaparan / kepunahan, Anda dapat menggunakan -silent
argumen. Maka itu hanya akan menghasilkan skor akhir. Anda harus melewati ini sebagai argumen pertama :
java Game -silent "java ChaserCat" "./someOtherPack"
Termasuk adalah paket kerangka Java bernama GenericPack
. Ini mencakup operasi input / output dasar yang diperlukan. Itu ada untuk memberikan contoh yang jelas tentang bagaimana mengurai dan membalas. Jika Anda ingin menambahkan templat dalam bahasa lain, beri tahu saya.
Juga termasuk predator berdasarkan pada templat ChaserPack
,. Itu tidak akan dimasukkan dalam turnamen, dan hanya disertakan untuk tujuan pengujian. Performanya cukup buruk, karena cacat penargetan yang disengaja. Jika Anda tidak bisa mengalahkannya, teruslah berusaha.
Di bawah ini adalah contoh menjalankan program kontrol (klik untuk video). Kualitas videonya tidak bagus (maaf), tetapi Anda bisa merasakan bagaimana mangsanya bergerak. ( hati-hati: audio )
Mencetak gol
Pemenang akan ditentukan oleh turnamen, mendapatkan poin di setiap putaran.
Setiap putaran berlangsung sampai semua predator mati. Setiap paket akan dinilai berdasarkan kapan anggota terakhirnya meninggal karena kelaparan. Mereka kemudian akan diberi poin berdasarkan pesanan. Poin akan terakumulasi selama sepuluh putaran, dan pemenangnya adalah paket dengan poin total tertinggi.
Tempat pertama untuk setiap putaran akan menerima 100 poin. Untuk setiap tempat setelah itu, hadiah akan dikurangi sebesar 20% (dibulatkan ke bawah). Ini akan berlanjut sampai poin mencapai nol (setelah tempat ke-17). Places 18+ tidak akan menerima poin untuk putaran ini. Paket yang mengikat akan menerima poin yang sama. Sebagai contoh:
1st : 100
2nd : 80
3rd : 64 (T)
3rd : 64 (T)
4th : 51
...
17th: 1
18th: 0
19th: 0
Poin maksimum yang mungkin selama turnamen adalah 1000, dari tempat pertama sebanyak sepuluh kali.
Jika beberapa program mengakhiri turnamen terikat untuk tempat pertama, turnamen sepuluh putaran lain akan diadakan dengan hanya entri tempat pertama yang diajukan. Ini akan berlanjut sampai satu pemenang muncul.
Saya akan mencoba menjalankan turnamen kira-kira setiap minggu, atau ketika kiriman baru masuk.
Aturan Tambahan (bermain adil!)
Anda tidak boleh membaca atau menulis ke sumber daya eksternal apa pun. Karena Anda tidak akan menjalankan program Anda beberapa kali, informasi status apa pun dapat disimpan secara internal.
Jangan mengganggu proses / pengajuan lainnya. Ini tidak berarti jangan mencoba mencuri mangsa mereka, berlari lebih cepat dari mereka, dll. Itu berarti jangan mengganggu jalannya proses. Ini adalah kebijaksanaan saya.
Kontestan dibatasi hingga maksimal tiga entri. Jika Anda mengirim lebih banyak, saya hanya akan mencetak tiga yang pertama dikirimkan. Jika Anda ingin mencabut satu, hapus itu.
Entri mungkin tidak ada hanya untuk menopang entri lain. Masing-masing harus bermain untuk menang karena kemampuannya sendiri.
Program Anda dapat menghasilkan maksimum satu proses anak pada satu waktu ( total keturunan, tidak langsung). Either way, pastikan Anda tidak melewati batas waktu. Anda tidak boleh memanggil
Game
kelas itu sendiri dengan cara apa pun.
Hasil - 29 April 2014
Inilah hasil turnamen sepuluh ronde terbaru:
Clairvoyant : 1000
EcoCamels : 752
Netcats : 688
RubySpiders : 436
RubyVultures : 431
CivilizedBeasts : 382
LazyPack : 257
Paket yang dikirimkan sebelum 09:00 EDT 2014/04/29 termasuk dalam paket ini.
Anda juga dapat melihat detail untuk setiap putaran . Untuk beberapa alasan saya memutuskan untuk menghitung putaran ke belakang, jadi itu dimulai dengan "putaran 10".
Pembaruan
2014/04/23: FGreg melaporkan bug terkait timeout (terima kasih!). Perbaikan telah dilaksanakan, sehingga penguji ingin memperbarui kode program kontrol mereka.
sumber
Jawaban:
Peramal
Kode diperbarui untuk menghadapi AbleDogs
Woo hoo! Akhirnya mengalahkan Netcats itu! Saya memperluas kode yang ada (kredit ke Geobits!) Dengan beberapa modifikasi kecil untuk membuat paket prediksi masa depan ini. Tidak ada yang mengalahkan pemangsa yang tahu ke mana mangsanya akan bergerak!
Dari dua tes yang telah saya lakukan, paket saya selalu menang melawan Netcats. Tapi ini tidak akan berfungsi dengan baik jika tidak ada paket lain, karena prediksi masih gagal jika ada terlalu banyak mangsa di sekitarnya.
Mungkin saya bisa memasukkan trik CivilizedBeasts untuk mengurangi jumlah mangsa secara substansial selama beberapa ribu putaran pertama.
Dari nama paket saya, Anda harus tahu strategi apa yang saya gunakan = D
Edit :
Memperbaiki kasus khusus ketika versi sebelumnya hanya macet di sudut.flock[ALIGN]
faktor mangsaSaya menghitung berapa banyak mangsa yang dimakan setiap bungkus, dan inilah hasilnya:
Paket saya sangat agresif, dan sebagian besar dari 916 jumlah yang saya pikir didapat dari mencuri mangsa dari Netcats, sama seperti RubySpiders.
CivilizedBeasts sayangnya kalah karena unta pusat dari EcoCamel.
Dan EcoCamel (dengan kelaparan kritis 500) cukup efisien, hanya makan untuk bertahan hidup sampai akhir.
Juga dengan peramal yang diperbarui ini, permainan hampir mencapai 10.000 putaran.
Kode:
sumber
Netcats
Ini paket untuk memulai. Itu memperluas
GenericPack
kelas yang disertakan dengan program kontrol. Ini telah ditingkatkan sejak posting asli, dan tidak lagi kelaparan sendiri dengan kawanan yang jarang.Netcats menggunakan formasi jaring berbentuk vee untuk menjebak mangsa di sudut, di mana mereka bisa memakannya di waktu luang. Jaring ini dibentuk dengan satu anggota "kepala" di tengah. Begitu kepala makan, ia bertukar tempat dengan anggota kelompok yang paling lapar, karena kepala biasanya yang pertama mendapatkan kesempatan untuk makan.
Jaring mulai agak kecil, tetapi melebar ketika kawanan menjadi lebih kecil untuk menjaring lapangan lebih efisien.
Jika tidak ada mangsa yang terlihat, formasi melebar menjadi pola pencarian naif yang mencakup sebagian besar pulau.
Setelah paket turun menjadi dua anggota, internet tidak berfungsi. Pada titik itu masing-masing berjalan dengan caranya sendiri, dengan rakus memakan hal terdekat yang dapat ditemukannya dan berjalan secara semi-acak sebaliknya.
Versi ini bertahan jauh lebih baik daripada Netcat naif yang terlihat di video yang ditautkan dalam pertanyaan.
sumber
Laba-laba Ruby
Karena terkadang lebih sedikit lebih banyak dan banyak solusi mungkin akan mencoba untuk menyudutkan mangsanya ...
Saya pikir paket saya hanya bisa berpisah dan menunggu orang lain melakukan pekerjaan.
Peringatan: Ini tidak benar-benar tetap berjalan, juga tidak membaca input saat masuk atau merespons dengan cepat. Namun, karena berfungsi dengan baik dengan pengontrol, saya harap ini memenuhi syarat tanpa penyesuaian lebih lanjut.
sumber
Beast Beradab
Akhirnya, saatnya memamerkan binatang buasku!
Trah saya menganggap berburu agak primitif sehingga mereka bekerja bersama dalam tim 4 dan jadi mereka meninggalkan sekutu 5 mereka, karena: lebih sedikit pemangsa = lebih banyak mangsa untuk diri mereka sendiri. Apa yang pada dasarnya mereka lakukan adalah apa yang dilakukan manusia, mereka menangkap mangsa, dan merawat ternak mereka dengan baik;)
Menjadi sangat sulit bagi payudaraku untuk bertahan hidup dengan kurang dari 200 mangsa pada gilirannya + -12.000 dengan hanya Netcats musuh dalam permainan. Anda akan senang dengan trah ini karena benar-benar melahap mangsa dalam jumlah besar dengan kecepatan seperti yang tidak bisa trah lainnya (bukan pembantaian yang cepat dan besar memberi kemenangan, tapi itu memengaruhi waktu (lama) seluruh putaran mengambil banyak).
sumber
Ruby Vultures
Di sini datang paket parasit lebih aktif . Mereka berusaha mengelilingi predator terdekat yang bergerak , sehingga mereka dapat mencuri mangsanya . Mereka sedikit bergantung pada keberuntungan karena mereka tidak memiliki cara cerdas untuk memilih siapa yang akan diikuti tetapi mereka biasanya mengalahkan pemburu dan kadang-kadang laba-laba .
Mereka belum selesai, karena saya memposting ini untuk mendorong tempo :)
Saya berharap untuk:
22 April 2014: Menambahkan kebosanan , yang membuat mereka kurang lengket dan memungkinkan mereka untuk berburu mangsa sendiri dan mencari predator
sumber
Unta EcoJahatEdit: Mutasi # 2. Oh, tidak, saya terlambat dengan penerapan prediksi pergerakan mangsa saya, untuk menjadi yang pertama mengalahkan Netcats. OK, jadi itu.
Mutasi ini memiliki
$hunger_critical
variabel (konstan). Mengubahnya menjadi nilai di atas 1000 membuat Unta selalu berburu, seperti Peramal. Kemudian:Jika
$hunger_critical
diatur ke mis 500 (seperti di bawah), maka Unta saya (setelah melihat kengerian peradaban ) mencoba untuk berperilaku ramah lingkungan (maka mereka telah mengubah nama ras mereka), yaitu mereka membunuh hanya ketika lapar. Jika tidak lapar, mereka berpatroli di daerah Pulau kritis - pusat dan sudut, untuk mencegah pembantaian yang tidak ada gunanya oleh beberapa pemburu lainnya. Nah, dengan pusat, itu kurang lebih berfungsi. Gagasan berputar-putar di sudut adalah mengusir mangsanya dan membuat hidup lebih sulit bagi Kucing dan parasit. Yah, itu tidak berhasil. Lagipula mangsa bodoh masuk ke sudut-sudut.Menarik juga, bahwa
flock[ALIGN]
komponen hanya dapat ditebak oleh predator, dan implementasi saya berbeda dari justhalf. Saya khawatir ada beberapa bug kecil dalam implementasirip-off sayadari kode Geobits, menonton / membandingkan perburuan individu Unta vs Peramal.Dan program agak lama sekarang, maaf.
Edit: Mutasi # 1. Pulau itu ternyata sangat radioaktif (yang menjelaskan kurangnya vegetasi dan sifat makhluk 'mangsa' yang tidak bisa dijelaskan), jadi inilah mutasi pertama unta saya. Setiap dari mereka dapat menjadi pemburu solo, jika lapar atau jika tidak ada sudut gratis untuk semua orang. Hunter mencoba untuk secara aktif mengejar mangsa terdekat. Jika tidak ada, ia berpatroli dalam lingkaran lebar di sekitar pusat pulau, kemudian mengejar makhluk terdekat ketika menemukannya. Sayangnya, arahan mangsa menjadi tidak dapat diprediksi ketika mendekati kawanannya (layak diselidiki ...), jadi pengejaran solo tidak terlalu efisien. Tetapi jika berhasil, Unta pergi untuk mencerna sudut bebas terdekat (jika ada). Ketika tingkat kelaparan di bawah tingkat tertentu, setiap Unta meninggalkan sudutnya (mungkin mengutuk Netcats ('di mana makanan?' )) dan bebas roaming sendiri. Dan seterusnya.
Lelucon yang sama yang dikatakan dua kali tidak lucu, tetapi (1) Saya harus memulai dari suatu tempat dan saya baru dalam hal ini, (2) Jujur, saya memikirkan taktik sudut (dan siapa yang tidak?), Menonton Netcats, sebelum Ruby Laba-laba muncul di Pulau.
Jadi, pernah dengar tentang unta karnivora? Suatu hari hewan-hewan malang terbangun di pulau yang ditinggalkan Tuhan ini untuk tidak menemukan rumput atau pepohonan sama sekali, tetapi banyak hal-hal hijau aneh yang dapat dimakan, tetapi cepat bergerak (sangat mengganggu). Saya harap tidak memiliki kebiasaan berburu (tetapi mereka akan segera bermutasi), unta saya mengembangkan skema yang sangat jahat untuk bertahan hidup: mereka berpisah dan pergi masing-masing menjadi 1 dari 4 sudut, dan yang kelima pergi ke pusat (untuk mati di sana dulu, seperti ternyata). Di tempat tujuan mereka dengan sabar menunggu, melakukan tarian unta perang, atau mungkin mereka hanya mencoba untuk tidak menginjak binatang lain yang sudah ada di sana, laba-laba dan semua ...
sumber
vec
properti pada dasarnya hanya perpindahan dari belokan sebelumnya ke belokan saat ini. Dan seperti yang saya katakan, kami melakukan pencocokan dari giliran sebelumnya untuk mencari tahu mangsa mana yang pergi ke mana, kita tidak bisa bergantung pada urutan mangsa. Ini dimungkinkan karena mangsa biasanya (dalam skenario tipikal) menjaga jarak yang cukup dari satu sama lain (> 12 unit), dan sebagian besar waktu kita dapat mencocokkan mangsa di giliran sebelumnya dengan giliran saat ini.AbleDogs - PHP
Anjing-anjing yang baik ini telah belajar bagaimana menggigit betis mangsa untuk membawanya ke dinding. Mereka juga suka berkeliaran di padang rumput untuk mencari mangsa baru. Terakhir, mereka diajarkan untuk tidak makan kecuali mereka benar-benar membutuhkan kalori.
Masukkan kode ke dalam
AbleDogs
file dan jalankan denganphp AbleDogs
Pertimbangan umum
Ini adalah akhir pertandingan yang diperhitungkan. Anda dapat memiliki algoritme perburuan paling cerdas yang pernah ada, jika Anda tidak melihat dan menangkap beberapa mangsa terakhir lebih cepat dari lawan, Anda kalah.
Jika predator Anda tidak dapat menangkap mangsa sendirian (atau setidaknya berpasangan), Anda bersulang begitu kepadatan mangsa turun cukup rendah untuk bergantung pada keberuntungan buta atau memblokir mangsa ke sudut.
Prediktor pergerakan mangsa pada dasarnya wajib. Saya tidak bisa membayangkan mengalahkan program berbasis prediksi tanpa memiliki prediksi sendiri.
Kejaran ekor
Cara yang paling tidak efisien untuk menangkap mangsa adalah dengan mengejarnya. Dengan asumsi satu predator mengejar mangsa tunggal dan tidak ada pengaruh eksternal (dinding, mangsa lain, dll), pengejaran ekor bisa bertahan selamanya. Segera setelah Anda memasuki radius penglihatan 30 unit, mangsa melarikan diri dengan kecepatan 6 untuk 6.1 Anda, sehingga Anda memperoleh .1 jarak per belokan: dalam garis lurus, Anda akan membutuhkan sekitar 300 putaran untuk mendapatkannya.
Dengan mempertimbangkan ukuran arena, mangsa akan melakukan perjalanan paling banyak diagonal 500 unit persegi sebelum menabrak dinding atau sudut, yang akan mengambil paling banyak 117 putaran.
Strategi yang menang jelas untuk menemukan cara untuk memperlambat mangsa, yaitu dengan memiliki predator lain atau dinding / sudut di depannya.
Prediktor
Dengan kecepatan mangsa 6, mangsa dapat pindah ke area 36 * pi unit kuadrat. Dengan radius penangkapan 1, tebakan buta tentang di mana mangsa selanjutnya adalah peluang 1/36 * pi (sekitar 1%) untuk berhasil. Jelas ada sesuatu yang harus dilakukan untuk meningkatkan itu!
Melihat kode mesin simulasi, Anda dapat melihat bahwa inputnya adalah:
Sementara semua posisi tersedia, kecepatan mangsa sebelumnya tidak. Satu-satunya cara untuk menghitung kecepatan ini adalah dengan melacak setiap mangsa dari satu belokan ke belokan berikutnya, yang hampir mustahil dilakukan (kecuali jika Anda menerapkan algoritma pelacak gerak yang sangat cerdas). Jadi seorang prediktor dapat dengan mudah mereproduksi semua ketentuan perhitungan, kecuali untuk kontribusi kecepatan yang harus ditebak.
Dalam kasus mangsa tunggal, kecepatan dapat dilacak tanpa terlalu banyak masalah, yang memungkinkan untuk membangun prediktor "sempurna" untuk menangkap mangsa yang diisolasi dari kawanan. Yang pada dasarnya adalah semua yang Anda butuhkan untuk permainan akhir, ketika mangsa terlalu sedikit untuk saling berinteraksi. Ketika mangsa banyak dan efek kawanan cukup kuat untuk mengelabui sang prediktor, kepadatan mangsa akan mengkompensasi kesalahan (jika Anda tidak menangkap yang Anda tuju, kemungkinan Anda akan mendapatkan salah satu teman terdekatnya. ).
Goading mangsa
Dengan pengetahuan yang tepat tentang perhitungan kecepatan mangsa, dimungkinkan untuk "mengarahkan" mangsa yang diberikan ke arah yang diinginkan, dengan menyesuaikan posisi predator.
Ini memungkinkan untuk menempelkan mangsa ke dinding, atau mengarahkannya ke anggota paket lainnya. Saya mencoba beberapa strategi yang disempurnakan, seperti menjepit mangsa di antara dua anggota kelompok. Sayangnya, ini terbukti kurang efisien daripada rutin "pin and scan" saat ini, karena menjaga dua predator sibuk mengejar satu mangsa meninggalkan oposisi dengan terlalu banyak predator bebas untuk mencari padang rumput.
Mencuri mangsa
Salah satu karakteristik perilaku mangsa adalah bahwa pengaruh pemangsa meningkat secara proporsional dengan jaraknya dari mangsa (asalkan tetap dalam radius penglihatan mangsa). Semakin dekat predator dengan mangsa, paling tidak mangsa akan menjauh darinya.
Ini berarti bahwa ketika dua pemangsa bersaing untuk menangkap mangsa, yang terdekat pasti akan mendapatkannya terlebih dahulu. Bahkan pesaing super pintar yang akan mengatur posisi dirinya tepat di depan sumbu chaser / mangsa pada dasarnya akan menakuti mangsa ke dalam rahang pesaing.
Untuk berhasil mencuri mangsa, setidaknya sepasang predator diperlukan. Satu akan pergi untuk membunuh, dan yang lain akan tetap berada dalam radius penglihatan mangsa, sejauh mungkin membentuk mangsa untuk memaksimalkan pengaruh dan mengarahkan mangsa ke arah pemburu.
Selain itu, setiap perubahan arah akan memungkinkan kompetisi memotong sudut ke arah mangsa, dan menjaga di belakang lawan hanya mungkin jika "goader" cukup dekat dengan mangsa di awal aksi.
Jadi mencuri mangsa hanya memiliki peluang untuk berhasil jika posisi awal dari "pencuri" menguntungkan dan Anda dapat menyimpan setidaknya predator kedua. Dalam pengalaman saya, ini tidak sebanding dengan kompleksitasnya.
Perubahan yang disarankan
Untuk memungkinkan strategi yang lebih kompleks, memindahkan predator di atas kecepatan tertinggi mangsa dapat memiliki biaya dalam poin kelaparan, sebanding dengan kecepatan berlebih. Misalnya, naik ke kecepatan 6 adalah gratis dan setiap titik kecepatan di atas 6 menghabiskan 100 poin kelaparan (pergi ke 6,3 biaya 30 poin kelaparan per putaran, membakar 1000 poin kelaparan akan memungkinkan untuk mencapai kecepatan 16 untuk satu putaran - dan mati jika Anda tidak bisa menangkap mangsa yang melakukannya!).
Daripada memberikan pembunuhan kepada predator acak ketika lebih dari satu cukup dekat untuk memakan mangsa, saya sarankan membagi keuntungan (misalnya 3 predator akan mendapatkan masing-masing 333,33 poin kelaparan). Ini akan memungkinkan lebih banyak strategi endgame intrersting (membayangi predator musuh akan menjadi berguna jika Anda rasa Anda memiliki lebih banyak poin kelaparan, misalnya).
Warna khusus untuk paket pertama agak sulit dilihat. Saya sarankan cyan atau oranye alih-alih biru.
sumber
Lazy Pack Haskell
Anda membutuhkan platform haskell untuk menjalankan ini. Kemudian Anda menggunakan
runhaskell
perintah untuk menjalankannya. Bungkusan saya menunggu mangsa datang kepada mereka.sumber
-silent
opsi, meskipun ...Bukan entri, saya selalu tertarik untuk menambahkan warna yang disesuaikan untuk setiap entri yang berpartisipasi di king-of-the-hill ;)
Dan juga proses makan tidak divisualisasikan dengan mengubah warna, tetapi mengubah ukurannya, sehingga kita bisa melihat beberapa acara makan dalam waktu singkat.
Game.java
Predator.java
sumber