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.
speed
dan strength
di konstruktor Player.
dirX
,, dirY
dan dirZ
(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)