Giriş
5. KOTH'm için, size birkaç bükülme ile tanınmış Battleship oyununa dayanan bir meydan okuma sunuyorum . Sadece 5 "traditionnal" sınıfı arasında seçim yapabileceğiniz bir gemiye komuta edeceksiniz, ancak her turda birden fazla eylem gerçekleştirebileceksiniz. Bu bir FFA (Herkes İçin Ücretsiz) olarak oynanır ve hedefiniz son gemi ayakta olmak olacaktır.
Prensip
Oyun sıra tabanlı. Oyunun başlangıcında, geminizin sınıfını seçmeniz gerekecek. Daha sonra oyuncular her gemiye bağlı olarak birkaç işlem gerçekleştirebilecekler.
Oyun, tarafı şu şekilde tanımlanan bir 2D ızgarada (X, Y) gerçekleşir:
X = 30 + numberOfPlayer
Y = 30 + numberOfPlayer
Her geminin başlangıç pozisyonu rastgele.
Oyun sırası her turda rastgele seçilir ve "sıradaki" pozisyonunuzu veya oyuncu sayısını bilmezsiniz. Oyun 100 tur ya da sadece bir gemi hayatta kalana kadar sürer .
Bir düşman gemisine her vurduğunuzda veya vurduğunuzda puan kazanacak veya kaybedeceksiniz. En yüksek puana sahip oyuncu kazanır. Kazanana bir ödül verilecektir (katılımcı sayısına bağlı olarak değer).
Kontrolör size komut argümanları yoluyla giriş sağlar ve programınızın stdout aracılığıyla çıkış yapması gerekir.
Sözdizimi
İlk Dönüş
Programınız herhangi bir argüman olmadan bir kez çağrılacaktır . Geminizi seçmek için 1 ile 5 (dahil) arasında bir tam sayı çıkarmanız gerekir:
1
: Destroyer [uzunluk: 2, hamle / dönüş: 3, çekim / dönüş: 1, aralık: 9, mayın: 4]
Beceri : Ücretsiz gemi rotasyonu (bekleme süresi yok)
2
: Denizaltı [uzunluk: 3, hareket / dönüş: 2, atış / dönüş: 1, aralık: 5, mayın: 4]
Beceri : Can Dalma / Yüzey (çıkışlara bakın). Sualtıdayken yalnızca "Hareket" eylemlerini kullanabilirsiniz ve yalnızca tarama ile görülebilir. Bir vuruşla vurulamazsınız, ancak mayınlardan hasar alabilirsiniz.
3
: Kruvazör [uzunluk: 3, hareket / dönüş: 1, atış / dönüş: 2, aralık: 9, mayın: 2]
Beceri : Tamir edebilir (çıkışlara bakın)
4
: Savaş gemisi [uzunluk: 4, hareket / dönüş: 1, atış / dönüş: 3, aralık: 7, mayın: 1]
Beceri : Kalkan Olabilir (çıkışlara bakın)
5
: Taşıyıcı [uzunluk: 5, hareket / dönüş: 1, atış / dönüş: 1, aralık: 7, mayın: 3]
Beceri : Şutlar hedefe (1 aralık sıçrama hasarı) AOE (Etki Alanı) hasarı verir. Hedefe atışla vurulursa, bu geminin en fazla 2 hücresi de hasar görür.
Dönüşler
Giriş
Programınız her çağrıldığında, şu biçimde bağımsız değişkenler alır:
Round;YourPlayerId;X,Y,Direction;Hull;Moves,Shots,Mines,Cooldown;Hits,Sunken,Damage;Underwater,Shield,Scan;Map
Turlar 1 dizinli.
Örnek giriş
1;8;1,12,0;111;1,2,2,0;0,0,0;0,0,0;UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUXXXX.......UUUUUUUUXXXX.......UUUUUUUUXXXX.......UUUUUUUUXXXX.......UUUUUUUUXXXX.......UUUUUUUUXXXX.O.....UUUUUUUUXXXX.O.....UUUUUUUUXXXX.O.....UUUUUUUUXXXX.......UUUUUUUUXXXX.......UUUUUUUUXXXX.......UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
Burada 1. tur, oyuncu 8'iniz.
Geminiz konumlandırılmış (X = 1, Y = 12) ve yönünüz yukarı doğru (0 = Üst, 1 = Sağ, 2 = Alt, 3 = Sol) ).
Tekneniz hasar görmemiştir (geminizin uzunluğu 3'tür ve her bit doğrudur [1 = Tamam, 0 = Hasarlı]). 1 kez hareket edebilir, 2 kez ateş edebilir, 2 mayın kaldırabilir ve "becerin" kullanılabilir (bekleme süresi = 0).
Hiçbir şeye vurmadınız, gemiyi batırmadınız ve vurulmadınız.
Su altında değilsiniz, kalkanlarınız (varsa) etkinleştirilmemiştir ve taramanız da değildir.
Daha sonra haritada daha fazlası ...
Çıktı
Bu dönüşü gerçekleştireceğiniz işlemleri açıklayan bir Dize çıkarmanız gerekir. Çıktı Dizenizdeki karakterlerin sırası, işlemlerin sırasını tanımlar. Geminizin sınırlarını aşmıyorsa aynı işlemleri birden çok kez gerçekleştirebilirsiniz. Bir veya birden fazla eylem geçersizse, her biri ayrı ayrı olarak değerlendirilir W
. Kullanılabilir işlemlerin listesi:
M
: 1 hücreyi baktığınız yönde hareket ettirin (1 hareket tüket)
B
: 1 hücreyi baktığınız yönden geri (1 hamle tüket)
C
: Geminizi saat yönünde döndürün (Muhripler için 1 hamle / serbest
K
bırakın ) : Geminizi döndürün saat yönünün tersine (Muhripler için 1 hamle / serbest) tüketme
A
: Geminizi baktığınız yöne çevirin (yalnızca başka bir gemi hücreyi baktığınız yönde işgal ediyorsa / geminizi hareket ettirmiyorsa / tüm hareketleri tüketmiyorsa çalışır)
F
: Menzil içindeki bir hücreye 1 atış yapın (1 atış tüketin). Bu biçimde hedeflenen hücre tarafından (X - [+ -] [+]) takip edilmesi gereken E / örnek: F+2-3
)
N
: yer gemi bitişik bir hücreye 1 madeni () her çekim ve 1 madeni tüketir. Bu biçimde hedeflenen hücre tarafından takip edilmelidir ([+ -] x [+ -]) E / örnek: N+0+1
)
S
: Taramanızı bir sonraki dönüş için etkinleştirin (tüm atışları tüketin)
R
: Hasarlı gövdeyi geminizin "kafasına" en yakın olanı onarın (tüm atışları tüketin, bekleme süresi = sadece 3 dönüş / Kruvazör)
P
: Dalma / Yüzey (tüm atışları, bekleme süresi = 3 dönüş, maksimum süre = 5 dönüş / yalnızca Denizaltı)
D
: Bir sonraki dönüşünüzde bir sonraki hasarı önlemek için kalkanınızı etkinleştirin (tüm atışları tüket, bekleme süresi = 3 / Yalnızca savaş gemisi)
W
: Bekleyin (hiçbir şey yapmaz)
Açıklama : "Tüm hamleleri / atışları tüket", bu eylemi yalnızca bu dönüş sırasında daha önce hamlelerinizi / atışlarınızı kullanmadıysanız kullanabileceğiniz anlamına gelir.
Örnek çıktı
MF+9-8CM
: 1 hücreyi hareket ettirir, ardından geminizin "başına" göreceli konumu (targetX = X + 9, targetY = Y - 8) olan hücreye ateş eder, saat yönünde döner ve sonunda 1 hücreyi tekrar hareket ettirir.
Oynanış
Izgara
İşte 3 oyuncunun yerleştirildiği örnek bir tablo (33 x 13):
███████████████████████████████████
█ █
█ 00 █
█ 2 █
█ 2 █
█ 2 █
█ █
█ 11111 █
█ M █
█ █
█ █
█ █
█ █
█ █
███████████████████████████████████
Gördüğümüz gibi M
, oyuncunun hemen yanında bir Maden var 1.
Konum 2'yi ve yönü anlamak için 2. oyuncuyu alalım:
Oyuncu 2'nin pozisyonu X = 3, Y = 4, Yön = 3'tür. Yönü "Alt" olduğundan, "gemi hücreleri" nin geri kalanı "kafasının" üzerine "konumlandırılır (X = 3, Y = 3) & (X = 3, Y = 2)
Oyuncunun haritası
Her oyuncunun aldığı son argüman "kendi" haritasıdır. Varsayılan olarak, bir gemi 5 hücre aralığındaki her şeyi algılar , ancak bu aralığı 9'a çıkarmak için bir Taramayı etkinleştirebilir .
Argüman daima 361 (19 x 19) karakter uzunluğundadır. Her karakterin bu şekilde tanımlanan bir öğeye karşılık geldiği, geminizin "başı" etrafında merkezlenmiş kareyi temsil eder:
.
: Boş hücre
O
: Geminiz
M
: Madenler
X
: Duvar (harita dışındaki hücreler)
U
: Bilinmiyor (tarama ile gösterilecek)
A
: Düşman gemisi hasarsız hücre
B
: Düşman gemisi hasarlı hücre
C
: Düşman gemisi sualtı hasarsız hücre (sadece tarama ile görüldü)
D
: Düşman gemisi sualtı hasarlı hücresi (sadece tarama ile görülür)
W
: Enkaz (ölü gemi)
Dize, ilk satırın 19 karakterinden, ardından ikinci satırın 19 karakterinden oluşur ... 19. satıra kadar.
2 nolu oyuncunun tarama ile ve tarama olmadan ne aldıklarına bir göz atalım (daha iyi anlaşılması için satır kesilir, ancak oyunculara gönderilmez):
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
XXXXXX.............
XXXXXX.......AA....
XXXXXX...O.........
XXXXXX...O.........
XXXXXX...O.........
XXXXXX.............
XXXXXX.......AAAAA.
XXXXXX........M....
XXXXXX.............
XXXXXX.............
XXXXXX.............
XXXXXX.............
XXXXXX.............
XXXXXXXXXXXXXXXXXXX
UUUUUUUUUUUUUUUUUUU
UUUUUUUUUUUUUUUUUUU
UUUUUUUUUUUUUUUUUUU
UUUUUUUUUUUUUUUUUUU
UUUUXXXXXXXXXXXUUUU
UUUUXX.........UUUU
UUUUXX.......AAUUUU
UUUUXX...O.....UUUU
UUUUXX...O.....UUUU
UUUUXX...O.....UUUU
UUUUXX.........UUUU
UUUUXX.......AAUUUU
UUUUXX........MUUUU
UUUUXX.........UUUU
UUUUXX.........UUUU
UUUUUUUUUUUUUUUUUUU
UUUUUUUUUUUUUUUUUUU
UUUUUUUUUUUUUUUUUUU
Maden
Mayınlar, bir gemi bir mayın tarafından işgal edilen bir hücreye geçtiğinde veya madende bir atış yapıldığında tetiklenir. Mayınlar "Ram" eylemiyle tetiklenemez.
Madenler, madeni yerleştiren kişiye bile herkese AOE hasarı (1 menzil sıçrama hasarı) verir. Patlama yarıçapında başka bir maden varsa mayınlar "zincir" patlamalarını tetikleyebilir.
rotasyonlar
Dönüşler geminin "başı" üzerinde merkezlenmiş merkezi simetrilerdir. Rotasyonlar bir madeni yalnızca "hedef pozisyona" yerleştirilirse tetikleyecektir (mayın bir yayda tetiklemeyeceksiniz).
Etki alanı
1 menzil sıçrama hasarı (mayınlar ve Taşıyıcı atışları için) ilk atış / patlama (x, y) üzerinde ortalanmış 3x3 (9 hücre) kare ile tanımlanır. Bu koordinatlara çarpıyor:[x - 1; y - 1],[x - 1; y],[x - 1; y + 1],[x; y - 1],[x; y],[x; y + 1],[x + 1; y - 1],[x + 1; y],[x + 1; y + 1]
puanlama
Puanlama bu formülle tanımlanır:
Score = Hits + (Sunken x 5) - Damage taken - (Alive ? 0 : 10)
burada:
hits
Ram, Shot veya Mine patlaması ile düşman gemisine isabet
sunken
sayısı ( zincir patlamaları dahil hasar gören düşman gemisi hücresinden 1 vuruş) : batmasına neden olan bir düşman gemisinde "son isabet"
damage
sayısı: alınan isabet sayısı (Onarım tarafından azaltılmadı, ancak Kalkan tarafından engellendi)
alive
: geminizin sonunda hayatta olup olmadığını kontrol eder (en az 1 gövde hücresi hasarsız)
kontrolör
Denetleyiciyi GitHub'da bulabilirsiniz . Ayrıca Java ile yazılmış iki örnek robot içerir. Çalıştırmak için projeye göz atın ve Java IDE'nizde açın. Oyun sınıfının ana yöntemindeki giriş noktası. Java 8 gerekir.
Bot eklemek için önce Java için derlenmiş sürüme (.class dosyaları) veya yorumlanmış diller için kaynaklara ihtiyacınız vardır. Bunları projenin kök klasörüne yerleştirin. Ardından, oynatıcılar paketinde yeni bir Java sınıfı oluşturun (mevcut botlara örnek alabilirsiniz). Bu sınıf, String getCmd () yöntemini geçersiz kılmak için Player'ı uygulamalıdır. Döndürülen Dize, botlarınızı çalıştırmak için kabuk komutudur. Örneğin, Ruby botunun şu komutla çalışmasını sağlayabilirsiniz: return "C: \ Ruby \ bin \ ruby.exe MyBot.rb" ;. Son olarak, botu Game sınıfının en üstündeki Players dizisine ekleyin.
kurallar
- Botlar, diğer belirli botları yenmek veya desteklemek için yazılmamalıdır.
- Dosyalara yazma izni var. Lütfen "yoursubmissionname.txt" dosyasına yazın, klasör oyun başlamadan önce boşaltılır. Diğer dış kaynaklara izin verilmiyor.
- Gönderinizin yanıt vermesi için 1 saniye var.
- Gönderilerinizi derlemek ve çalıştırmak için komutlar sağlayın.
- Birden fazla başvuru yazabilirsiniz
Desteklenen Diller
Her dili desteklemeye çalışacağım, ancak çevrimiçi olarak ücretsiz olması gerekiyor. "Ana akım" bir dil kullanmıyorsanız lütfen kurulum talimatlarını sağlayın.
Şu an itibariyle, çalıştırabilirim: Java 6-7-8, PHP, Ruby, Perl, Python 2-3, Lua, R, node.js, Haskell, Kotlin, C ++ 11.
[x - 1; y - 1],[x - 1; y],[x - 1; y + 1],[x; y - 1],[x; y],[x; y + 1],[x + 1; y - 1],[x + 1; y],[x + 1; y + 1]