🎲

ボードゲームのWebアプリ化を支援する汎用ゲームエンジン「Dagaz」を作っている話 / (1) 設計思想について

2022/12/01に公開約8,100字

はじめに

この記事は、「ボードゲーム・パズルプログラミング Advent Calendar 2022」および「上智大学エレラボ Advent Calendar」第1日目の記事です。
https://adventar.org/calendars/7522
https://adventar.org/calendars/7664

「こんなボードゲームのアプリケーションを実装してみたいけど、ゼロから自分で全部作るの面倒だな...」
「このボードゲームが面白そうだから遊んでみたいけど、一緒に遊べる人が身近にいない!」
皆さん、そんな経験をしたことはありませんか?

この記事ではそんな問題へのひとつの解決策として、私が開発に参加している「Dagaz」というボードゲームエンジンを紹介します。また、その基本的な設計思想を解説した上で、OSSとして開発を進めていく上で現在直面している問題にいくつか触れます。
https://github.com/GlukKazan/Dagaz

次回の記事では、Dagazが現在抱えている技術的な問題点を説明し、その改善に興味を持って下さる方に向けた情報を提供する予定です。
次回記事を書きました。
https://zenn.dev/stepney141/articles/608e415746d76f

Dagazの概要・できること

Dagazは、

  • 様々なボードゲームを静的なWebアプリとして実装できるゲームエンジンを作ること
  • そのゲームエンジンで実装した各種ボードゲームのWebアプリ集を公開すること

を目指しているJavaScript製プロジェクトです。
プロジェクトの全ソースコードはMITライセンスの下で公開され、OSSとして開発されています。

Dagazは基本的な設計思想として、次の3つを掲げています。

  1. Web技術を用い、クロスプラットフォームに動作すること
  2. ソースコードを全て公開し、ユーザーが動作の仕組みを理解してカスタマイズするためのハードルを低くすること
  3. ゲームを遊ぶ人・ゲームを作る人双方のための、汎用的なボードゲームソフトウェアであること

現在までに実装済みのボードゲームは以下のリンク先のGitHub Pages上に公開しており、ブラウザさえあれば誰でも遊べるようになっています。
さらに、多くのゲームではブラウザ上で動作する思考ルーチンによってCPU対戦が可能です(強さはそれほどでもないです)。
https://glukkazan.github.io/


ロシアン・チェッカーをCPUと対戦している様子


変則リバーシをCPUと対戦している様子

また、対人・対AIでのプレイが可能なオンラインサーバも公開しています。下のリンク先は同サーバで対応しているゲームの一覧です。
ゲームの画像をクリックすると、サーバのユーザー登録画面に遷移します(既にログイン済みの場合はそのゲームのマッチング準備画面に遷移します)。ゲーム名のリンクをクリックすると、英語版Wikipediaなど外部サイト上の解説やルール説明が開きます。
https://games.dtco.ru/map


オンラインサーバで遊べるゲームの例

現時点でDagazを開発しているのは、ヴァレンティン・チェルノコフ(Валентин Челноков)氏と私の2名です。チェルノコフ氏はボードゲーム愛好家のITエンジニアで、Dagazのメンテナです。私はコミッターとしてゲームエンジン部分の次バージョンの開発作業などをやっています。

今のところ、ゲームエンジン部分は誰でも簡単に利用できるようには整備できていないのですが(詳しくは後述)、この問題を解消するために動作方式を変更した新しいゲームエンジン部分の製作を行っています。新しいゲームエンジンはまだアルファ版であるため、開発に興味を持って下さる方をただいま絶賛募集中です。
https://github.com/stepney141/dagaz-v2

なぜDagazが必要なのか

Dagaz前史:Zillions of Gamesについて

Dagazはもともと、「Zillions of Games」というゲームソフトの上位互換を目指して開発が始まったプロジェクトです。このため、Dagazの存在意義を説明するためには、まず「Zillions of Games」について解説する必要があります。

「Zillions of Games」とは、1998年に発売された商用ボードゲームエンジンです。
https://en.wikipedia.org/wiki/Zillions_of_Games

このソフトウェアが画期的だったのは、「アブストラクトボードゲームのルールをDSLで記述して読み込ませると、ソフト側がそれをよしなに解釈して自動でCPU対戦ができる」という機能を、商用ゲームソフトとしては初めて搭載していたことです(ゲーム情報学の領域では、こうした機能を持つプログラムを"general game playing engine"と呼んでいます)。

ゲームのルールの記述には、"Zillions Rules File (ZRF) "というLispのS式っぽい見た目をしている専用DSLを利用します。例として、ZRFによるティクタクトー(いわゆる○×ゲーム)のルール記述を紹介します(英語版Wikipedia "Zillions_of_Games" の項 (2022年9月29日 (木) 17:11時点の版)より引用、一部改変済み)。
かなり宣言的にゲームのルールを記述できていることが分かります。

