汉诺塔游戏
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