NetHack - это игра в стиле roguelike, в которой игрок должен получить Амулет Йендора с самого низкого уровня подземелья. Обычно играется через telnet, вся игра представлена графикой ASCII. Игра чрезвычайно сложна и требует знаний многих игровых механизмов, чтобы добиться успеха.
В целях этого задания предположим, что все подземелье представляет собой один уровень и всего 5 × 16 символов. Кроме того, предположим, что это «безопасное» подземелье или что вы реализуете только прототип - здесь не будет монстров, опасений по поводу голода и т. Д. На самом деле вы должны отслеживать только местоположение персонажа, амулет и игру. эффективно закончится, когда игрок прибудет в то же место, что и амулет.
Требования к вызову
- Там будет подземелье 5 × 16 (один уровень).
- Дайте игроку начальную позицию (необязательно случайную) и амулет в виде отдельной случайной (отличающейся при каждом запуске программы) стартовой клетки внутри подземелья. То есть амулет не может начинаться на том же поле, что и игрок.
- Примите четыре клавиши ввода, которые перемещают игрока на одну клетку за раз (четыре основных направления). Разрешено чтение / обработка другого ввода (функция readline (), которая требует нажатия «enter» и т. Д.).
- Путешествие за пределы подземелья запрещено. Например, если игрок находится на правом краю подземелья, нажатие вправо ничего не должно делать.
- После первоначальной генерации и после каждого движения выведите состояние игры. Поскольку это код игры в гольф, а печать довольно неинтересна, игнорируйте количество символов для функции печати и вызова функции, не предполагая изменений состояния . Пустые ячейки должны быть показаны в виде period (
.
), амулет в виде двойной кавычки ("
) и символ как в символе (@
). - Игра заканчивается, когда игрок «обнаруживает» амулет (прибывает на ту же площадь)
выигрыш
Это кодовый гольф-код, самый короткий код, удовлетворяющий требованиям, который через неделю с сегодняшнего дня будет объявлен победителем.
пример
Вот пример решения в 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
.
Вывод при запуске программы:
................
...."...........
..........@.....
................
................
Вывод (включая выше) после двойного нажатия клавиши «а»:
................
...."...........
..........@.....
................
................
................
...."...........
.........@......
................
................
................
...."...........
........@.......
................
................