Bu zorlukta, petri kabı arenada ölümüne karşı savaşmak için bir tür tek hücreli organizmalar tasarlamanız gerekir. Arena her bir hücrenin bir boşluk kapladığı dikdörtgen bir ızgara olarak temsil edilir:
.....x....
...x...o..
...x.c..o.
.......o..
Öznitellikler
Her hücrenin üç özelliği vardır. Oyunun başında hücre türlerini belirlerken, bu özellikler arasında 12 puan ayırırsınız.
- Vuruş Noktaları (HP): Bir hücrenin HP sıfıra düşerse ölür. Yeni hücrelerde tam HP var.
- Bir hücre öldüğünde, enerji için diğer hücreler tarafından yenebilen bir cesedin ardında kalır.
- Bir hücre kayıp HP'yi geri kazanamaz, ancak bölerek tam HP ile yeni bir hücre oluşturabilir.
- Enerji : Bir hücrenin gerçekleştirebileceği eylemlerin çoğu enerji gerektirir. Aktif olarak dinlenerek bir hücre, türünün maksimum değerine kadar kaybedilen enerjiyi geri kazanabilir.
- 5'ten daha az enerjiye sahip olan bir hücre türünün başarısız olma olasılığı vardır, çünkü yeni hücreler oluşturmak için bölünemezler.
- Bir hücre, türünün maksimum değerinin ötesinde enerjiyi geri kazanamaz.
- Yeni yaratılan bir hücrenin üstünden kopyalanan bir başlangıç enerji değeri vardır (ve tür özellikleri tarafından belirtilen bir maksimum değer).
- Asitlik : Bir hücre patlamayı seçerse, hücrenin asitlik seviyesi komşu hücrelere verilen zararın hesaplanmasında kullanılır.
Eylemler
Her turda, her hücre bir işlem yapabilir:
Taşı: Hücre 1 enerji karşılığında herhangi bir yöne (N / S / E / W / NE / NW / SE / SW) bir boşluk taşır.
- Bir hücre, başka bir canlı hücre tarafından işgal edilen bir alana taşınamaz.
- Bir hücre ızgaradan çıkamaz.
- Hücre cesedi üzerine gitmek cesedi yok eder.
Saldırı: Bir hücre, 1 ila 3 enerji puanı harcayarak 1 ila 3 hasar veren bitişik bir hücreye saldırır.
- Bir hücre herhangi bir yöne saldırabilir (N / S / E / W / NE / NW / SE / SW).
- Dost hücrelere saldırmak yasaldır.
Böl: Hücre, 5 enerji karşılığında, bitişik bir alanda yeni bir hücreyi böler ve oluşturur.
- Bir hücre herhangi bir yöne bölünebilir (N / S / E / W / NE / NW / SE / SW).
- Yeni hücre, orijinal hücre özelliklerine göre tam HP kapasitesine sahip.
- Yeni hücre, bölme maliyetini çıkardıktan sonra ana hücresindeki kadar enerjiye sahiptir. (Örneğin, ilk 8 enerji noktalı bir ana hücre 3 enerjiye indirgenecek ve 3 enerjili bir çocuk hücre üretecektir).
- Yeni bir hücre, bir sonraki dönene kadar hareket edemez.
- Bir hücre, yaşayan bir hücre tarafından işgal edilen bir alana bölünemez, ancak ölü bir hücre cesedi tarafından işgal edilen bir alana bölünebilir (bu, cesedi yok eder).
Yemek: Bir hücre, 4 enerji kazanarak bitişik bir hücre cesedi yer.
- Bir hücre herhangi bir yönde yiyebilir (N / S / E / W / NE / NW / SE / SW).
Dinlenme: Bir hücre bir dönüş için hiçbir şey yapmaz, 2 enerjiyi geri kazanır.
Patlama: Bir hücre HP'den 3 veya daha az HP'ye ve daha fazla enerjiye sahipse, patlamayı seçebilir, sekiz komşu hücreye de hasar verebilir.
- Her bitişik hücrenin hasar görmesi
(exploding cell HP) + (explodng cell acidity)
- Patlamış bir hücre ölür ve patlamada ölen herhangi bir hücrede olduğu gibi bir cesedin arkasında kalır.
- Her bitişik hücrenin hasar görmesi
Protokol
Kurmak
Programınız BEGIN
stdin'de verilen string ile çalışacaktır . Programınız, hücre türünüz için HP, enerji ve asitliği temsil eden, boşluk bırakmayan 3 negatif olmayan tamsayı listesi yazmalıdır: örn 5 6 1
. Rakamlar 12'ye kadar olmalıdır 0
. İsterseniz Asitlik olabilir . (Diğer özellikler de sıfır olabilir, ancak bunu işlevsel olarak yapmak oyunu kaybeder!)
Bir hücreyle, kuzeybatı veya güneydoğu köşesinde, her iki kenardan da bir boşluk uzakta başlar. Başlangıç hücresi tam HP ve enerjiye sahiptir.
Her hücre hareket eder
Her dönüşte, programınız ekibinizde yaşayan her hücre için bir kez çağrılacaktır (bu dönüşü yeni yaratmış olan hücreler hariç) böylece hücrenin hareket edebilmesi için. Programınıza, petri kabı durumunu ve bu hücre hakkında bilgiler içeren stdin verisi verilmiştir:
10 4
..........
..xx.c....
...c...o..
......o...
6 3 5 7
İlk iki sayı arena genişliğini ve yüksekliğini gösterir: burada, 10'a 4 arena var.
o
Hücreler seninkiler;x
Hücreler senin düşmanlarıdır. (Bu her zaman doğrudur; her oyuncu kendi hücrelerini her zaman olduğu gibi görüro
.).
Alanlarda boş.c
Alanlarda yenilebilir hücre cesetleri temsil eder.
Boş satırdan sonraki sayılar bu hücre hakkındaki bilgiyi gösterir:
- İlk iki sayı , üst soldan
x,y
indeksli koordinatlardır0,0
(bu yüzden6 3
burada en güneydekio
hücreye atıfta bulunulur). - Üçüncü sayı, hücrenin HP'sidir; dördüncü sayı hücrenin enerjisidir.
Programınız (stdout'a) bir eylem çıkarmalıdır. Aşağıdaki örneklerde N
örnek bir yön olarak kullanacağız , ancak bu eylem için yasal olan herhangi bir yön olabilir ( N
/ S
/ E
/ W
/ NE
/ NW
/ SE
/ SW
). Tüm program çıktısı büyük / küçük harf duyarlı değildir, ancak örnekler büyük harf kullanacaktır. Geçersiz olan herhangi bir çıktı işlemi (geçersiz sözdizimi olduğundan veya geçersiz bir eylem girişiminde bulunduğundan) yok sayılır ve hücre REST
oluşumuna neden olur (ve böylece 2 enerji kazanır).
MOVE N
DIVIDE N
EAT N
ATTACK N 2
- sayı saldırının gücünü gösterir (1 - 3)REST
EXPLODE
Takımının sırası, tüm hücrelerine tek tek hareket etme şansı vermesinden oluşuyor. Tüm hücreleriniz, rakip hücrelerin herhangi biri harekete geçmeden önce hareket eder. Tüm hücreleriniz harekete geçtiğinde, sıranız biter ve rakibinizin sırası başlar. Tüm rakibinizin hücreleri harekete geçtiğinde, sıranız yeniden başlar. Sıra sizde, her hücreye yaşına göre hareket etme önceliği verilir: ekibinizdeki en eski hücreler ilk önce genç hücrelerden önce hareket eder.
Örnek
İşte bir programın nasıl davranabileceği. Burada stdin'in girişi burada baştaki >
oklarla (gerçek girdiden açıklayıcı bir boşlukla ayrılmış) gösterilir ve stdout'taki çıktıların <
okları vardır.
> BEGIN
< 5 6 1
Ardından, program tekrar çağrılır:
> 10 4
> ..........
> .o........
> ........x.
> ..........
>
> 1 1 5 6
< DIVIDE SE
Rakibinizin sırasından sonra (kim DIVIDE W
tek bir başlangıç hücresine karar verdi ), programınız iki kez, her hücre için bir kez çağrılır:
> 10 4
> ..........
> .o........
> ..o....xx.
> ..........
>
> 1 1 5 1
< MOVE E
Sıradaki ikinci çağrı için:
> 10 4
> ..........
> ..o.......
> ..o....xx.
> ..........
>
> 2 2 5 1
< MOVE SE
Bu ikinci hücrenin, sıradaki diğer hücrenin hareketine bağlı olarak güncellenmiş tahta durumunu gördüğünü unutmayın. Ayrıca, bu hücrenin 1 enerji ile yaratıldığına dikkat edin, çünkü ana hücrenin son dönüşü gerçekleştirdiğinde 6 enerjisi vardı (bu nedenle orijinal 6, eksi 5 enerjinin bölünmesinin 5-enerji maliyeti, 1 enerjili bir çocuk hücresi yarattı).
Şimdi sıranız bitti ve rakibinizin sırası başlıyor. İki karşıt hücreye hareket etme şansı verilecek ve sonra bir sonraki dönüşünüz başlayacak.
Zafer
İkisinden birini de kazanabilirsiniz:
- Tüm rakip hücreleri yok etmek veya
- Her oyuncu 150 tur tamamladıktan sonra rakibinizden daha fazla hücre olması
Puanlama, birbirlerine karşı 100 oyunda kazanma sayısına göre yapılacaktır. Simülasyonların yarısında, ilk önce programınıza izin verilir.
Beraberlik oyunları (yani 150 turdan sonra tam olarak aynı sayıda hücre veya bir patlamada geriye kalan tek hücreler bir arada öldürülür), her iki oyuncunun toplam kazancında sayılmaz.
Diğer bilgiler
- Programınız devleti korumaya çalışmamalı (Petri kabının durumunu kullanmanın ötesinde): monoküler hücrelerin çok iyi bir hafızası yoktur ve dünyaya anında tepki veriyorlar. Özellikle, bir dosyaya (veya başka bir veri deposuna) yazma, uzak bir sunucuyla iletişim kurma veya ortam değişkenlerini ayarlama açıkça reddedilir.
- Gönderiler 12.04.4 Ubuntu'da çalıştırılacak / derlenecektir.
- 100 puanlama oyununun özellikleri henüz doğrulanmadı, ancak büyük olasılıkla birden fazla arena büyüklüğü içerecekler (örneğin, küçük bir arenada 50 koşu ve daha büyük bir arenada 50 koşu). Daha büyük bir arenada, uygun bir savaşın gerçekleşmesini sağlamak için maksimum dönüş sayısını artırabilirim.
kaynaklar
İşte Node.js için yazılan simülasyonu çalıştıran sürücü kodunode petri.js 'first program' 'second program'
. Örneğin, Python tarafından yazılmış bir hücreyi Java ile yazılmış bir hücreye karşı oymak gibi görünebilir node petri.js 'python some_cell.py' 'java SomeCellClass'
.
Ek olarak, stdin üzerinde birden fazla satır okumak ve ayrıştırmanın çok büyük bir acı olabileceğini anlıyorum, bu yüzden üzerine inşa etmekte, tamamen elden geçirmekte veya tamamen görmezden gelmekte olduğunuz farklı dillerde birkaç tam örnek hücre hazırladım.
- Java hücresi
- Python hücresi
- JavaScript hücresi (Node.js ile kullanım için)
Elbette farklı bir dilde hücre yazmakta özgürsünüz; Bunlar sadece zaman kazandıran bir yardımcı olarak kazan kodunu yazmaya karar verdiğim üç dil.
Sürücüyü çalıştırırken herhangi bir sorun yaşarsanız, bu meydan okuma için oluşturduğum sohbet odasında beni ping etmekten çekinmeyin . Sohbet için yeterli itibarınız yoksa, sadece bir yorum bırakın.
'node c:/cell/cell_template.js'
'java CellTemplate'
Java kodu için belirtmeniz gereken her bağımsız değişken belirtmeniz gerekir . Bunu meydan okuma metninde daha açık hale getireceğim. Hala sorun yaşıyorsanız, biz (ve teknik sorunları olan başka biri) bu tartışmaya yeni yaptığım bir sohbet odasında devam edebiliriz .