2

私はOCaml を学ぶために単純な素朴なテキスト アドベンチャー ゲーム (このページのベース 1) を作ろうとしています。

このゲームはゲーム エンジンを作成するためのものなので、部屋やアイテムなどに関するすべての情報は 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"]
}

私はゲームをほぼ完了しましたが、プロジェクトの説明ページには、目的の 2 つが

  • ユーザー定義のデータ型、特にレコードとバリアントを設計します。
  • リストとツリーでパターン マッチングと高階関数を使用するコードを記述します。

ただし、私が作成した唯一のユーザー定義データ型は、ゲームの現在の状態をキャプチャするために使用されるレコード型であり、tree と variant は使用しませんでした:

type state = {
  current_inventory : string list ;
  current_room      : string ;
  current_score     : int ;
  current_turn      : int ;
}

次に、ユーザー入力を解析し、パターン マッチングを使用してさまざまな状況を処理します。

ゲームでバリアント (またはポリモーフィック バリアント)ツリーをどのように使用すればよいかを理解しようとしています。

誰か提案をお願いできますか?

4

1 に答える 1

5

json本質的にツリーです。もちろん、メモリ内表現を使用せずに json を解析し、json データをたどって読み込んだデータをハッシュ テーブルに入力する際に​​、副作用のある計算を実行することもできます。これは有効なオプションですが、コースの作成者は、最初にjson全体を読み取り、メモリ内でツリーとして表現してから、ツリーでルックアップを実行することを期待しているようです.

バリアントに関しては、次のデータをバリアント型で表す必要があります。

  1. 移動方向:type dir = N | NE | E ...
  2. 動詞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
...
于 2015-12-18T19:37:32.143 に答える