我正在尝试制作一个简单的天真文本冒险游戏(基础this page)来学习OCaml。
游戏是关于制作游戏引擎,所以关于房间,项目等的所有信息都存储在json文件中。
示例json文件将是这样的:
{
"rooms":
[
{
"id": "room1",
"description": "This is Room 1. There is an exit to the north.\nYou should drop the white hat here.",
"items": ["black hat"],
"points": 10,
"exits": [
{
"direction": "north",
"room": "room2"
}
],
"treasure": ["white hat"]
},
{
"id": "room2",
"description": "This is Room 2. There is an exit to the south.\nYou should drop the black hat here.",
"items": [],
"points": 10,
"exits": [
{
"direction": "south",
"room": "room1"
}
],
"treasure": ["black hat"]
}
],
"start_room": "room1",
"items":
[
{
"id": "black hat",
"description": "A black fedora",
"points": 100
},
{
"id": "white hat",
"description": "A white panama",
"points": 100
}
],
"start_items": ["white hat"]
}
我差不多完成了比赛,但是在项目描述页面上,它说两个目标是
- 设计用户定义的数据类型,尤其是记录和变体。
- 编写在列表和树上使用模式匹配和高阶函数的代码。
但是,我所做的唯一用户定义的数据类型是用于捕获游戏当前状态的记录类型,我没有使用树和变体:
type state = {
current_inventory : string list ;
current_room : string ;
current_score : int ;
current_turn : int ;
}
然后只解析用户输入并使用模式匹配来处理不同的情况。
我一直想弄清楚如何在游戏中使用变体(或多态变体)和树。
有人可以提供一些建议吗?
答案 0 :(得分:5)
json
本来就是一棵树。当然,您可以在没有内存表示的情况下解析json,并在通过json数据下降时执行有效计算,以使用您已读取的数据填充哈希表。这是一个有效的选项,但看起来该课程的作者希望您首先读取整个json并将其作为树在内存中表示,然后在树上执行查找。
关于变体的内容,您应该使用变体类型表示以下数据:
type dir = N | NE | E ...
type verb = Go | Take of item | Drop of item
此外,为room
和items
创建抽象数据类型是个好主意,这样可以保证它们实际存在于json
数据库中。您正在使用string
来代表他们。但是这种类型包括所有值,包括那些不代表有效标识符的值,以及那些在游戏描述文件中不会出现的值。库存物品也值得拥有自己的类型。
通常在具有丰富类型系统的语言中,您应尽量使用类型系统来表达。
只是为了减少理论,如果我是你,那么我将在游戏中使用以下类型(作为第一个近似值):
type game
type room
type item
type verb
type dir
type treasure
type state
(** a static representation of a game (using a tree inside) *)
module Game : sig
type t = game
val from_json : string -> t option
val start : t -> room
val room_exits : t -> room -> (dir * room) list
end
module Room : sig
type t = room
val description : t -> string
val items : t -> item list
val points : t -> int
val treasure : t -> treasure list
end
...