텍스트 어드벤처 게임은 꽤 정해진 공식을 가지고 있습니다. 일련의 방 / 공간으로 구성된 세계가 있으며 플레이어는이 방을 이동할 수 있으며 방에 몇 가지 항목이 있습니다. 아이템은 플레이어가 집어 들고 내려 놓고 다른 방 (예 : 열쇠)에 접근하는 데 사용되며 다른 아이템과 결합하여 새로운 아이템을 만들 수 있습니다.
도전
가장 작은 바이트 (코드 골프)로 텍스트 어드벤처 런타임을 작성해야합니다. 일을 단순하게 유지하려면 주어진 일련의 명령이 주어진 게임에서 이길 지 여부에 따라 진실 또는 거짓 값을 출력하기 만하면됩니다 (인터랙티브, 인간 친화적 인 출력 등).
게임 규칙
- 세계는 항상 10 개의 연결된 방이있는 복도로 구성되어 있습니다. 각 방에는 열쇠가 필요하지만 열쇠가 없으면 언제든지 나올 수 있습니다 (따라서 일종의 래치 잠금 장치입니다).
- 플레이어는 0 실에서 시작하여 9 실에 들어 서면 승리합니다 (9 실에 도달하면 다른 실로 이동을 포함하여 원하는대로 할 수 있으며 여전히 이겼습니다).
- 각 방에는 여러 항목이 포함될 수 있습니다.
- AZ라는 항목은 최대 26 개이며 세계에서 두 번 이상 표시되지 않습니다.
- 플레이어는 현재 방에서 아이템을 집어 인벤토리에 넣을 수 있습니다 (아이템을 인벤토리에서 현재 방으로 떨어 뜨릴 수도 있습니다).
- 플레이어의 최대 인벤토리 크기는 유한하며 레벨 세부 정보가 제공됩니다.
- 게임이 시작될 때 플레이어의 인벤토리는 항상 비어 있습니다.
- 객실의 최대 항목 수에는 제한이 없습니다 (암시 적 제한은 총 항목 수이므로 26 임).
- 항목 AJ가하는 데 사용할 수있는 열쇠 입력 방 0으로 이동할 수 있습니다 방 0-9 (즉, 플레이어가있는 경우 항목 A, 방 1가 B가있는 경우, 키가 있는지 등을 참고 하지 방을 떠날 필요 플레이어는 0 실에서 시작하므로 "A"키는 플레이어가 0 실로 돌아 가려는 경우에만 필요합니다 .
- 플레이어의 인벤토리에있는 아이템을 결합하여 새로운 아이템을 만들 수 있습니다 (플레이어의 인벤토리에 생성 될 것입니다). 허용 된 조합에는 레벨 세부 정보가 제공됩니다.
- 아이템을 결합하면 원래 아이템이 소비됩니다 (즉, 아이템 중 하나가 키인 경우 더 이상 해당 키를 사용할 수 없음).
- 플레이어가 불가능한 일을하려고하면 (예 : 현재 방에없는 아이템을 집어 들거나 아이템을 떨어 뜨림) 가지고 있지 않은 아이템을 모으거나 조합하지 않은 경우 / 열쇠가없는 룸으로 이동 왜냐하면) 아무 일도 일어나지 않고 계속할 수있다.
- 플레이어는 말도 안되는 명령을 내리지 않습니다 (예 : 11 번 방으로 가십시오).
간단한 게임은 다음과 같습니다.
v
+---+---+---+---+---+---+---+---+---+---+
| C | | J | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+
| CORRIDOR |
+---------------------------------------+
Inventory capacity: 99
방 0에는 품목 "C"(방 2의 열쇠)가 들어 있습니다. 방 2에는 항목 "J"(방 9의 열쇠)가 들어 있습니다. 플레이어는 C를 집어 들고 2 번 방으로 이동 한 다음 J를 집어 든 다음 9 번 방으로 이동하여 게임에서 이길 수 있습니다.
더 복잡한 게임은 다음과 같습니다.
v
+---+---+---+---+---+---+---+---+---+---+
| C | | X |YZ | | | | | | |
+---+---+---+---+---+---+---+---+---+---+
| CORRIDOR |
+---------------------------------------+
Inventory capacity: 10
C+X => D
Y+Z => J
이제 플레이어는 C를 집어 들고 2 실로 이동하고 X를 집어 들고 C와 X를 결합하여 D를 만든 다음 3 번 방으로 이동하여 승리 할 수 있습니다. 이제 Y와 Z를 집어 결합하여 J를 얻을 수 있습니다. 9 번 방으로 가십시오
입력 형식
처리해야 할 입력이 상당히 많으며 지루한 작업이므로 입력 형식이 매우 유연합니다. 다음과 같은 데이터를 얻을 수 있으며 프로그램으로 전송하는 방법은 전적으로 귀하에게 달려 있습니다.
- 각 방의 초기 내용 (각 방에 0 개 이상의 항목 목록)
- 허용되는 항목 조합 모음 (각각 2 개의 입력 항목과 해당 출력 항목 포함-입력 항목이 정렬되지 않음에 유의하십시오);
- 최대 재고 크기 (정수, 0 <= 크기 <= 26);
- 플레이어가 시도한 명령 목록.
플레이어의 명령은 다음과 같습니다.
[P]ick up <item>
-방에서 아이템을 집어 플레이어의 인벤토리에 넣습니다 (공간이있는 경우)[D]rop <item>
-플레이어의 인벤토리에서 현재 방으로 아이템을 떨어 뜨립니다.[C]ombine <item1> <item2>
-플레이어의 인벤토리에 2 개의 아이템을 결합하여 새로운 아이템을 생성[G]o to <room>
-플레이어에 필요한 키가 있으면 선택한 방으로 이동합니다
예를 들어 테스트에 사용한 입력 형식은 간단한 프로그램 인수였습니다.
./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)
그러나 다른 형식으로 쉽게 만들 수 있다면 괜찮습니다 (예 : 특수 구분 문자 / 여러 줄 / 다른 순서 / JSON으로 직렬화 등).
출력 형식
플레이어의 명령으로 인해 게임에서 이기면 프로그램은 진실한 결과를 반환하고 그렇지 않으면 거짓 출력을 반환해야합니다. 이는 stdout에 대한 인식 가능한 메시지, 프로그램 리턴 코드 또는 선택한 언어가 제공하는 모든 것이 될 수 있습니다. 다른 모든 출력은 무시됩니다.
테스트 사례
다음 bash 스크립트는 대부분의 상황을 검사 할 테스트 장치를 제공합니다. 위에서 설명한 형식을 사용하도록 작성되었지만 다른 형식을 사용하도록 수정하면 invoke
함수에 변환을 추가하는 경우 일뿐 입니다.
#!/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;
승리
표준 코드 골프 : 가장 짧은 코드 (바이트)가 이깁니다. 출품작은 게임 규칙을 따라야합니다. 실제로 모든 테스트 사례를 통과해야합니다 (필요한 경우 추가 테스트가 추가 될 수 있음).