前文,继续到第十一章,期间根据需要对些许木兰语言功能进行了重现,并发布了木兰版本 0.0.15.1 。游戏例程代码已经开源在 gitee,第十一章运行效果如下,欢迎提 issue。

用木兰语言重写 Python 文字冒险游戏(九到十一章)-LMLPHP

注:由于 try...catch 语法仍然期待合作者一同完成(见此文末),因此例程中的异常处理部分暂且略过,不影响游戏功能。

下面是第十一章相比第八章新添加的主要部分,世界.ul,用于设定玩家可走到的每格的状况,为之后的打怪等等做准备:

type 地块 {
    func $地块(x, y) {
        $x = x
        $y = y
    }

    func $介绍 {
        throw NotImplementedError("请创建子类")
    }
}

type 起始位置 : 地块 {
    func $介绍 {
        return "\n        " +
        "你发现身处山洞,壁上有根摇曳的火把。\n        " +
        "可以看到四条出路,每条都阴暗摄人。\n\n"
    }
}

type 平常位置 : 地块 {
    func $介绍 {
        return "\n        " +
        "此处平淡无奇\n\n"
    }
}

type 取胜位置 : 地块 {
    func $介绍 {
        return "\n        " +
        "远处有道亮光……\n        " +
        "……越近越亮!是阳光!\n\n\n        " +
        "重见天日了!\n"
    }
}

地图 = [
    [nil, 取胜位置(1,0), nil],
    [nil, 平常位置(1,1), nil],
    [平常位置(0,2), 起始位置(1,2), 平常位置(2,2)],
    [nil, 平常位置(1,3), nil]
]

func 走到(x, y) {
    return nil if x < 0 or y < 0
    //try:
        return 地图[y][x]
    //except IndexError:
    //    return nil
}

原书第九到十一章基本在逐渐完善游戏功能,涉及的语言语法并不多。因此木兰 0.0.15.1 仅添加了 throw 语法和 isa 内置函数(与 Python 的 isinstance 对应)。但期间也发现尚待深究的问题,如引用模块所用包路径与 Python 规则不同。

04-03 20:02