汉诺塔游戏
2007/5/11 20:40:37
标 题: 写的一个小游戏
发信站: 一塌糊涂 BBS (Sat Sep 15 18:04:53 2001)
// hanoi.c
// 汉诺塔是一种古老的数学游戏,有三个底座(base),一开始
// 所有的盘子都按从小到大的顺序从上到下的放在第一个底座
// (base/A)里。其要求是把第一个底座中的盘子利用第二个底
// 座(base/B)全部移到第三个底座中。其中小的盘子只能放在
// 大的盘子上面,每次只能移动一个盘子。这个题目可以用递
// 归的方法求解(最少的完成步数 = 2 ^ 盘子数目 - 1)。
#include
#define MAX my["max"] // 总共盘子数
#define START my["start"] // 开始游戏者
#define BASE my["base"] // 底座的状态
#define STEP my["step"] // 已走的步数
inherit ITEM;
inherit F_SAVE;
inherit F_AUTOLOAD;
int do_help(string arg);
int query_autoload() { return 1; }
string query_save_file() { return __DIR__ "hanoi/" + query("start"); }
void create()
{
set_name(HIY "汉诺塔" NOR, ({ "hanoi" }));
set_weight(100);
set("long", "这是一套古老数学游戏汉诺塔的模型。\n");
set("unit", "套");
set("base", ([
"A" : ({ }),
"B" : ({ }),
"C" : ({ }),
]));
}
// 提供指令
void init()
{
add_action("do_new", "new"); // 新游戏
add_action("do_stop", "stop"); // 结束游戏
add_action("do_record", "record"); // 保存游戏
add_action("do_load", "load"); // 载入游戏
add_action("do_move", "move"); // 移动盘子
add_action("do_help", "help"); // 帮助信息
}
// 显示目前状态
string long()
{
mapping my = query_entire_dbase();
mapping info;
string *msg, line, base, long;
int i, j, max;
if (! START)
return my["long"];
info = ([ ]);
max = MAX * 2 + 4;
foreach (base in keys(BASE))
{
msg = ({ });
BASE[base] = sort_array(BASE[base], 1);
for (i = 0; i < MAX; i++)
{
j = i - (MAX - sizeof(BASE[base]));
if (j < 0)
line = repeat_string(" ", (max - 2) / 2) + WHT
"│" NOR +
repeat_string(" ", (max - 2) / 2);
else
{
line = repeat_string(" ", (max - BASE[base][j]
* 2) / 2) +
CYN + repeat_string("━", BASE[base][j]
) + NOR +
repeat_string(" ", (max - BASE[base][j]
* 2) / 2);
}
msg += ({ line });
}
info[base] = msg;
}
set("info", info);
long = WHT "现在" + ((! STEP) ? "第一步还没走"
: "已经走了 " + STEP + " 步") + "。\n\n"
+ NOR;
for (i = 0; i < MAX; i++)
{
long += sprintf("%s%s%s\n", info["A"][i], info["B"][i], info["
C"][i]);
下一页
返回列表
返回首页
©2025 MUD游戏网_文字mud 电脑版
Powered by iwms