NetHack è un gioco roguelike in cui un giocatore deve recuperare l'Amuleto di Yendor dal livello più basso del sotterraneo. Comunemente giocato via telnet, l'intero gioco è rappresentato con grafica ASCII. Il gioco è estremamente impegnativo e richiede la conoscenza di molte meccaniche di gioco per avere successo.
Ai fini di questa sfida, supponi che l'intero dungeon sia un singolo livello e solo 5 × 16 personaggi. Inoltre, supponi che si tratti di un dungeon "sicuro" o che stai implementando solo un prototipo: non ci saranno mostri, preoccupazioni per la fame, ecc. In effetti, devi solo tenere traccia della posizione del personaggio, dell'amuleto e del gioco termina effettivamente quando il giocatore arriva nella stessa posizione dell'amuleto.
Requisiti della sfida
- Ci sarà un dungeon 5 × 16 (livello singolo).
- Dai al giocatore una posizione di partenza (facoltativamente casuale) e l'amuleto una casistica separata (diversa ogni volta che il programma viene eseguito) all'interno della prigione. Cioè, l'amuleto non può iniziare nella stessa casella del giocatore.
- Accetta quattro tasti di input che muovono il giocatore di un quadrato alla volta (quattro direzioni cardinali). È consentita la lettura / elaborazione di altri input (una funzione readline () che richiede la pressione di 'enter', ecc.).
- Viaggiare fuori dai confini della prigione non è permesso. Ad esempio, se il giocatore si trova sul bordo destro del sotterraneo premendo a destra non dovrebbe fare nulla.
- Dopo la generazione iniziale e dopo ogni movimento, stampa lo stato del gioco. Poiché si tratta di code golf e la stampa non è abbastanza interessante, ignorare il conteggio dei caratteri per la funzione di stampa e la chiamata di funzione presupponendo che non vi siano cambiamenti di stato . Le celle vuote dovrebbero essere mostrate come punto (
.), amuleto come virgoletta doppia (") e carattere come simbolo (@). - Il gioco termina quando il giocatore "scopre" l'amuleto (arriva nella stessa casella)
vincente
Questa è una sfida di golf del codice, il codice più breve per soddisfare i requisiti tra una settimana da oggi sarà dichiarato vincitore.
Esempio
Ecco una soluzione di esempio in C # (non salvato) per mostrare i requisiti di base e l'output di esempio.
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');
}
}
}
}
Il conteggio totale dei caratteri è 1474, ma ignorando le chiamate alla funzione di stampa e la sua definizione è il conteggio dei caratteri finali 896.
Uscita durante l'esecuzione del programma:
................
...."...........
..........@.....
................
................
Uscita (incluso sopra) dopo aver premuto due volte il tasto 'a':
................
...."...........
..........@.....
................
................
................
...."...........
.........@......
................
................
................
...."...........
........@.......
................
................

