Metin macera oyunları oldukça güzel bir formüle sahiptir; bir dizi oda / alandan oluşan bir dünya var, oyuncu bu odaların etrafında hareket edebilir ve odalarda bazı eşyalar vardır. Öğeler oyuncu tarafından alınabilir, bırakılabilir, diğer odalara (örn. Tuşlar) erişmek için kullanılabilir ve yeni öğeler yapmak için diğer öğelerle birleştirilebilir.
Meydan okuma
Zorluk en az bayt (kod golf) bir metin macera çalışma zamanı yazmaktır. İşleri basit tutmak için, yapmanız gereken tek şey, verilen bir komut dizisinin belirli bir oyunu kazanıp kazanmayacağına (etkileşim yok, insan dostu çıktı yok, vb.) Bağlı olarak doğruluk veya falsey değeri çıkarmaktır.
Oyun kuralları
- Dünya her zaman 10 bağlantılı odaya sahip bir koridordan oluşur. Her oda girmek için bir anahtar gerektirir, ancak herhangi bir zamanda bir anahtar olmadan çıkılabilir (sanırım bu bir tür mandal kilidi);
- Oyuncu oda 0'da başlar ve oda 9'a girerse kazanır (oda 9'a ulaştıklarında, başka bir odaya gitmek de dahil olmak üzere istediklerini yapabilirler ve yine de kazanmış olacaklar);
- Her odada çok sayıda öğe bulunabilir;
- AZ adında en fazla 26 öğe vardır ve hiçbir öğe dünyada birden fazla görünmez;
- Oyuncu mevcut odadan öğeleri alabilir ve envanterine yerleştirebilir (ayrıca stoklarından öğeleri mevcut odaya bırakabilir);
- Oyuncunun maksimum envanter boyutu sonludur ve seviye detayları verilecektir;
- Oyunun başında oyuncunun envanteri daima boştur;
- Bir odadaki maksimum öğe sayısı için bir sınır yoktur (örtük sınır 26 olacaktır, çünkü bu toplam öğe sayısıdır);
- Öğeler AJ için kullanılabilen anahtarları girmek odasına 0 taşıyabilirsiniz odalar 0-9 (yani oyuncu onlar varsa öğesi A, odaya 1'e onlar B varsa, anahtarlar olduğunu vs. notu değil bir odayı terk gerekli ve oyuncu oda 0'da başlar, bu nedenle "A" tuşu sadece oyuncu oda 0'a dönmek istiyorsa gereklidir );
- Oyuncunun envanterindeki öğeler yeni öğeler oluşturmak için birleştirilebilir (oyuncunun envanterinde oluşturulacaktır) - izin verilen kombinasyonlar seviye detayları ile sağlanacaktır;
- Öğeleri birleştirmek orijinal öğeleri tüketir (örneğin, öğelerden biri anahtarsa, bu anahtarı kullanmak artık mümkün olmayacaktır);
- Oyuncu imkansız bir şey yapmaya çalışırsa (örneğin mevcut odada olmayan bir eşyayı al / sahip olmadıkları bir eşyayı düşür / sahip olmadıkları eşyaları birleştir / anahtarları olmayan bir odaya git çünkü), hiçbir şey olmaz ve devam edebilirler;
- Müzikçalar hiçbir zaman saçma bir komut vermeyecektir (örneğin, oda 11'e gidin).
Yani basit bir oyun şöyle görünebilir:
v
+---+---+---+---+---+---+---+---+---+---+
| C | | J | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+
| CORRIDOR |
+---------------------------------------+
Inventory capacity: 99
Oda 0, "C" öğesini (oda 2'nin anahtarıdır) içerir. Oda 2, "oda" nın anahtarı olan "J" öğesini içerir. Oyuncu oyunu C'yi alarak, oda 2'ye, J'yi alarak ve ardından oda 9'a giderek kazanabilir.
Daha karmaşık bir oyun şunlar olabilir:
v
+---+---+---+---+---+---+---+---+---+---+
| C | | X |YZ | | | | | | |
+---+---+---+---+---+---+---+---+---+---+
| CORRIDOR |
+---------------------------------------+
Inventory capacity: 10
C+X => D
Y+Z => J
Artık oyuncu C'yi toplayarak, oda 2'ye geçerek, X'i toplayarak, D'yi oluşturmak için C ile X'i birleştirerek, sonra oda 3'e geçerek kazanabilir. odaya git 9.
Giriş Formatı
İşlenmesi gereken oldukça küçük bir girdi var ve bu oldukça sıkıcı bir görev, bu nedenle giriş formatı çok esnektir. Aşağıdaki verileri alacaksınız ve programınıza nasıl gönderilmesi büyük ölçüde size kalmış:
- Her odanın başlangıç içeriği (her oda için 0 veya daha fazla öğenin listesi);
- İzin verilen öğe kombinasyonları koleksiyonu (her biri 2 giriş öğesi ve bunların çıkış öğesi içerir - giriş öğelerinin sırasız olduğunu unutmayın);
- Maksimum envanter boyutu (tamsayı, 0 <= boyut <= 26);
- Oynatıcının denediği komutların listesi.
Oyuncunun komutları şunlar olabilir:
[P]ick up <item>
- odadan bir eşya alır ve oyuncunun envanterine koyar (boşluk varsa)[D]rop <item>
- oyuncunun envanterinden bir eşyayı mevcut odaya bırakır[C]ombine <item1> <item2>
- yeni bir öğe üretmek için oyuncunun envanterindeki 2 öğeyi birleştirir[G]o to <room>
- oynatıcıda gerekli anahtar varsa seçilen odaya gider
Örneğin, test için kullandığım girdi biçimi basit program bağımsız değişkenleridir:
./adventure YZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PY PZ CYZ G9
# r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 combinations inv. size commands...
# means:
# room 0 starts with items Y & Z, all other rooms start empty
# 1 combination is possible: Y+Z => J
# max inventory size is 2
# player commands are [P]ick up Y, [P]ick up Z, [C]ombine Y and Z, [G]o to room 9
# (in this example, the player wins)
Ancak başka bir biçim daha kolay hale getirirse, bu iyi (örneğin, özel sınırlayıcı karakterler / birden çok satır / farklı sıralama / JSON / vb.
Çıkış formatı
Oyuncunun komutları oyunu kazanmalarına neden oluyorsa, programınız bazı doğru çıktılar ve aksi takdirde bazı falsey çıktıları döndürmelidir. Bu, stdout'a tanınan bir mesaj, bir program dönüş kodu veya seçtiğiniz dil ne olursa olsun olabilir. Diğer tüm çıktılar yok sayılır.
Test Durumları
Aşağıdaki bash betiği, çoğu durumu denetleyen bir test bandı sağlar. Yukarıda açıklanan formatı kullanmak için yazılmıştır, ancak farklı bir format kullanmak için değiştirmek sadece invoke
fonksiyona bir dönüşüm ekleme örneğidir .
#!/bin/sh
PROG="$1";
if [[ -z "$PROG" ]]; then
echo "Usage: $0 <program-to-test>";
exit 1;
fi;
function invoke {
"$PROG" "$@"
}
RED="\033[1;31m";
GREEN="\033[1;32m";
RESET="\033[m";
FAILURES="0";
function pass {
if ! invoke "$@" >/dev/null 2>&1; then
echo "${RED}Expected pass, got fail:${RESET} $*" >&2;
(( FAILURES = "$FAILURES" + 1 ));
invoke "$@" 2>&1;
fi;
}
function fail {
if invoke "$@" >/dev/null 2>&1; then
echo "${RED}Expected fail, got pass:${RESET} $*" >&2;
(( FAILURES = "$FAILURES" + 1 ));
invoke "$@" 2>&1;
fi;
}
echo "Running tests...";
# R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 C I Cmd...
pass J '' '' '' '' '' '' '' '' '' 0 9 PJ G9;
fail '' J '' '' '' '' '' '' '' '' 0 9 PJ G9;
pass J '' '' '' '' '' '' '' '' '' 0 9 PJ PJ G9;
fail J '' '' '' '' '' '' '' '' '' 0 9 PJ;
fail J '' '' '' '' '' '' '' '' '' 0 9 G9;
pass J '' '' '' '' '' '' '' '' '' 0 9 G9 PJ G9;
pass J '' '' '' '' '' '' '' '' '' 0 1 PJ G9;
fail J '' '' '' '' '' '' '' '' '' 0 0 PJ G9;
fail J '' '' '' '' '' '' '' '' '' 0 9 PJ DJ G9;
fail J '' '' '' '' '' '' '' '' '' 0 9 PJ PJ DJ G9;
pass J '' '' '' '' '' '' '' '' '' 0 9 PJ DJ PJ G9;
pass J '' '' '' '' '' '' '' '' '' 0 9 PJ DJ PJ G9;
pass B CJ '' '' '' '' '' '' '' '' 0 2 PB G1 DB PC PJ G9;
fail B CJ '' '' '' '' '' '' '' '' 0 2 PB G1 DB PB PC PJ G9;
pass AJ '' '' '' '' '' '' '' '' '' 0 2 PA PJ G9;
pass B D '' J '' '' '' '' '' '' 0 2 PB G1 PD G3 DB PJ G9;
fail B D '' J '' '' '' '' '' '' 0 2 PB G1 PD G2 DB PJ G9;
fail B D '' J '' '' '' '' '' '' 0 2 PB G1 PD G3 PJ G9;
fail B D J C '' '' '' '' '' '' 0 2 PB G1 PD G3 PJ G9;
pass AJ '' '' '' '' '' '' '' '' '' 0 2 PA PJ G9 G0;
fail ADJ '' '' '' '' '' '' '' '' '' 0 3 PA PD PJ G3 DJ G0 PJ G9;
pass ADJ '' '' '' '' '' '' '' '' '' 0 3 PA PD PJ G3 DJ G0 G3 PJ G9;
fail ADJ '' '' '' '' '' '' '' '' '' 0 3 PA PD PJ G3 DJ G0 DD G3 PJ G9;
pass ADJ '' '' '' '' '' '' '' '' '' 0 3 PA PD PJ DD G3 DJ G0 DD G3 PJ G9;
fail ADJ '' '' '' '' '' '' '' '' '' 0 1 PA DA DA PD PJ G9;
pass ADJ '' '' '' '' '' '' '' '' '' 0 1 PA DA DA PJ G9;
fail ABCDEFGHIKLMNOPQRSTUVWXYZ J '' '' '' '' '' '' '' '' 0 26 PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PT PU PV PW PX PY PZ G9;
pass ABCDEFGHIJKLMNOPQRSTUVWXYZ '' '' '' '' '' '' '' '' '' 0 26 PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PO PP PQ PR PS PT PU PV PW PX PY PZ G9;
fail YZJ '' '' '' '' '' '' '' '' '' 0 2 PY PZ CYZ PJ G9;
pass YZJ '' '' '' '' '' '' '' '' '' 1 YZW 2 PY PZ CYZ PJ G9;
pass YZJ '' '' '' '' '' '' '' '' '' 1 YZW 2 PY PZ CYZ PJ CWJ G9;
fail XYZJ '' '' '' '' '' '' '' '' '' 1 YZW 2 PY PZ CYZ PX PJ G9;
fail XYZJ '' '' '' '' '' '' '' '' '' 1 YZW 2 PY PZ CYZ PX DY DZ PJ G9;
pass XYZJ '' '' '' '' '' '' '' '' '' 1 YZW 2 PY PZ CYZ PX DW PJ G9;
pass YZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PY PZ CYZ G9;
fail YZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 CYZ G9;
pass YZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PY PZ CYZ CYZ G9;
fail YZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PY PZ CYZ DJ CYZ G9;
fail YZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PY PZ CYZ DJ PY PZ CYZ G9;
fail WZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PW PZ CYZ G9;
fail WZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PY PZ CYZ G9;
pass YZ '' '' '' '' '' '' '' '' '' 1 YZJ 2 PY PZ CZY G9;
pass YZ '' '' '' '' '' '' '' '' '' 1 ZYJ 2 PY PZ CYZ G9;
fail YZ '' '' '' '' '' '' '' '' '' 1 YZJ 1 PY PZ CYZ G9;
fail YZ '' '' '' '' '' '' '' '' '' 1 YZJ 1 PY PZ CYZ PY PZ CYZ G9;
fail YZ '' '' '' '' '' '' '' '' '' 1 YZJ 1 PY PZ CYZ PJ G9;
fail YZ '' '' '' '' '' '' '' '' '' 1 YZJ 1 PJ G9;
pass BW UV '' '' '' '' '' '' '' '' 3 BUR WVS RSJ 2 PB PW G1 DW PU CBU DR PW PV CVW PR CRS G9;
fail BW AUV '' '' '' '' '' '' '' '' 3 BUR WVS RSJ 2 PB G1 PU CBU DR PA PB G0 DA PW G1 PV CVW PR CRS G9;
pass BCW AUV '' '' '' '' '' '' '' '' 3 CUR WVS RSJ 2 PB PC G1 DB PU CCU DR PC PA PB G0 DA PW G1 DB PV CVW PR CRS G9;
fail BCW UV '' '' '' '' '' '' '' '' 3 CUR WVS RSJ 2 PB PC G1 DB PU CCU DR PC PA PB G0 DA PW G1 DB PV CVW PR CRS G9;
fail BCW AUV '' '' '' '' '' '' '' '' 3 CUR WVS RSJ 2 PB PC G1 DB PU CCU PA PB G0 DA PW G1 DB PV CVW PR CRS G9;
fail BCW AUV '' '' '' '' '' '' '' '' 3 CUR WVS RSJ 2 PB PC G1 DB PU CCU DR PA G0 DA PW G1 DB PV CVW PR CRS G9;
fail BCW AUV '' '' '' '' '' '' '' '' 3 CUR WVS RSJ 2 PB PC G1 DB PU CCU DR PB G0 DA PW G1 DB PV CVW PR CRS G9;
fail BCW AUV '' '' '' '' '' '' '' '' 3 CUR WVS RSJ 2 PB PC G1 DB PU CCU DR PA PB G0 DA G1 DB PV CVW PR CRS G9;
fail BCW AUV '' '' '' '' '' '' '' '' 3 CUR WVS RSJ 2 PB PC G1 DB PU CCU DR PA PB G0 DA PW G1 DB CVW PR CRS G9;
pass BFK LG M N O CDE PQR U W '' 10 BPT CQS TSH HUI IWV VFA GRX MXZ ANY YZJ 5 \
PB PF PK G1 PL PG G6 DB DK DL G5 PC PD PE G6 DF G2 PM G6 DM DC G3 PN G4 PO G6 DN DO DD DE \
PB PP CBP PC PQ CCQ CTS G7 PU CUH G8 PW CWI G6 PF CVF PR PM PN CGR CMX CAN CYZ G9
fail BFK LG M N O CDE PQR U W '' 10 BPT CQS TSH HUI IWV VFA GRX MXZ ANY YZJ 5 \
PB PF PK G1 PL PG G6 DB DK DL G5 PC PD PE G6 DF G6 DM DC G3 PN G4 PO PM G6 DN DO DD DE \
PB PP CBP PC PQ CCQ CTS G7 PU CUH G8 PW CWI G6 PF CVF PR PM PN CGR CMX CAN CYZ G9
if (( "$FAILURES" == "0" )); then
echo "${GREEN}All tests passed${RESET}";
else
echo "${RED}Total failures: $FAILURES${RESET}";
fi;
Kazanan
Standart kod golf: en kısa kod (bayt cinsinden) kazanır. Girişler oyun kurallarına uymalıdır, bu da pratikte tüm test senaryolarını geçmeleri gerektiği anlamına gelir (gerekirse daha fazla test eklenebilir).