NetHack es un juego roguelike en el que un jugador debe recuperar el Amuleto de Yendor desde el nivel más bajo de la mazmorra. Comúnmente jugado a través de telnet, todo el juego está representado con gráficos ASCII. El juego es extremadamente desafiante y requiere el conocimiento de muchas mecánicas de juego para tener éxito.
Para los propósitos de este desafío, suponga que toda la mazmorra tiene un solo nivel y solo 5 × 16 caracteres. Además, suponga que esta es una mazmorra "segura" o que solo está implementando un prototipo: no habrá monstruos, preocupaciones sobre el hambre, etc. De hecho, solo debe rastrear la ubicación del personaje, el amuleto y el juego. efectivamente terminará cuando el jugador llegue a la misma ubicación que el amuleto.
Requisitos de desafío
- Habrá una mazmorra de 5 × 16 (nivel único).
- Dale al jugador una ubicación inicial (opcionalmente al azar) y el amuleto al azar por separado (diferente cada vez que se ejecute el programa) dentro del calabozo. Es decir, el amuleto no puede comenzar en la misma casilla que el jugador.
- Acepte cuatro teclas de entrada que mueven al jugador un cuadrado a la vez (cuatro direcciones cardinales). Se permite leer / procesar otra entrada (una función readline () que requiere presionar 'enter', etc.).
- No se permite viajar fuera de los límites de la mazmorra. Por ejemplo, si el jugador está en el borde derecho de la mazmorra, presionar a la derecha no debería hacer nada.
- Después de la generación inicial y después de cada movimiento, imprime el estado del juego. Como se trata de un código de golf y la impresión es poco interesante, ignore el recuento de caracteres para la función de impresión y la función de llamada suponiendo que no haya cambios de estado . Las celdas vacías se deben mostrar como punto (
.
), el amuleto como comillas dobles ("
) y el carácter como símbolo (@
). - El juego termina cuando el jugador "descubre" el amuleto (llega a la misma casilla)
Victorioso
Este es un desafío de código de golf, el código más corto para cumplir con los requisitos dentro de una semana a partir de hoy será declarado ganador.
Ejemplo
Aquí hay una solución de ejemplo en C # (sin golf) para mostrar los requisitos básicos y la salida de muestra.
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');
}
}
}
}
El recuento total de caracteres es 1474, pero ignorando las llamadas a la función de impresión y su definición, el recuento final de caracteres es 896
.
Salida cuando se ejecuta el programa:
................
...."...........
..........@.....
................
................
Salida (incluida arriba) después de presionar la tecla 'a' dos veces:
................
...."...........
..........@.....
................
................
................
...."...........
.........@......
................
................
................
...."...........
........@.......
................
................