Savaş oyununun sonucunu bulun
İlkokuldayken, toplantılarda, öğretmenimizi beklerken, teneffüste vb. Oynadığımız bir "Taş-Kağıt-Makas" oyunu vardı. Buna "Savaş" dedik. Ancak bazı aramalardan sonra, bu "Av Tüfeği Oyunu" nun (WikiHow'a göre) çok daha basit bir çeşidi olduğu ortaya çıkıyor . Kurallar biraz farklı olduğu için buna "Savaş" diyeceğim:
2 kişi birbirinin karşısında oturuyor. Oyunun amacı diğer oyuncuyu "öldürmektir". Her turda 3 hamleden birini oynayabilirsiniz:
Reload : Tek atış tutan bir silahınız var. Her seferinde ateşlenmeden önce yeniden yüklenmesi gerekir. Cephaneniz olduğunda yeniden yükleme yasaldır, ancak hiçbir şey yapmaz. Tapınaklarınıza iki elinizle dokunarak bir yeniden yükleme sembolize edildi. Her oyuncu 0 cephane ile başlar.
Muhafız : Tek güvenli hamle. Eğer korurken vurursanız ölmezsiniz. Koruma kollarınızı göğsünüz üzerinden geçerek sembolize edildi.
Ateş : Silahını ateşle. Başarılı bir şekilde ateş etmek için son atıştan bu yana yeniden yüklemiş olmanız gerekir. Rakibiniz yeniden yükleniyorsa kazanırsınız. Onlar da ateş ederse ve ikinizin de cephaneniz varsa, bu bir beraberlik. Eğer koruyorlarsa, cephaneyi boşa harcadın. Cephane olmadan ateş etmek yasal bir hareketken, hiçbir şey yapmaz ve sizi yeniden yükleme gibi savunmasız bırakır. Ateş diğer oyuncuya işaret edilerek sembolize edildi.
RPS'ye benzer şekilde oynandı, çünkü her oyuncu aynı anda seçimlerini atıyor (birbirimizle ritmi korumak için bacaklarımızı sırayla iki kez dokunduk, ancak bu meydan okuma için önemli değil).
Meydan okuma:
Göreviniz bir Savaş oyununun sonucunu bulmak. Bir işlev veya tam program olabilir.
Giriş
Her oyuncunun her turu seçtiği seçenek bir karakter / dize ile temsil edilir:
r : yeniden yükle
g : bekçi
f : ateş
Girdi, bir çiftler listesi, ayrılmış / sınırlandırılmamış bir dize veya bu satırlar boyunca başka bir şey olacaktır.
Python'a örnek bir giriş olabilir [("r", "g"), ("f", "r")]
, yani ilk turda ilk oyuncu tekrar yüklenir ve ikinci oyuncu korunur. İkinci turda ilk oyuncu ateşlenirken, ikinci oyuncu yeniden yüklenir. Birinci oyuncu bu oyunu kazanır. Aynı giriş isteğe olarak temsil edilebilir "r g f r"
, "rgfr"
, "rg fr"
"rg-fr"
...
Aşağıdakileri varsayabilirsiniz:
Giriş, seçtiğiniz biçimle eşleşecek ve yalnızca geçerli karakterler içerecek.
Birisi 100 turda ölecek.
Ancak biri öldüğünde dönüşlerin sona erdiğini varsayamazsınız.
Çıktı
Kimin kazandığını (veya önce kimin kazandığını *
) gösteren bir değer . Her senaryo için ne çıktı verileceğini seçebilirsiniz, ancak aşağıdakileri dikkate almalısınız:
Oyuncu 1 kazanır
Oyuncu 2 kazanır
Birbirlerini öldürüyorlar (çiziyorlar)
Her sonucun bir bölge değeri olmalı ve her senaryo için her zaman aynı olmalıdır.
Örnek olarak: 1
Oyuncu 1 kazandığında, 2
oyuncu 2 kazandığında ve 0
berabere kaldığında çıktı alabilirsiniz. Oyuncu 1 kazandığında, oyuncu 2 kazandığında ve berabere kaldığında daima çıkış yapmanız gerekir .1
2
0
İade edilebilir veya stdout'a yazdırılabilir. Sondaki boşluk gayet iyi.
Açıktır ki, berabere giden tek senaryo, her iki oyuncunun da ateş ettiği ve her ikisinin de cephanesi olduğu.
*
Bu mücadelede, birileri öldükten sonra dönüşler devam edebileceğinden, 1'den fazla oyuncunun sonunda kazanması mümkündür. Girişe göre ilk kimin kazandığını bulmanız gerekiyor.
Test Durumları ( 1
P1 kazandığında, 2
P2 kazandığında ve 0
berabere varsa):
"rg fr" => 1 (P1 shot P2 while they were reloading)
"rg ff" => 1 (They both shot, but only P1 had ammo)
"rr ff" => 0 (Both had ammo and shot each other)
"rr ff rr fg" => 0 (Both had ammo and shot each other. Everything after the first win is ignored)
"rr fg rf" => 2 (P2 shot P1 while they were reloading)
"rf gg rr fg rr fr" => 1
(P2 tried to shoot but didn't have any ammo, then they both guarded, then they both reloaded, then P2 blocked a shot, then they both reloaded again [but P2 still only has 1 ammo!], then P1 shoots P2 while they're reloading.
"rr gf fr rf gg rg ff" => 1
^ Player 1 wins here. The rest to the right has no effect on the output
Bu kod golf, yani en az bayt sayısı kazanır!
Test durumlarının gösterdiği gibi, "aptal" hareketleri ele almanız gerektiğini unutmayın. Bir oyuncunun cephanesi olmadığında ateş etmeye çalışması veya arka arkaya 2 tur yeniden yüklemesi (ve yalnızca tek bir cephane biriktirmesi) için mükemmel bir şekilde geçerlidir.
{"rff","rgf"}
?