Tank savaşı yapalım!
Kısmen ilham Lazerler ile Yok
Amaç
Göreviniz bir tankı kontrol etmektir. Hareket edin ve 2D savaş alanındaki diğer tankları ve engelleri vurun. Son tank ayakta kazanacak!
Harita biçimi
Sizin tankı bir dayalı bir 2D sahada olacak n
tarafından n
birim kare ızgarasının. n
Başvuru sayısına neyin dayandığına karar vereceğim . Her kare şunlardan yalnızca birini içerebilir:
- Bir tank
- Bir ağaç
- Bir kaya
- Bir duvar
- Hiçbir şey değil
Tüm engeller ve tanklar alanlarını tamamen dolduruyor ve onları vuran tüm atışları daha aşağıya zarar vermekten alıkoyuyorlar.
İşte #
= tank; T
= ağacı; R
= kaya; W
= duvarı; .
= hiçbir şey n
= 10
.....#....
..T....R..
WWW...WWWW
W......T..
T...R...Ww
W...W.....
W....W...T
WWWWWW...R
W.........
WWWWWWRT..
Koordinatlar biçimindeki artışlar sağ ve sola üstüne yükselir alt. Sol alt boşluk koordinat içerir . Her tank herhangi bir boş yere gidebilir ve herhangi bir yönde ateş edebilir.x, y
x
y
0, 0
Harita Dinamiği
Tankınızın sadece diğer tankları vurması gerekmez! Haritada bir şey vurursa, her şey olabilir.
- Bir duvara vurulursa, 1'den 4'e kadar çeşitli atışlardan sonra yıkılacaktır.
- Bir ağaç vurulursa, hemen yok edilir
- Eğer bir kaya vurulursa, atış onun üzerinden geçecek ve vurduğu bir sonraki şeye zarar verecektir.
Bir şey yok edildiğinde, artık harita üzerinde değildir (hiçbir şeyle değiştirilmeyecektir). Bir atış bir engeli yok ederse, engellenir ve yolu boyunca başka hiçbir şeye zarar vermez.
Tank dinamiği
Her tank life
= 100 ile başlar . Bir tanktaki her atış life
mesafeye göre 20-30 azalır . Bu hesaplanabilir delta_life=-30+(shot_distance*10/diagonal_map_length)
(burada diagonal_map_length
olduğu (n-1)*sqrt(2)
). Ayrıca, her tank life
tur başına 1 tane üretir.
Dönüşler
Bazı turlar yapılacaktır (gönderimlerim olduğunda karar vereceğim). Her turun başında rastgele bir harita oluşturulacak ve üzerine tanklar rastgele boş yerlere yerleştirilecektir. Her turda, her tanka rasgele sırada bir dönüş verilir. Her tanka bir dönüş verildikten sonra, aynı sırayla tekrar dönüşler yapılacaktır. Tur sadece bir tank kalana kadar devam eder. Bu tank kazanan olacak ve 1 puan alacaklar. Oyun daha sonra bir sonraki tura geçecek.
Tüm turlar yapıldıktan sonra puanları bu soruya göndereceğim.
Bir tankın dönüşü sırasında aşağıdakilerden birini yapabilir
- Yatay veya dikey olarak tek yönde 3 boşluk hareket ettirin. Tank bir engel veya başka bir tank tarafından engellenirse, engelden veya tanktan geçmeden mümkün olduğunca hareket ettirilir.
- Derece olarak kayan nokta açısı ile temsil edilen bir yönde çekim yapın.
TurnAction.Direction.EAST
Tankınızın yerel alanının x ekseni (yatay olarak soldan sağa, aka doğu veya ) 0 derece ve açılar saat yönünün tersine artar. Çekimler yanlış ve çekimin gerçek açısı seçtiğiniz açıdan 5 derece daha büyük veya daha az olabilir. - Hiçbir şey yapma.
Dönüşler zamanla sınırlı değildir, ancak bu her şeyi asmak için kasıtlı olarak zaman harcayabileceğiniz anlamına gelmez.
Gönderimler / Protokol
Gönderilen her program sahadaki bir tankı kontrol edecektir. Kontrol programı Java'da, bu yüzden programlarınızın şimdilik Java'da olması gerekiyor (muhtemelen bir noktada diğer diller için bir sarıcı yazacağım, ya da kendi yazabilirsiniz).
Programlarınız Tank
, aşağıdaki yöntemlere sahip arayüzü uygular :
public interface Tank {
// Called when the tank is placed on the battlefield.
public void onSpawn(Battlefield field, MapPoint position);
// Called to get an action for the tank on each turn.
public TurnAction onTurn(Battlefield field, MapPoint position, float health);
// Called with feedback after a turn is executed.
// newPosition and hit will be populated if applicable.
public void turnFeedback(MapPoint newPosition, FieldObjectType hit);
// Called when the tank is destroyed, either by another tank,
// or because the tank won. The won parameter indicates this.
public void onDestroyed(Battlefield field, boolean won);
// Return a unique name for your tank here.
public String getName();
}
Battlefield
Sınıf (nesneler bir 2D dizi içerir Battlefield.FIELD_SIZE
göre Battlefield.FIELD_SIZE
savaş şeyler temsil etmektedir). Battlefield.getObjectTypeAt(...)
Bir verecek FieldObjectType
belirtilen koordinatlarda nesne için (biri FieldObjectType.ROCK
, FieldObjectType.TREE
, FieldObjectType.TANK
, FieldObjectType.WALL
, ya da FieldObjectType.NOTHING
). Bir nesneyi haritanın menzilinin dışına çıkarmaya çalışırsanız (koordinatlar <0 veya> = Battlefield.FIELD_SIZE
) o zaman bir IllegalArgumentException
atılır.
MapPoint
haritadaki noktaları belirtmek için kullanılan bir sınıftır. Koordinatlara erişmek için MapPoint.getX()
ve tuşlarını kullanın MapPoint.getY()
.
DÜZENLEME: Bazı yardımcı yöntemleri eklenmiştir: MapPoint.distanceTo(MapPoint)
, MapPoint.angleBetween(MapPoint)
, Battlefield.find(FieldObjectType)
ve TurnAction.createShootActionRadians(double)
tarafından önerilen Wasmoo .
Javadoc'larda daha fazla bilgi bulunabilir, aşağıdaki bölüme bakın.
Tüm (genel API) sınıfları paketin altındadır zove.ppcg.tankwar
.
Kontrol Programı
Kontrol programının ve tank API'sının tam kaynağı ve javadocları GitHub repo'mda bulunabilir: https://github.com/Hungary-Dude/TankWarControl
Bir hata görürseniz veya bir iyileştirme istiyorsanız, çekme istekleri ve / veya yorum göndermekten çekinmeyin.
İki örnek tank programı yazdım RandomMoveTank
ve RandomShootTank
(isim her şeyi söylüyor).
Tankınızı çalıştırmak için tam nitelikli (paket adı + sınıf adı) tank sınıfınızı tanks.list
(satır başına bir sınıf) ekleyin, ayarları gerektiği gibi düzenleyin zove.ppcg.tankwar.Control
(dönüş gecikmesi, alanın GUI temsilini gösterilip gösterilmeyeceği vb.), ve koş zove.ppcg.tankwar.Control
. Listede en az 2 tank bulunduğundan veya sonuçların tanımsız olduğundan emin olun. (Gerekirse örnek tankları kullanın).
Programlarınız bu kontrol programı altında makinemde çalıştırılacak. Yazdıktan sonra kaynağa bir bağlantı ekleyeceğim. Kaynakta düzenlemeler yapmaktan çekinmeyin.
kurallar
- Gönderileriniz yukarıdaki yönergelere uymalıdır
- Programlarınız dosya sistemine, ağa erişemez veya makineme hiçbir şekilde saldırmaya çalışamaz
- Programlarınız hile yapmak için kontrol programımdan yararlanmaya çalışmayabilir
- Troll yok (programınızın her şeyi kapatmak için kasıtlı olarak zaman kaybetmesi gibi)
- Birden fazla gönderiminiz olabilir
- Sunumlarla yaratıcı olmaya çalışın!
- Programlara keyfi olarak izin verme veya vermeme hakkını saklıyorum
İyi şanslar!
GÜNCELLEME: Duvar ışınlama hatasını düzelttikten ve rejenerasyon uyguladıktan sonra, mevcut başvuruları 100 tur için çalıştırdım.Battlefield.FIELD_SIZE = 30
GÜNCELLEME 2: Groovy ile biraz kandırdıktan sonra yeni gönderimi RunTank'ı ekledim ...
Güncellenmiş sonuçlar:
+-----------------+----+
| RandomMoveTank | 0 |
| RandomShootTank | 0 |
| Bouncing Tank | 4 |
| Richard-A Tank | 9 |
| Shoot Closest | 19 |
| HunterKiller 2 | 22 |
| RunTank | 23 |
| Dodge Tank | 24 |
+-----------------+----+
Şu anda tanklar tur başına 1 can üretiyor. Bu artırılmalı mı?
MapPoint
s'x
vey
floats
? Olmamalılar mıints
?