(define add-to-empty  ((verify empty?) add)) ; マクロを定義

(game
   (title "Tic-Tac-Toe") ; ゲーム名
   (description "...") ; ゲーム説明
   (history "...") ; ゲームの歴史(人間用の情報)
   (strategy "...") ; ゲームの基本的な戦略(人間用の情報)
   (players X O) ; プレイヤー名の定義
   (turn-order X O) ; ターンの順番の定義(プレイヤー名で指定)
   (board ; 盤の定義
        (image "images\TicTacToe\TTTbrd.bmp") ; 盤の画像
        (grid ; 盤のグラフ構造
            (start-rectangle 16 16 112 112) ; top-left position
            (dimensions ; 3x3マスの正方形の盤を定義
                ("top-/middle-/bottom-" (0 112)) ; 行
                ("left/middle/right" (112 0))) ; 列
            (directions (n -1 0) (e 0 1) (nw -1 -1) (ne -1 1))
        )
   )
   (piece ; 駒の定義(本来なら○×ゲームに駒の概念はないが、ZRFでは「盤の上に追加される何らかのマテリアル」は全て「駒(piece)」として扱う)
        (name man) ; 駒の名前
	(help "Man: drops on any empty square") ; 駒の情報(人間用の情報)
	(image X "images\TicTacToe\TTTX.bmp" ; 駒の画像
		O "images\TicTacToe\TTTO.bmp")
        (drops (add-to-empty)) ; 駒の動き。冒頭で定義したマクロを使っている
   )
   (board-setup
        (X (man off 5))
        (O (man off 5))
   )

   (draw-condition (X O) stalemated) ; 引き分け条件の宣言
   (win-condition (X O) ; 勝利条件の宣言
	  (or (relative-config man n man n man) ; 4つの条件のORを取った値が真になること
      	  (relative-config man e man e man)
          (relative-config man ne man ne man)
          (relative-config man nw man nw man)
	  )
   )
)

ZRFでは一般的なアブストラクトボードゲームのみならず、エイトクイーンやナイトツアー、ハノイの塔などといったパズル類も「プレイヤーが1人だけのアブストラクトゲーム」と見なすことでルールを記述することができます。また、ZRFの機能をある程度拡張することができる追加モジュールも別に用意されています。

Zillions of Gamesは特に英語圏のボードゲーム愛好家の間で大ヒットしたそうで、アップデートの提供は既に停止しているものの、2022年現在も販売が続けられています。今でも熱心なユーザーが結構いるらしく、2022年12月1日現在の時点で、3186個ものゲームのZRFファイルが公式フォーラムにアップされています。
https://www.zillions-of-games.com/games/index.html

なお、Zillions of Gamesの機能やZRFの文法の詳細については、以下の日本語サイトがたくさんの情報を提供してくださっています。興味のある方は、このサイトの記事を参照されると良いでしょう。
https://w.atwiki.jp/zillionsofgames/

Zillions of Gamesの欠点、そしてDagazへ

しかし、そんなZillions of Gamesには重大な欠点が少なからず存在します。チェルノコフ氏は元々Zillions of Gamesの熱心なユーザーだったのですが、次第にその欠点を解消したいと考えるようになり、Dagazを作り始めるに至ったとのことです。

この節では「Zillions of Gamesの欠点を踏まえて、Dagazがどのような設計思想を持つに至ったか」を簡単に述べます。より詳しく知りたい方は、チェルノコフ氏が執筆したDagazの設計思想についての記事を私が以前に翻訳していますので、そちらもぜひご参照ください。
https://stepney141.hatenablog.com/entry/2020/11/05/230150

欠点① 古いWindowsしか公式にサポートしていない

Zillions of Games公式サイトに載っている推奨動作スペックを見てみましょう。
https://www.zillions-of-games.com/requirements.html

  • Windows ME/2000/XP
  • 1024 x 768 or higher graphics resolution to avoid clipping any boards
  • 16+ bit color
  • 38 MB of hard-disk space for a hard-disk install

とても時代を感じるスペックです。下の方を見ると、「Windows 95は公式にはサポートしていないが、必要な設定をすれば動かせる」「DirectX 8+が必要」などとも書かれています。もはや骨董品ですね。公式にサポートされている環境はこのような古いバージョンのWindowsだけです。FAQには「LinuxやMacで動かせますか?」という項目もあり、それによれば「Wineや仮想マシンを使えば動く」というようなことが書いてあります。

一応、Zillions of Gamesは私のWindows 10マシンでも特に問題なく動作してはいるのですが、公式にサポートされていない新しいOSで今後も正常に動作するかには大きな不安が残ります。また言うまでもありませんが、スマートフォンやタブレット端末のサポートは全く考慮されていません。

この問題を解消するため、Dagazでは「JavaScriptとHTMLで出来ている静的なWebアプリとしてゲームを実装する」というアプローチを取っています。Web技術の活用により、Zillions of Gamesと一線を画すクロスプラットフォームなゲームエンジンを作ることを目指しているのです。

