NetHack , bir oyuncunun zindanın en alt seviyesinden Yendor Amuletini alması gereken bir oyun. Yaygın olarak telnet üzerinden oynanan tüm oyun ASCII grafikleriyle temsil edilir. Oyun son derece zorlu ve başarılı olmak için birçok oyun mekaniği bilgisi gerektirir.
Bu zorluğun amaçları doğrultusunda, tüm zindanın tek bir seviye ve sadece 5 x 16 karakter olduğunu varsayalım. Dahası, bunun "güvenli" bir zindan olduğunu veya yalnızca bir prototip uyguladığınızı varsayalım - canavarlar, açlık endişeleri olmayacak, vs.. oyuncu muska ile aynı yere geldiğinde etkili bir şekilde sona erecek.
Zorluk şartları
- 5 × 16 zindan olacak (tek seviye).
- Oyuncuya bir başlangıç konumu verin (isteğe bağlı olarak rastgele) ve muska, zindanın içinde başlayan kareye ayrı bir rasgele (programın her çalıştırılışında farklı) verin. Yani, muska, oyuncuyla aynı meydanda başlamaz.
- Müzikçaları bir defada bir kare hareket ettiren dört giriş tuşunu kabul edin (dört kardinal yön). Diğer girdilerin okunmasına / işlenmesine izin verilir ('enter', vb. Gerektiren bir readline () işlevi).
- Zindanın sınırlarının dışına seyahat etmek yasaktır. Örneğin, oyuncu zindanın sağ kenarındaysa sağa basmak hiçbir şey yapmamalıdır.
- İlk nesilden sonra ve her hareketten sonra, oyunun durumunu yazdırın. Bu kod golf olduğundan ve yazdırma oldukça ilgi çekici olmadığından, durum değişikliği olmadığını varsayarak yazdırma işlevi ve işlev çağrısı için karakter sayısını göz ardı edin . Boş hücreler; dönem (
.
), muska, çift alıntı ("
) ve karakter (@
) ile gösterilmelidir. - Oyuncu muska "keşfettiğinde" biter (aynı kareye vardığında).
Kazanan
Bu bir kod golf mücadelesidir, bugünden bir hafta sonra gereksinimlerini karşılayacak en kısa kod kazanan ilan edilecektir.
Örnek
Temel gereklilikleri ve örnek çıktılarını gösteren örnek bir C # (ungolfed) çözümü.
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');
}
}
}
}
Toplam karakter sayısı 1474'tür, ancak baskı işlevine yapılan çağrıları ve tanımını son karakter sayımı olarak görmezden gelmek 896
.
Program çalıştırıldığında çıktı:
................
...."...........
..........@.....
................
................
'A' tuşuna iki kez basıldıktan sonra çıkan çıktı (yukarıdakiler dahil):
................
...."...........
..........@.....
................
................
................
...."...........
.........@......
................
................
................
...."...........
........@.......
................
................