Ini adalah tantangan King of the Hill dalam round robin. Ini pertempuran untuk menemukan penembak terbaik di barat!
Untuk dapat bersaing dalam kontes ini, Anda harus membuat dua fungsi. Yang pertama mengatur atribut penembak Anda dan yang kedua adalah fungsi logika utama untuk penembak.
Fungsi Atribut
function () {
var bot = {
name: "testBot",
numbOfBullets: 7,
reloadSpeed: 1,
shotsPerTurn: 1,
moveSpeed: 2
}
return bot
}
Fungsi atribut mencakup 5 variabel yang perlu Anda atur sesuai dengan beberapa aturan (dengan pengecualian name
yang bisa berupa string apa saja). Anda harus menghabiskan total tepat 15 poin untuk pria bersenjata Anda - pria bersenjata yang tidak menghabiskan semua 15 poin tidak memenuhi syarat. Inilah cara kerja atribut:
numbOfBullets
- Menentukan berapa banyak peluru yang dipegang pistol Anda.Nilai awal dan minimum
numbOfBullets
adalah 1. Setiap peluru tambahan berharga 1 poin dengan maksimum 16 peluru dengan 15 poin dihabiskan.reloadSpeed
- Menentukan berapa banyak putaran penembak Anda perlu memuat kembali senjatanya setelah dia kehabisan peluru.Nilai dasar dan maksimum adalah 4 dengan minimum adalah 1. Mengurangi atribut ini dengan 1 biaya 2 poin.
shotsPerTurn
- Menentukan berapa kali penembak Anda dapat menembak dalam satu putaran.Nilai dasar dan minimum adalah 1. Setiap peningkatan sebesar 1 biaya 3 poin sehingga Anda dapat memiliki maksimum 6 tembakan per putaran dengan 15 poin yang dihabiskan. Menaikkan atribut ini di atas
numbOfBullets
adalah kontra produktif karena Anda tidak dapat menembakkan lebih banyak peluru maka pistol Anda dapat menahannya.moveSpeed
- Menentukan berapa banyak ruang penembak Anda dapat berjalan dalam satu putaran.Nilai dasar dan minimum adalah 1. Setiap kenaikan sebesar 1 biaya 3 poin dengan kecepatan maksimum 6 dengan 15 poin yang dihabiskan. Penembak dapat berlari ke kiri atau kanan setiap belokan hingga kecepatan maksimum gerakannya. Dia juga bisa diam yang memberinya bonus (lebih lanjut tentang ini nanti).
Contoh fungsi di atas memiliki 6 poin untuk peluru, 6 poin untuk kecepatan reload dan 3 poin untuk pergerakan.
Fungsi utama
function main(bulletsLeft, yourShots, enemyShots, yourMovement, enemyMovement) {
var shots = [];
shots.push(Math.floor((Math.random() * 24) + 1));
var move = yourMovement[yourMovement.length - 1] + 2
var play = [];
play.shots = shots;
play.move = move;
play.reload = false;
return play;
}
Parameter:
bulletsLeft
, jumlah peluru tersisa di pistolmuyourShots
, ini adalah array array dari semua posisi masa lalu yang telah ditembakkan oleh penembak Anda.Contoh untuk penembak yang dapat menembak 1 peluru per putaran:
[[12],[4],[22],...]
Contoh untuk penembak yang dapat menembak 3 peluru per putaran:
[[12,13,14],[11,15,16],[9,14],...]
enemyShots
- Sama seperti di atas tetapi untuk musuh AndayourMovement
- Array semua posisi pergerakan masa lalu AndaenemyMovement
, sama seperti di atas tetapi untuk musuh Anda
Apa yang perlu Anda kembalikan:
Anda diharuskan untuk mengembalikan variabel yang memiliki 3 atribut:
shots
- Array angka yang menentukan di mana ruang penembak Anda akan menembakmove
- nomor tunggal yang menentukan ke ruang mana penembak Anda akan mencoba untuk pindah kereload
- nilai benar / salah yang dapat digunakan untuk mengisi ulang penembak
Pertarungan
Kontes mengikuti sistem round robin 1 lawan 1. Setiap pria bersenjata memiliki 50 putaran melawan setiap pria bersenjata lainnya. Putaran berlangsung sampai seseorang terkena peluru atau sampai 66 putaran berlalu (giliran adalah ketika kedua pemain menembak).
Penembak dapat memperoleh 2 poin dengan membunuh lawan mereka, 1 poin jika mereka berdua mati di tikungan yang sama atau 0 poin jika mereka mencapai batas 66 putaran. Bidang pemotretan adalah 24 ruang lebar (termasuk 1-24). Untuk memukul pemain dan memenangkan ronde Anda harus menembak di ruang yang sama dengan saat ini ia berdiri.
Berikut ini adalah panduan langkah demi langkah tentang bagaimana duel bekerja. Ini juga mencakup semua perintah dan aturan khusus yang tidak valid:
- Pada awal setiap duel, kedua pemain ditempatkan di ruang 12 dan revolvernya terisi penuh
- Fungsi utama disebut dan penembak membuat perintah bergerak pertama mereka dan memilih di mana mereka ingin menembak
- Pertama orang-orang bersenjata itu pindah ke lokasi baru mereka. Jika ada input yang tidak valid dibuat pada perintah pindah (posisi lebih rendah dari 1 atau lebih tinggi dari 24 atau mereka memindahkan lebih banyak ruang maka mereka diizinkan juga) mereka tetap di posisi yang sama.
- Pemuatan ulang berikutnya diperiksa, jika Anda kehabisan peluru pada giliran sebelumnya atau Anda memanggil pemuatan ulang diri sendiri, pria bersenjata Anda masuk ke siklus pemuatan ulang. Dia memuat ulang sebanyak mungkin saat Anda menetapkan
reloadSpeed
nilai Anda . Jika Anda memutuskan untuk diam (mengembalikan bilangan bulat ruang yang sama dengan tempat Anda berdiri sebelumnya atau hanya mengembalikan nilai yang tidak valid), Anda memuat ulang penghitung turun selama 2 putaran, bukan satu. - Sekarang saatnya memeriksa nilai pemotretan Anda, setiap belokan yang dapat Anda masukkan sebagai lokasi pemotretan sebanyak yang Anda suka, akan selalu terpotong ke jumlah valid yang sebenarnya yang ditentukan oleh: Jumlah tembakan per putaran dan jumlah peluru di revolver Anda ( mana yang lebih rendah).
shotsPerTurn
Nilai Anda dinaikkan 1 jika Anda memutuskan untuk diam di tikungan ini, sehingga Anda dapat melakukan pukulan tambahan jika Anda memutuskan untuk diam. Jika Anda berada dalam siklus reload Anda memiliki 0 tembakan. Sekarang tiba pengambilan gambar yang sebenarnya, ada 2 cara ini bisa turun. Jika kedua penembak memiliki stat movepeed yang sama maka mereka berdua menembak pada saat yang sama dan keduanya dapat saling membunuh pada saat yang sama. Jika mereka memiliki statistik kecepatan gerak yang berbeda, bot dengan status kecepatan gerak yang lebih tinggi mulai menembak terlebih dahulu dan jika dia membunuh lawannya, dia memenangkan putaran ini. Jika penembak dapat menembak satu atau lebih peluru dalam satu putaran maka ia mengikuti aturan yang sama seperti di atas kecuali dalam lebih banyak siklus sebagai contoh: Mari kita katakan bahwa bot1 memiliki 3 peluru dan lebih cepat dan bot 2 memiliki 2 peluru maka akan seperti ini :
Bot1 shoots, Bot2 shoots cycle 1 Bot1 shoots, Bot2 shoots cycle 2 Bot1 shoots cycle 3
Ini akan terlihat sama jika mereka memiliki kecepatan gerakan yang sama hanya bahwa jika sekarang Bot1 memukul Bot2 dalam siklus yang sama Bot2 juga bisa menekan Bot1 dan itu akan menjadi dasi.
ATURAN
Pertama saya menyalin beberapa aturan dari entri Hobi Calvin yang juga berlaku di sini.
Saat mendeklarasikan variabel JavaScript baru, Anda harus menggunakan kata kunci var. Ini karena variabel yang dideklarasikan tanpa var menjadi global daripada lokal, sehingga akan mudah untuk secara tidak sengaja (atau sengaja) mengacaukan pengontrol atau berkomunikasi secara bebas dengan pemain lain. Harus jelas bahwa Anda tidak mencoba menipu.
Ketika mendeklarasikan fungsi, yang terbaik adalah menggunakan kata kunci var juga, yaitu menggunakan var f = function(...) {...}
daripada function f(...) {...}.
saya tidak sepenuhnya yakin mengapa, tetapi kadang-kadang tampaknya membuat perbedaan.
Dalam kode Anda, Anda mungkin tidak ...
- mencoba mengakses atau memodifikasi controller atau kode pemain lain.
- mencoba mengubah apa pun yang ada di dalam JavaScript.
- buat kueri web.
- jika tidak lakukan hal-hal jahat.
Aturan tambahan saya:
- Pengguna dapat membuat sebanyak mungkin penembak yang mereka inginkan dan mengubah fungsi mereka untuk jangka waktu tertentu
- Saya akan menghapus entri apa pun dari game yang membutuhkan waktu terlalu banyak atau mencoba menipu dengan cara apa pun yang menurut saya cocok
- Nama-nama atribut yang harus dikembalikan oleh fungsi Anda harus sama dengan pada contoh dengan struktur yang sama!
Jawaban Anda harus dalam format ini, fungsi pertama adalah fungsi atribut dan yang kedua adalah fungsi logika. Perhatikan bahwa saya menggunakan tanda seru karena jika Anda hanya membuat baris baru di antara blok kode parser tidak akan melihat dua blok kode yang berbeda sehingga Anda harus menggunakan simbol apa pun (cukup gunakan tanda seru) untuk memisahkannya:
var bot = {
name: "testBot",
numbOfBullets: 7,
reloadSpeed: 1,
shotsPerTurn: 1,
moveSpeed: 2
}
return bot
var shots = []
var testBot_moveUp = true
if(Math.random() * 2 > 1)
testBot_moveUp = false
shots.push(Math.floor((Math.random() * 24) + 1))
var move = 0
if (testBot_moveUp)
move = yourMovement[yourMovement.length - 1] + 2
else
move = yourMovement[yourMovement.length - 1] - 2
move = 12
var play = []
play.shots = shots
play.move = move
play.reload = false
return play
Dan inilah pengontrolnya: GAME CONTROLLER . Cukup buka tautan dan tunggu bot dimuat, lalu pilih yang mana yang Anda inginkan dalam pertarungan (mungkin semua) dan tekan tombol mulai.
Saya juga memasukkan testbot sebagai jawaban saya yang akan bersaing, juga berfungsi sebagai contoh tentang bagaimana struktur jawaban seharusnya. Sebagai catatan, jika Anda membuat kesalahan kecil dan mengedit jawaban Anda, algoritma stackexchanges mungkin tidak langsung mengambilnya dan situs yang menggunakan pengontrol yang dihasilkan oleh stackexchange tidak diperbarui (tetapi akan nanti atau jika Anda membuat perubahan lebih besar yang saya sarankan lakukan, cukup tambahkan beberapa teks di akhir). Inilah situsnya: codelink
sumber
<!---->
untuk memisahkan kode kunci "tanpa terlihat" (tanpa!
).Jawaban:
Pandarus
Pandarus mengandalkan kecepatannya untuk keluar dari jalan peluru, dan menggunakan gerakan musuh sebelumnya untuk menebak ke mana mereka akan pergi.
sumber
Pria Sederhana
Tidak sempurna dalam segala hal, tetapi cukup baik dalam segala hal melalui kekuatan yang lebih rendah.
sumber
Bot pengujian, ini ditambahkan sebagai tes kontrol. Jika ada yang kalah, Anda harus malu :). Memperbaiki perilaku bot, salin menempel bot tes yang salah (selalu tetap di bidang 12)
sumber
sumber
Sang Penenun
Lebih peduli dengan tetap hidup daripada membunuh, dia menjalin bolak-balik, meningkatkan jarak setiap kali. Pilihan tempat acak dalam jangkauan musuh yang telah terbukti untuk menembak
sumber
move = 12 + moveSpeed - 1;
setara denganmove = 11 + moveSpeed;
, bukan? Kalau tidak, ini terlihat seperti bot yang bagus;)Alexander Hamilton
Jika dia tidak menang di babak pertama, mungkin akan mati
!
sumber
Aaron Burr
!
sumber
Winger menembakkan sebaran yang membatasi jangkauan musuh. Dia juga agak berlari ke arah tembakan musuh.
Biarkan saja ini di sini untuk mendorong reset.
sumber
SMG
Senjatanya adalah sampulnya. Sayangnya, itu sepertinya menghalangi pandangannya. Dia juga pandai memanfaatkan posisi diam untuk memuat ulang lebih cepat dan mendapatkan tembakan tambahan.
sumber
sumber
sumber
Diephobus
Diephobus percaya pada peluru tanpa ampun menembak di mana pun dia pikir musuhnya, tapi dia agak lambat.
sumber
ASCIIGunInTheWest
Menembak 2 tembakan satu putaran, dan menebak ke mana musuh bisa pergi berdasarkan seberapa cepat dia bergerak. Maafkan saya jika ada kesalahan, saya belum banyak kode di JavaScript.
!
EDIT: Rupanya bot saya (hanya milik saya) tidak dapat digunakan di JSFiddle. Adakah yang tahu mengapa ini terjadi? Saya menggunakan semua poin saya untuk penembak saya, jadi saya tidak berpikir saya telah didiskualifikasi.
sumber