欠点② ZRFでうまく記述できないゲームも多い

この問題については様々なユーザーから指摘がなされており、Zillions of Games公式サイトのFAQにも記述があります。

https://www.zillions-of-games.com/supportedFAQ.html
https://en.wikipedia.org/w/index.php?title=Zillions_of_Games&oldid=1113083920#Limitations
https://w.atwiki.jp/zillionsofgames/pages/462.html
https://www.nakajim.net/index.php?アブストラクトゲームとコンピューター

上記のリンク先を参考に、現実的に実装が難しいゲームの例をいくつか挙げてみます。

  • カードゲームのような不完全情報ゲーム
    • 盤面の一部を画面表示しないようにすることはできるが、AI側には筒抜けになる
  • 獲得した点数を競うゲーム
    • 整数値・整数演算がZRFにないため
  • 陣取りゲーム
  • 一つのマス目に複数の駒を置くことが出来るゲーム

チェルノコフ氏の見解によれば、「ZRFで簡単に実装することが出来るのは、極めて単純な――特にチェッカーやチェスに類似している――ルールのゲームのみ」ということでした。

現在のDagazでは、ZRFをベースとしたゲームルール記述を採用していますが、ZRFだけでは記述できない複雑なルールにも対応するため「JavaScriptでゲームルールの拡張プラグインを書く」という手法を取っています。これによりZRFの汎用性の低さを補うことを狙っているのです。

欠点③ ソースコードが公開されていない

見方によってはこれが最大の欠点かもしれません。

商用ソフトウェアである以上は仕方ないことかもしれませんが、Zillions of Gamesはクローズドソースです。このため、先述した欠点を自分で改善したいと思っても自力でどうにかすることが難しいのです。

Dagazでは、ゲームエンジン部分・それを使って実装されたボードゲーム群の両方をMITライセンスで公開し、誰でもGitHub上で開発に参加できるようになっています。

OSSとしてのDagazの課題

ドキュメントがない

これまでのDagazでは、ユーザー向けの英語ドキュメントが全くと言っていいほど執筆されてきませんでした。これは、チェルノコフ氏の母語がロシア語であり、氏にとって英語ドキュメントの執筆はハードルが高かったためのようです(私も英語はそこまで得意ではないので、この気持ちには非常に共感しています)。しかし、ゲームで遊ぶ人であろうとゲームを作る人であろうと関係なく、ユーザーに向けた何らかの説明書が整備されていないことは「お前はアプリケーションを使うな」と言っているのも同然です。

その一方、詳しくは次回の記事で説明する予定ですが、現行のDagazの動作方式には様々な問題があります。このため「既に実装されたボードゲームを遊ぶだけの人」に向けたドキュメントはともかくとして、「ゲームエンジン部を使って様々なゲームを自分で実装したい人」にエンジンを使ってもらうためには、ドキュメント以前にソースコード側の準備が整っていないという現実があります。次で述べる開発リソースの問題との兼ね合いもあり、まずは現在アルファ版である次期ゲームエンジン部のソースコードをベータ版にしてからでないと、「ゲームエンジン部を使って様々なゲームを自分で実装したい人」に向けたドキュメントをきちんと整備するのは難しいというのが現状です。

開発者が少ない

既に述べた通り、現在Dagazの開発に関わっているのはメンテナのチェルノコフ氏と私の2人だけです。率直に言って、開発を効率よく進めていくためのマンパワーが圧倒的に足りていません。

開発者があまりいない背景として、これまでDagazの宣伝がロシア語圏以外でほとんどされてこなかったことが大きいと私自身は考えています。チェルノコフ氏自身は、「habr」というロシア版QiitaのようなサービスでよくDagazについての記事を書いていらっしゃるのですが、その一方、英語圏のインターネットに向けて情報を発信されることはそこまで多くありません。

ぶっちゃけ私自身もOSSのことをよくわかっていないため、「redditなどの英語話者の多い媒体で宣伝を行うのが効果的」とはよく聞くものの、具体的にどんな感じにやっていくのが良いのか全く分かっていません。もしもこの辺りの知識をお持ちの方がいらしたら、ぜひアドバイスを頂ければ幸いです。

まとめ

この記事では、汎用ボードゲームエンジン「Dagaz」の概要を紹介しました。
また、Dagazの基本的な思想が「Zillions of Games」というソフトウェアに大きな影響を受けていることや、OSSとして開発を進めていく上でDagazが抱えている課題を紹介しました。

Dagazで実装されたボードゲームで遊んでみて、「ここはおかしい」「こんな改善点があるのではないか」と感じたことがありましたら、ぜひご報告ください。もしもこの記事を見てDagazというソフトウェアに興味を持ってくださった方がいれば、お気軽にコメントなどを頂ければ幸いです。

Discussion

ログインするとコメントできます