Gim king-of-the-hill ini adalah gim strategi di mana Anda harus melempar balon air dan menghindari percikan air. Tujuannya adalah untuk mendapatkan poin terbanyak. Anda akan diberikan peta lapangan dan lokasi balon air. Anda dapat kembali ke balon air (jika Anda cukup dekat) ke arah tertentu atau Anda ingin bergerak ke arah tertentu.
Secara khusus: Balon air akan mulai pada (0, 0)
30 unit tinggi dan jatuh. Jika balon air menyentuh tanah, pemain akan dipilih secara acak untuk kehilangan 4 poin, dengan lebih banyak berat diberikan kepada mereka yang lebih dekat dengan balon. Selain itu, pemain yang terakhir memukul balon akan mendapatkan 3 poin. Karena itu, jika Anda menekan balon lurus ke bawah, kemungkinan besar Anda akan kehilangan 1 poin.
Anda akan menulis kelas yang diperluas Player
. Anda harus mengimplementasikan konstruktor. Konstruktor akan terlihat seperti:
public Player1() {
super(/* Some numbers */ 3, 3, 4)
}
Angka-angka ini adalah double
s. Angka pertama mewakili kecepatan pemain, yang kedua mewakili kekuatan, dan yang ketiga mewakili keberuntungan. Angka-angka harus ditambahkan hingga 10 atau kurang dan tidak ada angka mungkin kurang dari atau sama dengan nol.
Kedua, Anda harus menerapkan move
metode ini. Ini adalah contoh move
metode:
@Override
protected Action move(Map<Player, Point2D> map, Balloon b) {
// Get my own location
Point2D myself = map.get(this);
// If I'm close enough to the balloon
// then hit the balloon
if (myself.distanceSq(b.getLocation()) <= 16) {
double d = (r.nextDouble() - 0.5) * 3;
// Random y direction, z direction is what's left
return new Hit(0, d, Math.sqrt(9 - d*d));
} else {
double diffX = b.getLocation().getX() - myself.getX(),
diffY = b.getLocation().getY() - myself.getY();
// Move towards the balloon
return new Movement(Math.signum(diffX)*3/Math.sqrt(2), Math.signum(diffY)*3/Math.sqrt(2));
}
}
Ada sejumlah hal penting di sini. Pertama, perhatikan bahwa bidang dilewatkan sebagai Map<Player, Point2D>
. Bidang ini tidak terbatas - tidak ada batasan seberapa jauh Anda bisa melangkah. Ini bukan array 2 dimensi atau semacamnya. Selain itu, ini berarti Anda akan memiliki koordinat non-integer sebagai lokasi Anda. Ini sangat oke.
Konsekuensi lain adalah bahwa pemain dan balon mungkin tumpang tindih. Bahkan, dua pemain mungkin berada di lokasi yang sama persis!
Balon memiliki kecepatan dan arah tertentu. Secara umum, itu akan jatuh pada tingkat 3 unit / langkah. Itu juga bergerak ke x
arah dan y
arah. Ketika Anda mengembalikan a Hit
, Anda melewati arah x, y, dan z yang Anda dorong balon. Anda tidak bisa memukul balon yang tingginya lebih besar dari 10 atau yang jarak dari Anda (hanya pada dua dimensi) lebih besar dari 4. Selain itu, jika memang benar bahwa x^2 + y^2 + z^2 > s^2
di mana s
adalah kekuatan Anda, dan x
, y
, dan z
adalah arah yang anda menekan , tindakan Anda dibuang. Kekuatan hit Anda diperkuat oleh angka acak di antara 0
dan luck
(yang berarti itu bisa turun jika keberuntungan Anda rendah).
Demikian pula, Anda dapat mengembalikan a Movement
dengan x
dan y
mengkoordinasikan bahwa Anda bergerak (perhatikan bahwa Anda tidak dapat melompat di udara). Jika di x^2 + y^2 > s^2
mana s
kecepatan Anda, tindakan Anda dibuang.
Jika balon air menyentuh tanah maka pemain acak dipilih, dengan lebih banyak bobot diberikan kepada mereka yang paling dekat - tetapi lebih sedikit berat bagi mereka yang memiliki lebih banyak keberuntungan. Pemain yang dipilih kehilangan 4 poin.
Pengendali: https://github.com/prakol16/water-balloon-wars/tree/master
Permainan ini berlangsung 1000 langkah. Pada akhirnya, akan ada file bernama log.out
. Salin dan tempel data ke dalam biola ini untuk melihat permainan: https://jsfiddle.net/prankol57/s2x776dt/embedded/result/
Atau lebih baik lagi, lihat dalam 3D: http://www.brianmacintosh.com/waterballoonwars (terima kasih kepada BMac)
Pemain dengan jumlah skor tertinggi setelah 100 (mungkin lebih, tetapi tidak kurang) permainan menang.
Jika Anda ingin mengirimkan solusi, Anda mungkin ingin membaca detail yang sangat spesifik di https://github.com/prakol16/water-balloon-wars/tree/master .
Edit 3/8 :
Ini adalah skor akhir untuk saat ini (1000 iterasi, tanpa menyertakan pemain 1 dan 2). Jika Anda mengedit posting Anda, Anda dapat berkomentar, dan saya akan mengulang skor:
{
class players.BackAndForth=-75.343,
class players.Hydrophobe=-0.800,
class players.KeepAway=-53.064,
class players.Weakling=39.432,
class players.Repeller=21.238,
class players.LuckyLoser=-30.055,
class players.AngryPenguin=-49.310
}
Pemenangnya adalah Weakling
dengan rata-rata 39 poin. Posisi Kedua Repeller
dengan 21 poin.
sumber
speed
danstrength
di konstruktor Player.dirX
,,dirY
dandirZ
(diperkuat oleh keberuntungan Anda) hanya ditambahkan ke kecepatan balon. Jika beberapa orang memukulnya (agak tidak mungkin) maka pemain yang mungkin mendapatkan tiga poin diputuskan beruntung (lihat detail spesifik)Jawaban:
Simulator
Saya harap ini baik-baik saja, karena itu sebenarnya bukan entri. Saya benar-benar menyukai gagasan simulator visual dan saya ingin membuatnya sendiri yang akan membuatnya sedikit lebih mudah untuk melihat semuanya sekaligus (full 3D).
2/28 9:06 PST : perbarui dengan kontrol ikuti, warna
3/4 8:47 PST : perbarui dengan slider untuk kecepatan simulasi, dan membuat memulai game baru benar-benar berfungsi tanpa menyegarkan halaman (gunakan Ctrl-F5 untuk memuat ulang skrip yang di-cache)
Visualisasi ThreeJS online
sumber
Bolak-balik
Bot ini mencoba mendekat dan menabrak balon sampai ketinggiannya terlalu rendah dan mencoba untuk melarikan diri.
sumber
AngryPenguin
Penguin ini marah karena dia tidak bisa terbang ke balon, jadi dia mencoba untuk memukul balon ke wajah orang-orang yang berdiri di sekitarnya.
sumber
Orang lemah
Bot ini hanya bisa menyentuh balon karena sangat lemah, melainkan hanya mengandalkan keberuntungannya yang tinggi. Karena itu ia melakukan mirip dengan LuckyLoser (dari mana bot ini terinspirasi).
Dia tampaknya melakukan semua bot saat ini termasuk Repeller.
EDIT: mengurangi kecepatan demi keberuntungan
sumber
Hydrophobe
Ini adalah salah satu bot paling sederhana yang mungkin tetapi karena kompetitif saya akan mempostingnya.
Strategi: well ... bot ini membenci air sehingga hilang begitu saja.
Karena bot akan terciprat sangat jarang, skornya akan sedikit di bawah rata-rata 0 poin. Jumlah skor semua bot adalah -1 * [balon memukul tanah] sehingga Hydrophobe mungkin akan mencetak skor di atas rata-rata.
sumber
Jauhkan
Pemain ini mengejar balon selama tingginya> 2. Begitu balon itu mengenai balon, balon itu mengenai balon yang jauh dari pemain terdekat. Saat tinggi balon <2, pemain ini melarikan diri.
Sunting: Saya bermain dengan Player1 dan Player2 disertakan. Pemain ini menang dalam hal itu, tetapi kalah ketika saya mengeluarkannya. Booooo.
sumber
Lucky Loser
Bot ini mengandalkan skor keberuntungan tinggi. Jika tidak di dekat balon, balon itu berlari ke arah balon. Begitu mendekati balon, jika setidaknya ada 2 pemain lain di jangkauan balon, ia akan melonjak ke tanah. Kalau tidak, dia akan langsung mengetuknya.
EDIT: Memperbaiki bug gerakan yang sebenarnya membuat saya melarikan diri tidak ke arah balon> _ <Sekarang saya hanya berlari lurus ke arah balon jika saya tidak bisa mengenai itu.
sumber
Repeller
Bot ini hanya memiliki satu gerakan nyata dan artinya terus mendorong balon menjauh dari dirinya sendiri. yaitu memukul mundur balon.
Tampaknya berkinerja baik terhadap tanaman bot saat ini (LuckyLoser, AngryPenguin, Hydrophobe, BackAndForth) hampir selalu menang. Namun Hydrophobe, dengan tidak bertindak, selalu siap untuk menang jika bot lain semua berhasil mendapatkan skor negatif: P
sumber