NetHack是一款类似流氓的游戏,玩家必须从地牢的最低级别取回Yendor的护身符。通常通过telnet进行游戏,整个游戏均以ASCII图形表示。游戏非常具有挑战性,需要许多游戏技巧的知识才能成功。
出于此挑战的目的,假定整个地牢是一个单独的级别,并且只有5×16个字符。此外,假设这是一个“安全”地牢,或者您只是在实现一个原型-不会有怪物,对饥饿的担忧等。实际上,您只能跟踪角色,护身符和游戏的位置当玩家到达护身符的相同位置时,将有效结束。
挑战要求
- 将有一个5×16的地牢(单层)。
- 给玩家一个开始的位置(可以选择随机),而护身符一个单独的随机(每次运行该程序都不同)在地牢内的开始位置。即,不允许护身符与玩家在同一方块上开始。
- 接受四个输入键,这些输入键可一次将玩家移动一个方块(四个基本方向)。允许读取/处理其他输入(需要按下“ enter”等的readline()函数)。
- 禁止在地牢范围内旅行。例如,如果玩家在地牢的右边缘,则按向右不应该执行任何操作。
- 在初始生成之后和每次移动之后,请打印游戏的状态。由于这是代码打法,并且打印相当无趣,因此假设状态没有变化,请忽略打印函数和函数调用的字符数。空单元格应显示为句点(
.
),护身符应显示为双引号("
),字符应显示为符号(@
)。 - 当玩家“发现”护身符时游戏结束(到达同一方块)
获奖
这是高尔夫挑战赛的代码,从今天起一周内满足要求的最短代码将被宣布为获胜者。
例
这是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,但是忽略对print函数及其定义的调用,最终字符数为896
。
程序运行时的输出:
................
...."...........
..........@.....
................
................
两次按“ a”键后的输出(包括以上内容):
................
...."...........
..........@.....
................
................
................
...."...........
.........@......
................
................
................
...."...........
........@.......
................
................