当前位置:  开发笔记 > 编程语言 > 正文

OCaml:设计文本冒险游戏的数据类型

如何解决《OCaml:设计文本冒险游戏的数据类型》经验,为你挑选了1个好方法。

我正在尝试制作一个简单的天真文本冒险游戏(基本一页)来学习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 ;
}

然后只解析用户输入并使用模式匹配来处理不同的情况.

我一直想弄清楚我应该如何在游戏中使用变体(或多态变体).

有人可以提供一些建议吗?



1> ivg..:

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
...

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有