NetHack 은 플레이어가 던전의 가장 낮은 레벨에서 Yendor의 부적을 가져와야하는 불량 게임입니다. 텔넷을 통해 일반적으로 재생되는 전체 게임은 ASCII 그래픽으로 표시됩니다. 이 게임은 매우 도전적이고 성공하기 위해서는 많은 게임 메커니즘에 대한 지식이 필요합니다.
이 도전의 목적을 위해, 전체 던전은 단일 레벨이고 5 x 16 자만 가정합니다. 또한 "안전한"던전이거나 프로토 타입 만 구현한다고 가정 해 봅시다. 괴물, 기아에 대한 우려 등은 없을 것입니다. 실제로 캐릭터와 부적 및 게임의 위치 만 추적해야합니다. 플레이어가 부적과 같은 위치에 도착하면 효과적으로 종료됩니다.
도전 과제
- 5 × 16 던전 (단일 레벨)이 있습니다.
- 플레이어에게 던전 내부의 시작 위치 (선택적 무작위)와 부적에게 별도의 무작위 (프로그램이 실행될 때마다 다름) 시작 광장을 제공하십시오. 즉, 부적은 플레이어와 같은 광장에서 시작할 수 없습니다.
- 플레이어를 한 번에 한 칸씩 이동하는 4 개의 입력 키를 수락하십시오 (4 개의 기본 방향). 다른 입력을 읽거나 처리 할 수 있습니다 ( 'enter'를 눌러야하는 readline () 함수 등).
- 던전 외곽으로 여행하는 것은 허용되지 않습니다. 예를 들어, 플레이어가 던전의 오른쪽 가장자리에 있으면 오른쪽을 누르면 아무 것도하지 않아야합니다.
- 초기 생성 후 및 이동 후 게임 상태를 인쇄하십시오. 이것은 코드 골프이고 인쇄는 다소 흥미롭지 않으므로 상태 변경이 없다고 가정하면 인쇄 함수 및 함수 호출의 문자 수를 무시하십시오 . 빈 셀은 마침표 (
.
), 부적을 큰 따옴표 ("
)로 표시하고 문자를 기호 (@
)로 표시해야합니다. - 플레이어가 부적을 "발견"하면 게임이 끝납니다 (동일한 광장에 도착)
승리
이것은 코드 골프 도전, 오늘부터 일주일의 요구 사항을 충족하는 가장 짧은 코드가 승자로 선언됩니다.
예
다음은 기본 요구 사항 및 샘플 출력을 보여주는 C # (ungolfed)의 예제 솔루션입니다.
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');
}
}
}
}
총 문자 수는 1474이지만 print 함수에 대한 호출을 무시하고 최종 문자 수는 896
입니다.
프로그램이 실행될 때 출력 :
................
...."...........
..........@.....
................
................
'a'키를 두 번 누른 후 출력 (위 포함) :
................
...."...........
..........@.....
................
................
................
...."...........
.........@......
................
................
................
...."...........
........@.......
................
................