NetHack é um jogo parecido com um roguel onde o jogador deve recuperar o Amuleto do Yendor do nível mais baixo da masmorra. Geralmente jogado via telnet, o jogo inteiro é representado com gráficos ASCII. O jogo é extremamente desafiador e requer conhecimento de muitas mecânicas do jogo para ter sucesso.
Para os propósitos deste desafio, suponha que o calabouço inteiro seja um nível único e apenas 5 × 16 caracteres. Além disso, suponha que este é um calabouço "seguro" ou que você está implementando apenas um protótipo - não haverá monstros, preocupações com a fome etc. Na verdade, você deve rastrear apenas a localização do personagem, do amuleto e do jogo terminará efetivamente quando o jogador chegar ao mesmo local que o amuleto.
Requisitos do desafio
- Haverá uma masmorra 5 × 16 (nível único).
- Dê ao jogador um local inicial (opcionalmente aleatório) e o amuleto um aleatório separado (diferente a cada vez que o programa for executado) começando dentro da masmorra. Ou seja, o amuleto não pode começar no mesmo quadrado que o jogador.
- Aceite quatro teclas de entrada que movem o leitor um quadrado de cada vez (quatro direções cardinais). A leitura / processamento de outras entradas é permitida (uma função readline () que requer pressionar 'enter', etc).
- Viajar para fora dos limites da masmorra não é permitido. Por exemplo, se o jogador estiver na borda direita da masmorra, pressionando a direita, não deverá fazer nada.
- Após a geração inicial e após cada movimento, imprima o estado do jogo. Como esse é o código golf e a impressão é bastante desinteressante, ignore a contagem de caracteres para a função de impressão e a chamada de função, assumindo que não há alterações de estado . As células vazias devem ser mostradas como ponto (
.
), amuleto como aspas duplas ("
) e caractere como símbolo (@
). - O jogo termina quando o jogador "descobre" o amuleto (chega ao mesmo quadrado)
Ganhando
Este é um desafio de código de golfe, o código mais curto para atender aos requisitos de uma semana a partir de hoje será declarado vencedor.
Exemplo
Aqui está um exemplo de solução em C # (ungolfed) para mostrar os requisitos básicos e a amostra de saída.
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');
}
}
}
}
A contagem total de caracteres é 1474, mas, ignorando as chamadas para a função de impressão e sua definição, a contagem final de caracteres é 896
.
Saída quando o programa é executado:
................
...."...........
..........@.....
................
................
Saída (incluindo acima) depois que a tecla 'a' é pressionada duas vezes:
................
...."...........
..........@.....
................
................
................
...."...........
.........@......
................
................
................
...."...........
........@.......
................
................