NetHack est un jeu peu scrupuleux dans lequel un joueur doit récupérer l'Amulette de Yendor au niveau le plus bas du donjon. Communément joué via telnet, l'ensemble du jeu est représenté avec des graphiques ASCII. Le jeu est extrêmement difficile et nécessite la connaissance de nombreux mécanismes de jeu pour réussir.
Pour les besoins de ce défi, supposons que tout le donjon soit un seul niveau et ne comporte que 5 × 16 caractères. De plus, supposons qu'il s'agit d'un donjon "sûr" ou que vous ne réalisiez qu'un prototype - il n'y aura aucun monstre, aucune inquiétude face à la faim, etc. En fait, vous devez simplement suivre l'emplacement du personnage, de l'amulette et du jeu. se terminera effectivement lorsque le joueur arrivera au même endroit que l’amulette.
Exigences du défi
- Il y aura un donjon 5 × 16 (niveau unique).
- Donnez au joueur un emplacement de départ (éventuellement aléatoire) et à l'amulette un emplacement de départ distinct (différent chaque fois que le programme est exécuté) à l'intérieur du donjon. C'est-à-dire que l'amulette n'est pas autorisée à commencer sur la même case que le joueur.
- Acceptez quatre touches de saisie qui déplacent le joueur d’une case à la fois (quatre directions cardinales). La lecture / le traitement d'autres entrées est autorisé (une fonction readline () qui nécessite d'appuyer sur 'entrée', etc.).
- Voyager en dehors des limites du donjon n'est pas autorisé. Par exemple, si le joueur est sur le bord droit du donjon, appuyer à droite ne devrait rien faire.
- Après la génération initiale et après chaque mouvement, imprimez l'état du jeu. Comme il s'agit d'un code golf et que l'impression est plutôt sans intérêt, ignorez le nombre de caractères pour la fonction d'impression et l'appel de fonction en supposant qu'aucun état ne change . Les cellules vides doivent apparaître en tant que point (
.
), amulet en tant que double guillemet ("
) et caractère en tant que symbole (@
). - La partie est terminée lorsque le joueur "découvre" l'amulette (arrive sur la même case)
Gagnant
Il s’agit d’un code de golf challenege, le code le plus court répondant aux exigences d’une semaine à partir d’aujourd’hui sera déclaré vainqueur.
Exemple
Voici un exemple de solution en C # (non golfé) pour montrer les exigences de base et les exemples de sortie.
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');
}
}
}
}
Le nombre total de caractères est 1474, mais en ignorant les appels à la fonction d'impression et à sa définition, le nombre de caractères final est 896
.
Sortie lorsque le programme est exécuté:
................
...."...........
..........@.....
................
................
Sortie (y compris ci-dessus) après avoir appuyé deux fois sur la touche "a":
................
...."...........
..........@.....
................
................
................
...."...........
.........@......
................
................
................
...."...........
........@.......
................
................