Tepenin kralı oyunu, bir su balonunun etrafına atmanız ve su sıçramasından kaçınmanız gereken bir strateji oyunudur. Amaç en çok puanı elde etmektir. Size alanın haritası ve su balonunun yeri verilecektir. Su balonuna (yeterince yakınsanız) belirli bir yönde vurmak istediğinizi ya da belirli bir yönde hareket etmek istediğinizi döndürebilirsiniz.
Özellikle: Su balonu (0, 0)
30 ünite yükseklikte başlar ve düşer. Su balonu yere çarparsa, bir oyuncu rastgele olarak 4 puan kaybeder ve balona daha yakın olanlara daha fazla ağırlık verilir. Ayrıca, balona son vuran oyuncu 3 puan kazanacak. Bu nedenle, balona doğrudan vurursanız, büyük olasılıkla 1 puan kaybedersiniz.
Genişleyen bir sınıf yazacaksınız Player
. Yapıcıyı uygulamanız gerekiyor. Yapıcı şöyle görünecektir:
public Player1() {
super(/* Some numbers */ 3, 3, 4)
}
Bu sayılar double
s. İlk sayı oyuncunun hızını, ikincisi gücü ve üçüncüsü de şansı temsil eder. Sayılar en fazla 10 veya daha az olmalıdır ve hiçbir sayı sıfıra eşit veya sıfırdan küçük olamaz .
İkincisi, move
yöntemi uygulamalısınız . Bu örnek bir move
yöntemdir:
@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));
}
}
Burada bir takım önemli şeyler var. İlk olarak, alanın a olarak iletildiğine dikkat edin Map<Player, Point2D>
. Alan sonsuzdur - ne kadar ileri gidebileceğiniz konusunda bir sınır yoktur. 2 boyutlu bir dizi veya bunun gibi bir şey değildir. Ayrıca, konumunuz olarak tamsayı olmayan koordinatlara sahip olacağınız anlamına gelir. Bu gayet iyi.
Başka bir sonuç, oyuncuların ve balonun üst üste gelebilmesidir. Aslında, iki oyuncu tam olarak aynı yerde olabilir!
Balonun belirli bir hızı ve yönü vardır. Genel olarak, 3 birim / adım oranında düşecektir. Aynı zamanda bir x
yönde ve y
yönde hareket eder . A döndüğünüzde Hit
, balonu ittiğiniz x, y ve z yönlerini geçersiniz. Sen eğer doğruysa o, kimin yükseklik 10'dan büyük ise veya kimin mesafe sizin (yalnızca iki boyut üzerine) den ek olarak daha büyük 4. olan bir balon vuramaz x^2 + y^2 + z^2 > s^2
nerede s
senin gücünü ve x
, y
ve z
sen vurduğunu tarifi , işleminiz atılır. İsabet gücünüz 0
ve arasında rastgele bir sayı ile güçlendirilir luck
(yani şansınız düşükse düşebilir).
Benzer bir şekilde, dönebilir Movement
ile x
ve y
sen (siz havada atlamak olamayacağını notu) hareket olduğunu koordinatlar. Hızınız x^2 + y^2 > s^2
nerede s
ise, eyleminiz atılır.
Su balonu yere çarptığında, en yakın olanlara daha fazla ağırlık verilen, ancak daha fazla şansa sahip olanlara daha az ağırlık veren rastgele bir oyuncu seçilir. Seçilen oyuncu 4 puan kaybeder.
Denetleyici: https://github.com/prakol16/water-balloon-wars/tree/master
Oyun 1000 adım sürer. Sonunda adlı bir dosya olacak log.out
. Oyunu görüntülemek için verileri kopyalayıp bu kemanın içine yapıştırın: https://jsfiddle.net/prankol57/s2x776dt/embedded/result/
Ya da daha iyisi, 3D olarak görüntüleyin: http://www.brianmacintosh.com/waterballoonwars (BMac sayesinde)
100 maçtan sonra en yüksek skoru alan oyuncu kazanır (daha fazla olabilir, ancak daha az olamaz).
Bir çözüm göndermek istiyorsanız, gerçekten ayrıntılı bilgileri https://github.com/prakol16/water-balloon-wars/tree/master adresinde okumak isteyebilirsiniz .
3/8 düzenle :
Bunlar şimdilik kesin skorlardır (1 ve 2 oyuncuları dahil etmeden 1000 iterasyon). Yayınınızı düzenlerseniz, yorum yapabilirsiniz ve puanları tekrar yapacağım:
{
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
}
Kazanan, Weakling
ortalama 39 puan aldı. Repeller
21 puanla 2. oldu .
speed
ve strength
Player yapıcısındasınız.
dirX
, dirY
ve dirZ
(sizin şans güçlendirilmiş) basitçe balonun hızları eklenir. Birden fazla kişi