NetHack - це шахрайська гра, в якій гравець повинен отримати Амулет Єндора з найнижчого рівня підземелля. Зазвичай грається через telnet, вся гра представлена графікою ASCII. Гра надзвичайно складна і вимагає знань багатьох ігрових механіків, щоб досягти успіху.
Для цілей цього виклику припустіть, що вся підземелля - це однорівневий і лише 5 × 16 символів. Крім того, припустимо, що це "безпечне" підземелля або що ви лише впроваджуєте прототип - не буде жодних монстрів, побоювань з приводу голоду тощо. Насправді потрібно лише відстежувати місцезнаходження персонажа та амулет та гру фактично закінчиться, коли гравець прибуде в те саме місце, що і амулет.
Виклики вимог
- Буде підземелля 5 × 16 (однорівневий).
- Дайте гравцеві початкове місце (необов'язково випадковий) та амулет окремим випадковим випадком (різним щоразу, коли програма запускається), починаючи квадрат у підземеллі. Тобто амулет не дозволяється запускати на тому ж квадраті, що і гравцеві.
- Прийміть чотири клавіші введення, які переміщують гравця по одному квадрату (чотири кардинальні напрямки). Читання / обробка іншого вводу дозволено (функція readline (), яка потребує натискання клавіші "enter" тощо).
- Подорож за межі підземелля заборонена. Наприклад, якщо гравець знаходиться на правій грані підземелля, натискаючи праворуч, нічого не повинно робити.
- Після початкового покоління та після кожного руху надрукуйте стан гри. Оскільки це гольф коду, а друк є досить нецікавим, ігноруйте кількість символів для функції друку та виклику функції, не допускаючи змін стану . Порожні клітинки повинні бути показані у вигляді періоду (
.
), амулета як подвійна цитата ("
) та символу як у символу (@
). - Гра закінчена, коли гравець «виявить» амулет (потрапляє на ту саму площу)
Перемога
Це кодовий гольф-виклик, найкоротший код для задоволення вимог через тиждень з сьогоднішнього дня буде оголошено переможцем.
Приклад
Ось приклад рішення в C # (необгрунтований), щоб показати основні вимоги та вибірки.
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, але остання кількість символів - ігнорування дзвінків до функції друку та її визначення 896
.
Вихід при запуску програми:
................
...."...........
..........@.....
................
................
Вихід (у тому числі вище) після натискання клавіші "a" двічі:
................
...."...........
..........@.....
................
................
................
...."...........
.........@......
................
................
................
...."...........
........@.......
................
................