我正在尝试制作一个简单的天真文本冒险游戏(基本一页)来学习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 ; }
然后只解析用户输入并使用模式匹配来处理不同的情况.
我一直想弄清楚我应该如何在游戏中使用变体(或多态变体)和树.
有人可以提供一些建议吗?
在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 ...