Trò chơi phiêu lưu văn bản có một công thức thiết lập khá; có một thế giới bao gồm một loạt các phòng / không gian, người chơi có thể di chuyển xung quanh các phòng này và có một số vật phẩm trong phòng. Người chơi có thể nhặt các vật phẩm, đặt xuống, sử dụng để truy cập các phòng khác (ví dụ: chìa khóa) và kết hợp với các vật phẩm khác để tạo vật phẩm mới.
Thử thách
Thách thức của bạn là viết một thời gian chạy phiêu lưu văn bản trong vài byte (mã golf). Để đơn giản, tất cả những gì bạn cần làm là đưa ra một giá trị trung thực hoặc falsey tùy thuộc vào việc một chuỗi lệnh nhất định có chiến thắng một trò chơi nhất định hay không (không tương tác, không có đầu ra thân thiện với con người, v.v.)
Luật chơi
- Thế giới luôn bao gồm một hành lang với 10 phòng được kết nối. Mỗi phòng yêu cầu một chìa khóa để vào, nhưng có thể thoát ra bất cứ lúc nào mà không cần chìa khóa (vì vậy đó là một loại khóa chốt tôi đoán);
- Người chơi bắt đầu ở phòng 0 và chiến thắng nếu họ vào phòng 9 (một khi họ tới phòng 9, họ có thể làm bất cứ điều gì họ thích, kể cả đi đến phòng khác, và họ vẫn sẽ thắng);
- Mỗi phòng có thể chứa bất kỳ số lượng các mặt hàng;
- Có tới 26 mặt hàng, được đặt tên là AZ và sẽ không có mặt hàng nào xuất hiện nhiều hơn một lần trên thế giới;
- Người chơi có thể lấy vật phẩm từ phòng hiện tại và đặt chúng vào kho của họ (họ cũng có thể thả vật phẩm từ kho của họ vào phòng hiện tại);
- Kích thước kho tối đa của người chơi là hữu hạn và sẽ được cung cấp các chi tiết về cấp độ;
- Khi bắt đầu trò chơi, kho đồ của người chơi luôn trống;
- Không có giới hạn đối với số lượng vật phẩm tối đa trong một phòng (mặc dù giới hạn ngầm sẽ là 26, vì đó là tổng số vật phẩm);
- Vật phẩm AJ là chìa khóa có thể được sử dụng để vào phòng 0-9 (tức là người chơi có thể chuyển sang phòng 0 nếu họ có vật phẩm A, đến phòng 1 nếu có B, v.v. lưu ý rằng không bắt buộc phải rời khỏi phòng, và người chơi bắt đầu ở phòng 0, do đó, phím "A" chỉ được yêu cầu nếu người chơi muốn trở về phòng 0);
- Các vật phẩm trong kho của người chơi có thể được kết hợp để tạo vật phẩm mới (sẽ được tạo trong kho của người chơi) - các kết hợp được phép sẽ được cung cấp với các chi tiết cấp độ;
- Việc kết hợp các vật phẩm sẽ tiêu thụ các vật phẩm ban đầu (nghĩa là nếu một trong các vật phẩm đó là một khóa, thì nó sẽ không còn có thể sử dụng khóa đó nữa);
- Nếu người chơi cố gắng làm điều gì đó không thể (ví dụ: nhặt một vật phẩm không có trong phòng hiện tại / bỏ một vật phẩm họ không có / kết hợp các vật phẩm họ không có / đi đến một phòng họ không có chìa khóa cho), không có gì xảy ra và họ có thể tiếp tục;
- Người chơi sẽ không bao giờ đưa ra một lệnh vô nghĩa (ví dụ: đi đến phòng 11).
Vì vậy, một trò chơi đơn giản có thể trông như thế này:
v
+---+---+---+---+---+---+---+---+---+---+
| C | | J | | | | | | | |
+---+---+---+---+---+---+---+---+---+---+
| CORRIDOR |
+---------------------------------------+
Inventory capacity: 99
Phòng 0 chứa mục "C" (là chìa khóa của phòng 2). Phòng 2 chứa mục "J" (là chìa khóa của phòng 9). Người chơi có thể giành chiến thắng trong trò chơi bằng cách chọn C, di chuyển đến phòng 2, chọn J, sau đó chuyển sang phòng 9.
Một trò chơi phức tạp hơn có thể là:
v
+---+---+---+---+---+---+---+---+---+---+
| C | | X |YZ | | | | | | |
+---+---+---+---+---+---+---+---+---+---+
| CORRIDOR |
+---------------------------------------+
Inventory capacity: 10
C+X => D
Y+Z => J
Bây giờ người chơi có thể giành chiến thắng bằng cách chọn C, chuyển sang phòng 2, chọn X, kết hợp C với X để tạo D, sau đó chuyển sang phòng 3. Bây giờ họ có thể nhặt và kết hợp Y và Z để lấy J, cho phép họ về phòng 9
Định dạng đầu vào
Có một chút đầu vào để xử lý và đó là một nhiệm vụ khá nhàm chán, vì vậy định dạng đầu vào rất linh hoạt. Bạn sẽ nhận được dữ liệu sau đây và cách gửi dữ liệu đến chương trình của bạn phần lớn tùy thuộc vào bạn:
- Nội dung ban đầu của mỗi phòng (danh sách từ 0 món trở lên cho mỗi phòng);
- Một tập hợp các kết hợp mục được phép (mỗi mục chứa 2 mục đầu vào và mục đầu ra của chúng - lưu ý rằng các mục đầu vào không được sắp xếp);
- Kích thước khoảng không quảng cáo tối đa (số nguyên, 0 <= size <= 26);
- Danh sách các lệnh người chơi đã cố gắng.
Các lệnh của người chơi có thể là:
[P]ick up <item>
- nhặt một vật phẩm từ phòng và đặt nó vào kho của người chơi (nếu có không gian)[D]rop <item>
- thả một vật phẩm từ kho đồ của người chơi vào phòng hiện tại[C]ombine <item1> <item2>
- kết hợp 2 vật phẩm trong kho của người chơi để tạo ra vật phẩm mới[G]o to <room>
- đi đến phòng đã chọn nếu người chơi có chìa khóa cần thiết
Ví dụ, định dạng đầu vào tôi sử dụng để kiểm tra là các đối số chương trình đơn giản:
./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)
Nhưng nếu một số định dạng khác làm cho nó dễ dàng hơn, thì tốt thôi (ví dụ: các ký tự phân cách đặc biệt / nhiều dòng / thứ tự khác nhau / được tuần tự hóa thành JSON / v.v.)
Định dạng đầu ra
Chương trình của bạn sẽ trả về một số đầu ra trung thực nếu các lệnh của người chơi khiến họ thắng trò chơi và một số đầu ra falsey khác. Đây có thể là một thông điệp dễ nhận biết đến thiết bị xuất chuẩn, mã trả về chương trình hoặc bất cứ ngôn ngữ nào bạn chọn cung cấp. Tất cả đầu ra khác sẽ bị bỏ qua.
Các trường hợp thử nghiệm
Kịch bản bash sau đây cung cấp một khai thác thử nghiệm sẽ kiểm tra hầu hết các tình huống. Nó đã được viết để sử dụng định dạng được mô tả ở trên, nhưng sửa đổi nó để sử dụng một định dạng khác chỉ là một trường hợp thêm một chuyển đổi trong invoke
hàm.
#!/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;
Chiến thắng
Golf mã tiêu chuẩn: mã ngắn nhất (tính bằng byte) thắng. Bài dự thi phải tuân theo các quy tắc trò chơi, trong thực tế có nghĩa là chúng phải vượt qua tất cả các trường hợp kiểm tra (có thể thêm nhiều bài kiểm tra nếu cần thiết).