NetHack adalah gim seperti roguelike di mana seorang pemain harus mengambil Amulet Yendor dari tingkat bawah tanah dungeon. Biasa dimainkan melalui telnet, seluruh permainan diwakili dengan grafik ASCII. Gim ini sangat menantang dan membutuhkan pengetahuan banyak mekanik gim agar berhasil.
Untuk keperluan tantangan ini, asumsikan bahwa seluruh ruang bawah tanah adalah satu tingkat dan hanya 5 × 16 karakter. Lebih jauh, anggaplah ini adalah penjara bawah tanah "aman" atau bahwa Anda hanya menerapkan prototipe — tidak akan ada monster, kekhawatiran tentang kelaparan, dll. Faktanya, Anda hanya harus melacak lokasi karakter dan jimat dan permainan akan secara efektif berakhir ketika pemain tiba di lokasi yang sama dengan jimat.
Persyaratan tantangan
- Akan ada penjara 5x16 (level tunggal).
- Berikan pemain lokasi awal (opsional acak) dan jimat acak terpisah (berbeda setiap kali program dijalankan) mulai kuadrat di dalam ruang bawah tanah. Yaitu, jimat tidak diperbolehkan untuk memulai di lapangan yang sama dengan pemain.
- Terima empat tombol input yang menggerakkan pemain satu kotak pada satu waktu (empat arah mata angin). Membaca / memproses input lain diperbolehkan (fungsi readline () yang membutuhkan penekanan 'enter', dll).
- Bepergian ke luar batas dungeon tidak diperbolehkan. Misalnya, jika pemain berada di tepi kanan bawah tanah, menekan kanan seharusnya tidak melakukan apa-apa.
- Setelah generasi awal dan setelah setiap gerakan, cetak status permainan. Karena ini adalah kode golf dan pencetakan agak tidak menarik, abaikan penghitungan karakter untuk fungsi cetak dan panggilan fungsi dengan asumsi tidak ada perubahan status . Sel kosong harus ditampilkan sebagai titik (
.
), jimat sebagai tanda kutip ganda ("
) dan karakter sebagai pada simbol (@
). - Permainan berakhir ketika pemain "menemukan" jimat (tiba di alun-alun yang sama)
Kemenangan
Ini adalah kode golf challenege, kode terpendek untuk memenuhi persyaratan satu minggu dari hari ini akan dinyatakan sebagai pemenang.
Contoh
Berikut adalah contoh solusi dalam C # (ungolfed) untuk menunjukkan persyaratan dasar dan output sampel.
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');
}
}
}
}
Jumlah karakter total adalah 1474, tetapi mengabaikan panggilan ke fungsi cetak dan definisinya adalah jumlah karakter akhir 896
.
Output ketika program dijalankan:
................
...."...........
..........@.....
................
................
Keluaran (termasuk di atas) setelah tombol 'a' ditekan dua kali:
................
...."...........
..........@.....
................
................
................
...."...........
.........@......
................
................
................
...."...........
........@.......
................
................