Dalam dunia yang sunyi dan dilanda perang, di mana kota-kota dikuasai oleh penjahat dan pencuri, peradaban telah mengubah dirinya dalam bentuk koperasi industri kecil, terisolasi, yang tersebar di seluruh lanskap yang sebelumnya tidak berpenghuni. Keberadaan komunitas-komunitas ini bergantung pada tim pekerja bayaran yang disebut "scrappers", yang mencari wilayah yang tak ternoda untuk mencari bahan-bahan berharga untuk dijual ke kandang. Karena bahan-bahan ini telah tumbuh semakin langka, membuang menjadi profesi yang semakin sulit dan berbahaya. Pekerja manusia yang rapuh sebagian besar telah diganti dengan stand-in robot jarak jauh, yang disebut "bot", dan tentara bayaran yang khas lebih cenderung menjadi programmer yang terampil daripada tukang las bersenjata. Karena kehadiran manusia dalam scrapping telah menurun, demikian juga rasa saling menghormati antara kelompok tentara bayaran satu sama lain. Bot dilengkapi tidak hanya untuk mengumpulkan memo, tetapi untuk mempertahankannya, dan dalam beberapa kasus mengambilnya dengan paksa. Programmer bot bekerja tanpa lelah merancang strategi baru untuk mengakali scrappers saingan, menghasilkan bot yang semakin agresif, dan bahaya lain bagi manusia yang menjelajah di luar tembok komunitas mereka.
(Ya, logo dipangkas dengan lucu)
Selamat datang di Scrappers!
Ini adalah versi awal Scrappers di mana pengumpulan memo dan pabrik belum diimplementasikan. Ini pada dasarnya adalah "tembak mereka".
Anda adalah seorang programmer tentara bayaran yang bertugas membuat program untuk melakukan bot Anda dari jarak jauh untuk kemenangan atas kelompok-kelompok penembak saingan. Bot Anda adalah mesin mirip laba-laba yang terdiri dari generator listrik dan pelindung di intinya, dikelilingi oleh banyak pelengkap yang dilengkapi dengan alat mencengkeram, memotong, dan menyerang. Generator listrik mampu menghasilkan 12 unit daya (pu) per tick (unit waktu pencakar). Anda mengendalikan bagaimana kekuatan ini didistribusikan di antara tiga kebutuhan utama bot: gerakan, perisai, dan daya tembak.
Bot Scrapper adalah mesin yang sangat gesit, dan dapat dengan mudah bergerak, di bawah, dan di sekitar rintangan yang mereka temui. Jadi, tabrakan bukanlah sesuatu yang perlu dipertimbangkan oleh program Anda. Anda bebas mengalokasikan semua, sebagian, atau tidak ada 12pu yang tersedia untuk bot Anda untuk dipindahkan, selama Anda berurusan dengan angka keseluruhan. Mengalokasikan 0pu ke fungsi pergerakan bot akan membuatnya tidak bergerak. Mengalokasikan 2pu akan memungkinkan bot untuk memindahkan 2 unit jarak (du) per tick, 5pu akan menghasilkan 5du / tick, 11pu akan menghasilkan 11du / tick, dan seterusnya.
Generator pelindung bot Anda memproyeksikan gelembung energi deflektif di sekitar tubuh mereka. Sebuah perisai dapat membelokkan hingga 1 kerusakan sebelum muncul, sehingga meninggalkan bot Anda terbuka sampai generator perisai itu membangun kekuatan yang cukup untuk memasang kembali perisai ke tempatnya. Anda bebas mengalokasikan semua, sebagian, atau tidak ada 12pu yang tersedia untuk bot Anda ke arah perisai itu. Mengalokasikan 0pu ke tameng bot berarti ia tidak akan pernah menghasilkan tameng. Mengalokasikan 2pu akan memungkinkan bot untuk menghasilkan perisai baru 2 dari 12 kutu, atau sekali setiap 6 kutu. 5pu akan menghasilkan regenerasi perisai 5 dari setiap 12 kutu, dan seterusnya.
Dengan mengisi muatan pada laser pengelasan mereka, bot Anda dapat menembakkan sinar yang merusak jarak pendek dengan akurasi yang wajar. Seperti pembuatan perisai, kecepatan tembakan bot Anda tergantung pada daya yang dialokasikan untuk laser mereka. Mengalokasikan 0pu ke laser bot berarti ia tidak akan pernah menyala. Mengalokasikan 2pu akan memungkinkan bot untuk menembakkan 2 dari setiap 12 ticks, dan seterusnya. Laser bot akan melakukan perjalanan sampai bertemu dengan suatu benda atau menyebar menjadi tidak berguna, jadi berhati-hatilah dengan api yang bersahabat. Meskipun bot Anda cukup akurat, mereka tidak sempurna. Anda harus mengharapkan +/- 2.5 derajat variasi dalam akurasi. Saat sinar laser bergerak, partikel-partikelnya secara bertahap dibelokkan oleh atmosfer sampai sinar itu menjadi tidak berbahaya secara efektif dengan jarak yang cukup. Laser tidak merusak 1 pada jarak titik kosong, dan 2,5% lebih sedikit merusak setiap bot panjang yang dilalui.
Scrapper bot cukup otonom untuk menangani fungsi-fungsi dasar, tetapi bergantung pada Anda, programmer mereka, untuk menjadikannya berguna sebagai grup. Sebagai seorang programmer, Anda dapat mengeluarkan perintah berikut untuk setiap bot individu:
- MOVE: Tentukan koordinat ke arah mana bot akan bergerak.
- TARGET: Identifikasi bot untuk diarahkan dan menembak ketika alokasi daya memungkinkan.
- KEKUATAN: Mendistribusikan kembali kekuatan antara gerakan, perisai, dan daya tembak.
Detail Game Teknis
Ada tiga program yang perlu Anda ketahui. The Game Engine adalah pengangkat berat dan menyediakan TCP API bahwa program pemutar terhubung ke. Program pemain adalah apa yang akan Anda tulis, dan saya telah memberikan beberapa contoh dengan binari di sini . Akhirnya, Renderer memproses output dari Game Engine untuk menghasilkan GIF pertempuran.
Mesin Game
Anda dapat mengunduh mesin gim dari sini . Ketika game diluncurkan, ia akan mulai mendengarkan pada port 50000 (saat ini tidak dapat dikonfigurasi) untuk koneksi pemain. Setelah menerima dua koneksi pemain, ia mengirimkan pesan SIAP ke para pemain dan memulai permainan. Program pemain mengirim perintah ke permainan melalui TCP API. Ketika game selesai, file JSON bernama scrappers.json (juga, saat ini tidak dapat dikonfigurasi) dibuat. Inilah yang digunakan renderer untuk membuat GIF game.
API TCP
Program pemain dan mesin gim berkomunikasi dengan mengirimkan string JSON yang diakhiri oleh baris baru kembali dan keempat melalui koneksi TCP. Hanya ada lima pesan JSON berbeda yang dapat dikirim atau diterima.
Pesan Siap
Pesan READY dikirim dari game ke program pemain dan hanya dikirim sekali. Pesan ini memberitahu program pemain apa ID pemainnya (PID) dan menyediakan daftar semua bot dalam permainan. PID adalah satu-satunya cara untuk menentukan Bot mana yang ramah lawan musuh. Info lebih lanjut tentang bidang bot di bawah ini.
{
"Type":"READY", // Message type
"PID":1, // Player ID
"Bots":[ // Array of bots
{
"Type":"BOT",
"PID":1,
"BID":1,
"X":-592,
...
},
...
]
}
Pesan Bot
Pesan BOT dikirim dari game ke program pemain dan dikirim ketika atribut bot berubah. Misalnya, ketika perisai diproyeksikan, atau perubahan kesehatan, pesan BOT dikirim. ID Bot (BID) hanya unik di dalam pemain tertentu.
{
"Type":"BOT", // Message type
"PID":1, // Player ID
"BID":1, // Bot ID
"X":-592, // Current X position
"Y":-706, // Current Y position
"Health":12, // Current health out of 12
"Fired":false, // If the Bot fired this tick
"HitX":0, // X position of where the shot landed
"HitY":0, // Y position of where the shot landed
"Scrap":0, // Future use. Ignore.
"Shield":false // If the Bot is currently shielded.
}
Pindahkan Pesan
Pesan MOVE adalah perintah dari program pemain ke permainan (tetapi anggap itu sebagai perintah untuk bot). Cukup mengidentifikasi bot yang ingin Anda pindahkan, dan koordinatnya. Diasumsikan bahwa Anda memerintahkan bot Anda sendiri, jadi tidak perlu PID.
{
"Cmd":"MOVE",
"BID":1, // Bot ID
"X":-592, // Destination X coordinate
"Y":-706, // Destination Y coordinate
}
Pesan Target
Pesan TARGET memberitahu salah satu bot Anda untuk menargetkan beberapa bot lainnya.
{
"Cmd":"TARGET",
"BID":1, // Bot ID
"TPID":0, // The PID of the bot being targeted
"TBID":0, // The BID of the bot being targeted
}
Pesan Kekuatan
Pesan POWER mengalokasikan kembali 12pu yang tersedia untuk bot Anda di antara gerakan, daya tembak, dan perisai.
{
"Cmd":"POWER",
"BID":1, // Bot ID
"FPow":4, // Set fire power
"MPow":4, // Set move power
"SPow":4, // Set shield power
}
Sebuah kompetisi
Jika Anda cukup berani untuk menjelajahi tanah yang tidak dijinakkan, Anda akan dimasukkan ke dalam turnamen eliminasi ganda melawan rekan-rekan tentara bayaran Anda. Harap buat jawaban untuk kiriman Anda dan rekatkan kode Anda atau berikan tautan ke git repo, intisari, dll. Bahasa apa pun dapat diterima, tetapi Anda harus menganggap saya tidak tahu apa-apa tentang bahasa tersebut dan memasukkan instruksi untuk menjalankan program Anda. Buat kiriman sebanyak yang Anda suka, dan pastikan untuk memberi mereka nama!
Program sampel pemain akan dimasukkan dalam turnamen, jadi saya sangat merekomendasikan menguji bot Anda terhadap mereka. Turnamen akan dimulai kira-kira dua minggu setelah kami mendapatkan empat pengajuan program yang unik. Semoga berhasil!
--- Winner's Bracket ---
** Contestants will be randomly seeded **
__________________
|___________
__________________| |
|___________
__________________ | |
|___________| |
__________________| |
|________________
__________________ | |
|___________ | |
__________________| | | |
|___________| |
__________________ | |
|___________| |
__________________| |
|
--- Loser's Bracket --- |___________
|
___________ |
|___________ |
___________| |___________ |
| | |
___________| | |
|___________ |
___________ | | |
|___________ | |___________|
___________| |___________| |
| |
___________| ___________|
Info Penting Lainnya
- Gim ini berjalan pada 12 ticks / detik, sehingga Anda tidak akan menerima pesan lebih sering daripada setiap 83 milidetik atau lebih.
- Setiap bot berdiameter 60du. Perisai tidak membutuhkan ruang tambahan. Dengan akurasi +/- 2.5%, peluang untuk memukul bot pada jarak tertentu diwakili oleh grafik ini:
- Kerusakan kerusakan laser pada jarak diwakili oleh grafik ini:
- Akurasi bot dan peluruhan laser bergabung untuk menghitung rata-rata kerusakan per tembakan. Yaitu, kerusakan rata-rata yang akan ditimbulkan bot saat ditembak dari jarak tertentu. Kerusakan per tembakan diwakili oleh grafik ini:
- Laser bot berasal setengah jalan antara pusat bot dan ujungnya. Dengan demikian, menumpuk bot Anda akan menghasilkan api ramah.
- Bot musuh muncul sekitar 1440du terpisah.
- Permainan berakhir jika 120 kutu (10 detik) berlalu tanpa ada kerusakan yang diberikan.
- Pemenangnya adalah pemain dengan bot terbanyak, kemudian paling sehat saat pertandingan berakhir.
Memahami Gambar yang Diubah
- Player 1 diwakili oleh lingkaran dan pemain 2 oleh segi enam.
- Warna bot mewakili alokasi daya. Lebih merah berarti lebih banyak daya telah dialokasikan untuk menembak. Lebih banyak biru berarti lebih banyak perisai. Lebih hijau berarti lebih banyak gerakan.
- "Lubang" di tubuh bot menunjukkan kerusakan. Semakin besar lubangnya, semakin banyak kerusakan yang terjadi.
- Lingkaran putih yang mengelilingi bot adalah tamengnya. Jika sebuah bot memiliki pelindung di ujung belokan, itu ditunjukkan. Jika perisai muncul dengan mengambil kerusakan, itu tidak ditampilkan.
- Garis merah antara bot mewakili tembakan yang diambil.
- Ketika bot terbunuh, "ledakan" merah besar akan ditampilkan.
sumber
Jawaban:
Ekstremis (Python 3)
Bot ini akan selalu mencurahkan seluruh kekuatannya untuk satu hal: melindungi jika tidak dilindungi, bergerak jika berada di luar posisi, dan menembak sebaliknya. Mengalahkan semua bot sampel kecuali piring kematian.
sumber
Kurang sembarangan ( Go )
Awalnya, saya berencana untuk sedikit memodifikasi program sampel Reckless Abaikan sehingga bot tidak akan menyala jika bot ramah menghalangi. Saya berakhir dengan bot yang memilih target baru ketika seorang teman berada di jalan, yang saya kira lebih baik. Itu akan mengalahkan dua program pertama.
Kode tidak sempurna. Logika untuk menentukan apakah bidikan jelas menggunakan beberapa tebakan acak yang cukup.
Sepertinya tidak ada mekanisme untuk menargetkan "tidak ada". Itu mungkin fitur yang bagus untuk ditambahkan.
TCP API bagus karena bahasa apa pun bisa dimainkan, tetapi itu juga berarti banyak kode boilerplate. Jika saya tidak terbiasa dengan bahasa sampel bot ditulis, saya mungkin tidak akan termotivasi untuk bermain-main dengan ini. Kumpulan sampel boilerplate dalam berbagai bahasa akan menjadi tambahan yang bagus untuk repositori git Anda yang lain.
(sebagian besar kode berikut adalah salin / tempel dari salah satu bot sampel)
sumber
Trigger Happy - Java 8
Trigger Happy adalah evolusi sederhana dari botard asli saya, tetapi tidak lagi layak. Ini adalah bot yang sangat sederhana yang hanya akan menembak musuh yang saat ini ditargetkan jika ada tembakan yang jelas, jika tidak melakukan perjalanan acak untuk mencoba masuk ke posisi yang lebih baik. Setiap saat berusaha memiliki perisai.
Namun, untuk semua kesederhanaannya sangat efektif. Dan akan dengan mudah menghancurkan bot sampel.
Catatan, ada beberapa bug dengan bot seperti kadang-kadang akan menyala meskipun bukan tembakan yang jelas dan mungkin tidak mempertahankan perisai ... tetapi masih efektif sehingga hanya akan mengirimkan entri ini apa adanya
Death-dish vs Trigger Happy
Kode sebagai berikut:
Untuk mengkompilasi: javac TriggerHappy.java
Untuk menjalankan: java TriggerHappy
sumber