NetHack là một trò chơi roguelike, trong đó người chơi phải lấy Amulet of Yendor từ cấp thấp nhất của ngục tối. Thường được chơi qua telnet, toàn bộ trò chơi được thể hiện bằng đồ họa ASCII. Trò chơi là vô cùng thách thức và đòi hỏi kiến thức của nhiều cơ chế trò chơi để thành công.
Đối với mục đích của thử thách này, giả sử rằng toàn bộ ngục tối là một cấp độ duy nhất và chỉ có 5 × 16 ký tự. Hơn nữa, giả sử rằng đây là một hầm ngục "an toàn" hoặc bạn chỉ đang thực hiện một nguyên mẫu, sẽ không có quái vật, mối quan tâm về đói, v.v. Trên thực tế, bạn chỉ phải theo dõi vị trí của nhân vật và bùa hộ mệnh và trò chơi sẽ kết thúc hiệu quả khi người chơi đến cùng địa điểm với bùa hộ mệnh.
Yêu cầu thử thách
- Sẽ có một hầm ngục 5 × 16 (cấp đơn).
- Cung cấp cho người chơi một vị trí bắt đầu (tùy chọn ngẫu nhiên) và bùa hộ mệnh ngẫu nhiên riêng biệt (khác nhau mỗi khi chương trình được chạy) bắt đầu hình vuông bên trong ngục tối. Đó là, bùa hộ mệnh không được phép bắt đầu trên cùng một hình vuông với người chơi.
- Chấp nhận bốn phím nhập di chuyển người chơi một ô vuông cùng một lúc (bốn hướng chính). Đọc / xử lý đầu vào khác được cho phép (một hàm readline () yêu cầu nhấn 'enter', v.v.).
- Đi du lịch ngoài giới hạn của ngục tối không được phép. Ví dụ, nếu người chơi ở rìa bên phải của ngục tối, nhấn phải không làm gì cả.
- Sau thế hệ ban đầu và sau mỗi chuyển động, in trạng thái của trò chơi. Vì đây là mã golf và in ấn không thú vị, bỏ qua số ký tự cho chức năng in và chức năng gọi giả sử không có thay đổi trạng thái . Các ô trống phải được hiển thị dưới dạng period (
.
), bùa hộ mệnh dưới dạng trích dẫn kép ("
) và ký tự như tại ký hiệu (@
). - Trò chơi kết thúc khi người chơi "phát hiện" bùa hộ mệnh (đến cùng một hình vuông)
Chiến thắng
Đây là một mã golf, mã ngắn nhất để đáp ứng các yêu cầu một tuần kể từ hôm nay sẽ được tuyên bố là người chiến thắng.
Thí dụ
Dưới đây là một giải pháp ví dụ trong C # (chưa được chỉnh sửa) để hiển thị các yêu cầu cơ bản và đầu ra mẫu.
using System;
namespace nh
{
class Program
{
static Random random = new Random();
// player x/y, amulet x/y
static int px, py, ax, ay;
static void Main(string[] args)
{
px = random.Next(0, 16);
py = random.Next(0, 5);
// amulet starts on a position different from the player
do { ax = random.Next(0, 16); } while (px == ax);
do { ay = random.Next(0, 5); } while (py == ay);
print();
do
{
// reads a single keypress (no need to press enter)
// result is cast to int to compare with character literals
var m = (int)Console.ReadKey(true).Key;
// Move the player. Here standard WASD keys are used.
// Boundary checks for edge of dungeon as well.
if (m == 'W')
py = (py > 0) ? py - 1 : py;
if (m == 'S')
py = (py < 5) ? py + 1 : py;
if (m == 'A')
px = (px > 0) ? px - 1 : px;
if (m == 'D')
px = (px < 16) ? px + 1 : px;
// print state after each keypress. If the player doesn't
// move this is redundant but oh well.
print();
// game ends when player is on same square as amulet
} while (px != ax || py != ay);
}
static void print()
{
Console.Write('\n');
for (int y=0; y<5; y++)
{
for (int x = 0; x < 16; x++)
{
if (x == px && y == py)
Console.Write('@');
else if (x == ax && y == ay)
Console.Write('"');
else
Console.Write('.');
}
Console.Write('\n');
}
}
}
}
Tổng số ký tự là 1474, nhưng bỏ qua các lệnh gọi đến chức năng in và định nghĩa của nó là số ký tự cuối cùng là 896
.
Đầu ra khi chương trình được chạy:
................
...."...........
..........@.....
................
................
Đầu ra (bao gồm cả ở trên) sau khi nhấn phím 'a' hai lần:
................
...."...........
..........@.....
................
................
................
...."...........
.........@......
................
................
................
...."...........
........@.......
................
................