ZoGを使いこなす(パート1:オオカミと子供)

オオカミと子供 前回の記事で、私は独自の、 Zillions of Gamesプロジェクトについて話しました。 約束したとおり、このプロジェクトのフレームワーク内で新しい(および既存の)ゲームを開発するために設計された宣言型言語の機能を説明する一連の短いトレーニング記事を開始しています。



(この段階で)不要な詳細でプレゼンテーションを混乱させないために、実装に非常にシンプルなゲームを選択しました。 私は子供の頃にそれを演奏しました。 それはオオカミと子供と呼ばれます。 ルールは次のとおりです。オオカミ(黒い部分)-1つのセルを斜めに、前方にのみ移動します。 キッド(白い図)-1つのセルを斜めに、ただしどの方向にも歩きます。 ホワイトの仕事は、最後の水平線の色の4つの正方形のいずれかに行くことです。 ブラックの仕事は、ホワイトから引っ越す機会を奪うことです。



Blackは標準の8x8チェス盤で初級を獲得しているため、ゲームには9x9の正方形ボードを使用します。 このゲームは非常にシンプルです(そして子供たちも気に入っています)。 適切なゲームで、白は常に勝ちます。



ルール記述言語(ZRF)はLISPに非常に似ています。 LISPの場合と同様に、開始ブラケットと終了ブラケットのバランスを監視することは非常に重要です(そうでない場合、ゲームはロードされません)。 LISPと同様に、コメントはセミコロンで始まり、行末まで続きます。



; ***************************************************************** ; ***    ; ***************************************************************** (version "2.0")
      
      





ここでは、解説でゲームを簡単に説明し、Zillions of Gamesが動作するバージョンを示します。 「エンジン」の新しいバージョンでは、ゲームは開始されません。



ZRFでは、マクロが頻繁に使用されます。 それらは非常に単純ですが、パラメーターを使用できます。 次のエントリは、ゲームで可能な唯一の動きを示すマクロです-指定された方向の1つのセル:



 (define checker-shift ($1 (verify empty?) add))
      
      





書き込みコードで使用する場合:



 (checker-shift ???)
      
      





マクロは次のように展開されます。



 (??? (verify empty?) add)
      
      





渡されたパラメーターとこのレコード全体の意味を以下に説明します。 とりあえず、マクロを使用することで多くの記述やマクロに関連する説明に誤りが生じる可能性を回避できることを理解することが重要です。



以下にボードについて説明します。 通常、その説明もマクロで取り出されます。



 (define board-defs (image "images\gluk\Board.bmp") (grid (start-rectangle 2 2 48 48) (dimensions ("a/b/c/d/e/f/g/h/i" (48 0)) ; files ("9/8/7/6/5/4/3/2/1" (0 48)) ; ranks ) (directions (nw -1 -1) (ne 1 -1) (se 1 1) (sw -1 1)) ) (symmetry Black (ne sw) (sw ne) (nw se) (se nw)) (zone (name goals) (players White) (positions b9 d9 f9 h9) ) )
      
      





説明画像の意味は理解できます-これは、ボードを表示するためにロードされた画像ファイルの名前です。 以下は、正方形のボード(グリッド)の説明です。 ZRFの機能は、長方形のボードの説明に限定されないことに注意してください。 この言語を使用すると、三角形および六角形のボードを記述でき、最大5次元の多次元ボードを記述でき、ボードのエッジを「接着」して、トポロジを決定できます。 これについては今からは説明しません。 このような説明の詳細は、ZRF言語(ゲームに付属)を説明するchmファイルと、さまざまなボードに既に実装されている膨大な数のゲームにあります。



グリッド記述の3つの重要なフレーズは、ゲームにとって重要です。長方形の開始は、ボードがロードされた図面を「オーバーレイ」する方法を記述します。 フレーズdimensions-ディメンションを説明します(2つあります)。 各次元の説明の先頭にある行は重要です-セルの番号付け順序を説明します(したがって、座標系を定義します)。 次のパラメーターは、測定の「ルーラー」をボード上に重ねる方法を定義します。 独自に開発されたボードイメージを使用する場合、これらの数値と開始四角形で指定された値を選択することは困難な場合があることに注意してください。 人物の画像がボードの画像の適切な場所に収まるようにするには、多くの試みが必要になる場合があります。



次の非常に重要なフレーズ(方向)は、図形が移動できる方向を定義します。 北西(nw)、北東(ne)、南西(sw)、南東(se)の4つの方向を定義します。 フレーズの対称性を使用して、これらの方向を黒人プレーヤーに変換するルールを定義します。



最後の行(ゾーン)-セルのセットを定義します。これは、白人の勝利の条件を決定するときにさらに使用します。



 (define game-defs (board (board-defs) ) (board-setup (White (WC e2) ) (Black (BC b9 d9 f9 h9) ) ) (win-condition (White) (absolute-config WC (goals))) (loss-condition (White Black) stalemated) )
      
      





このマクロでは、ゲームの条件を定義します。 フレーズboardは、以前に定義したボードを定義します(board-defsマクロが展開されます)。 ボード設定では、プレーヤーの初期位置が決定され、その後、勝利条件と損失条件のフレーズがプレーヤーの勝利と敗北の条件を決定します。 ホワイトの勝利条件によって、以前に定義されたゾーンへの通過を決定し、敗北の条件は、双方にとって、次の動きをすることができないことです。



ゲームを決定するために残っています:



 (game (title "  ") (description "     ") (players White Black) (turn-order White Black) (game-defs) (piece (name WC) (image White "images\gluk\W.bmp") (description "") (help "  1      ") (moves (checker-shift ne) (checker-shift nw) (checker-shift se) (checker-shift sw) ) ) (piece (name BC) (image Black "images\gluk\B.bmp") (description "") (help "  1     ") (moves (checker-shift ne) (checker-shift nw) ) ) )
      
      





ここでの定義のほとんどは直感的です。 数点だけ停止する価値があります。 プレイヤーというフレーズは、私たちがすでに使用しているのと同じ白と黒のプレイヤーを表します。 2人以上のプレイヤーが存在でき、1人のプレイヤーをパズルで定義できます(ランダムな動きをしているプレイヤーを特定することも可能ですが、これは別の議論のトピックです)。 ターン順序というフレーズは、プレーヤーのターンの順序を決定します(2人のプレーヤーの動きの単純な交互とは異なる場合もあります)。



さらに、ゲーム設定(game-defs)の説明の後に、ゲームで使用される数字(piece)の説明が続きます。 それらの記述のほとんども理解できます。 移動セクションには、ピースで可能なすべての移動がリストされます。 ここで、最初に説明したチェッカーシフトマクロを使用します。 見やすいように、パラメータとして、図形の可能な移動方向がそれに転送されます。 マクロを展開した結果、次のような結果が得られます。



 ( ne (verify empty?) add )
      
      





指示された方向に移動し、セルが空かどうかを確認してピースを配置します(理解するのが難しい瞬間があります。私にとっては、移動の開始時にボードからピースが削除され、移動の最後にボードに戻ります)。 より詳細に、例としてより複雑なゲームを使用して、次の記事でムーブのルールを説明する可能性について説明する予定です。



新しいゲームの準備ができました。 ご希望の方は、 GitHubのリポジトリからダウンロードできます。



重要な発言
注:このコードを実行するには、Zillions of Gamesのコアを何らかの方法でロック解除する必要があります(たとえば、シリアル番号を購入する)






All Articles