NetHackเป็นเกมโร๊คไลค์ที่ผู้เล่นจะต้องดึง Amulet of Yendor ออกจากดันเจี้ยนระดับต่ำสุด เล่นกันโดยทั่วไปผ่าน telnet เกมทั้งหมดจะแสดงด้วยกราฟิก ASCII เกมดังกล่าวมีความท้าทายอย่างยิ่งและต้องมีความรู้เกี่ยวกับกลไกต่าง ๆ ของเกมเพื่อที่จะประสบความสำเร็จ
สำหรับจุดประสงค์ของการท้าทายสมมติว่าดันเจี้ยนทั้งหมดเป็นระดับเดียวและมีเพียง 5 × 16 ตัวอักษร นอกจากนี้สมมติว่านี่เป็นดันเจี้ยนที่ "ปลอดภัย" หรือคุณกำลังใช้ต้นแบบเท่านั้น - จะไม่มีสัตว์ประหลาดความกังวลเกี่ยวกับความหิว ฯลฯ ที่จริงแล้วคุณต้องติดตามตำแหน่งของตัวละครและเครื่องรางและเกม จะจบลงอย่างมีประสิทธิภาพเมื่อผู้เล่นมาถึงสถานที่เดียวกันกับเครื่องราง
ข้อกำหนดในการท้าทาย
- จะมีดันเจี้ยน 5 × 16 (ระดับเดียว)
- ให้ตำแหน่งเริ่มต้นของผู้เล่น (สุ่มเลือก) และพระเครื่องจะแยกแบบสุ่ม (แตกต่างกันในแต่ละครั้งที่โปรแกรมทำงาน) เริ่มสี่เหลี่ยมภายในดันเจี้ยน นั่นคือเครื่องรางไม่ได้รับอนุญาตให้เริ่มต้นในตารางเดียวกันกับผู้เล่น
- ยอมรับปุ่มป้อนข้อมูลสี่ปุ่มซึ่งย้ายผู้เล่นหนึ่งช่องในเวลาเดียวกัน (สี่ทิศทางสำคัญ) อนุญาตให้อ่าน / ประมวลผลอินพุตอื่น (ฟังก์ชั่น readline () ที่ต้องกด 'Enter' ฯลฯ )
- ไม่อนุญาตให้เดินทางนอกขอบเขตของคุกใต้ดิน เช่นหากผู้เล่นอยู่บนขอบด้านขวาของดันเจี้ยนที่ถูกต้องจะไม่ทำอะไรเลย
- หลังจากรุ่นเริ่มต้นและหลังการเคลื่อนไหวแต่ละครั้งให้พิมพ์สถานะของเกม เช่นนี้เป็นกอล์ฟรหัสและการพิมพ์ค่อนข้างจืดไม่สนใจนับจำนวนตัวอักษรสำหรับฟังก์ชั่นการพิมพ์และฟังก์ชั่นการโทรสมมติว่าไม่มีการเปลี่ยนแปลงรัฐ เซลล์ว่างควรแสดงเป็นจุด (
.
), เครื่องรางเป็น"
เครื่องหมายคำพูดคู่ ( ) และอักขระตามที่สัญลักษณ์ (@
) - เกมจะจบลงเมื่อผู้เล่น "ค้นพบ" เครื่องราง (มาถึงที่ตารางเดียวกัน)
การชนะ
นี่คือรหัสการแข่งขันกอล์ฟรหัสที่สั้นที่สุดเพื่อตอบสนองความต้องการหนึ่งสัปดาห์นับจากวันนี้จะมีการประกาศผู้ชนะ
ตัวอย่าง
นี่คือตัวอย่างโซลูชันใน 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 แต่การเพิกเฉยต่อการเรียกไปยังฟังก์ชันการพิมพ์และความหมายของจำนวนอักขระขั้นสุดท้าย 896
แต่ไม่สนใจการโทรไปยังฟังก์ชั่นการพิมพ์และความหมายของมันนับจำนวนตัวอักษรสุดท้ายคือ
เอาต์พุตเมื่อรันโปรแกรม:
................
...."...........
..........@.....
................
................
เอาต์พุต (รวมถึงด้านบน) หลังจากกดปุ่ม 'a' สองครั้ง:
................
...."...........
..........@.....
................
................
................
...."...........
.........@......
................
................
................
...."...........
........@.......
................
................