暁ゲーム工房 @Akatsuki_No9
「暁ゲーム工房」です.
様々な一次創作者様の作品をアートワークに,ボードゲームを製作する個人サークルです.
当日販売するボードゲームは「Creative Tavern」というタイルプレイスメントゲームです。
不朽の名作「プエルトリコ」のシステムをシンプルに再構築しました。
「ヴァリアブル・フェイズ・オーダー(フェイズ選択システム)」と呼ばれるクッソ複雑なメカニクスの入門編として製作しました。
- テストプレイを行うプログラム開発の話【2018春大阪】
- 2018/6/18 20:59
ゲームデザイナー視点での解説記事はこちら(http://akatsuki-no-9.hatenablog.com/entry/2018/06/19/005515).以下,本文です.どうぞ.
-------------------------------------------------------------------------------------------------------------
暁ゲーム工房でエンジニアとしてお手伝いしている viviria です.
暁ゲーム工房ではゲームマーケット2018春大阪で「Creative Tavern」というゲームを販売いたしました.
まえがき
ボードゲームを制作するにあたって,テストプレイというのは非常に重要なプロセスです.
テストプレイによって制作段階での落とし穴やバランスの不備を発見できます.
しかしそれを発見するためには多くの試行回数と人手が必要となります.
友達が少ない暁ゲーム工房はどうすれば…
??「人手が足りないならマシンにやらせればいいじゃない」
ということで,テストプレイを行うプログラムを作成しました.
しかし,ただゲームがプレイできるプログラムを作成して繰り返し実行するだけではテストプレイの目的は果たせません.
ただ乱数に頼ってプレイ回数を増やしても原因の発見にはなりませんし,膨大なログを見るわけにもいきません.
明確な目的といくつかの前提によってシミュレーションを行います.
「Creative Tavern」というゲーム
「Creative Tavern」は運の要素が比較的少ないゲームです.
作者曰く「自分が負けるのは自分が悪い」
そのため運の要素はなるべく排除しなければなりません.
このゲームの運の要素を挙げるとすれば,
- 手番の決め方
- どのお客さんカードが場に出るか
- マーケティングカードの引き
- 特殊食材の引き
- どのマップタイルがめくれるか
となります.
2 ~ 5 は山札という性質上割り切らないといけない部分です.
では 1 をどのようにするのか…
多くのボードゲームには手番差によって有利不利が発生してしまいます.
そのため,不利な手番にはボーナスを与えることがあります.
では適切なボーナスをどのように与えるか,これを探します.
目的
各手番にどのようなボーナスを与えるべきか.
「Creative Tavern」の得点を得る要素として以下があります.
・マップタイル
・マーケティングカード
・食材カード
これをゲームの最初にプレイヤに与えて勝率が均等になるような組み合わせを探します.
前提
ここでは,今流行りの「学習」を扱いません,
「学習」を扱わないのは,強い定石を発見する,強い AI を作成するという目的ではないからです.
しかし,プレイヤがある程度こういう行動を取るだろうというパターンを決め打ちをしています.
- 「調理」は所持している食材カードで獲得できるお客さんカードの中で一番得点が高いカードを選ぶ
- プレイヤの食材の価値は以下の式で計算する
Ex:食材 x に対する価値
Ox:公開されているすべてのお客さんカードのオーダーにある食材 x の合計
Hx:プレイヤが持っている食材 x の枚数
Cx:食材 x をオーダーするお客さんカードの枚数 Cx
Ex = (Ox - Hx) * Cx
この式は「移動」でどこのパネルに行くかや任意を食材カードを獲得する時,マーケティングカードのコスト支払い時にどの食材カードを使用するかなどに用いる.
- マーケティングカードは上限の2枚所持している状態でコストが支払えれば使用する
- 選択するアクションの優先順位は条件を満たしていれば以下である
調理 > 収穫 > 移動 > 市場調査 > 開拓
調理の条件:獲得できるお客さんカードが公開されている
収穫の条件:スタートパネルや裏になったパネルにいない
特にアクションの優先順位は完全に決め打ちです.
開発環境と実行環境
プログラムの開発環境は OS Windows 7 Home Premium 64bit, メモリ 8GB,CPU Core 2 Duo E6750 と古いパソコンで行いました.
実行には時間がかかるので OS Ubuntu 16.04 LTS, メモリ 16GB, CPU i7-6700K で行いました.
Ubuntu では make でコンパイルできるようにしています.
開発言語は C++ です,
ボーナスのパラメーター化
ボーナスは3種類について与えるかどうかというデータがプレイヤ4人分必要となります.
この場合,次のように 12bit で表すことができます.
12bit の上位から 3bit ずつ プレイヤ3, プレイヤ2, プレイヤ1, プレイヤ0 に対応させます.
また、bit は以下のように対応させます.
0 0 0
| | +--マーケティングカードを1枚引く
| +----任意の食材カードを1枚得る
+------マップタイルを最初から1枚置ける
ex) 1番手に食材、2番手にマップタイル、3番手になし、4番手に食材とマップタイル
110 000 100 010
これを10進数にすると 3106 となります
この10進数の値をプログラムに渡して実行させます.
プログラム内ですべて書いて繰り返しても良いですが,このような場合は Linux のターミナルに処理させると便利です.
12bit 全通りなので 0 ~ 4095 の値を 1 ずつ増やしながらプログラムを実行するようにシェルを組みます.
結果
プログラムは何番手のプレイヤが勝利したかを出力させます.
これを繰り返すことで勝率が計算できます.
このプログラムを 4000万回 実行させて勝率が一番均等になるようなボーナスを採用しました.
あとがき
「Creative Tavern」ではテストプレイを行うプログラムを作成し,その結果で手番差の調整を行いました.
前提で触れたようにこのプログラムは決め打ちによって成り立っています.
特にどのアクションが優先されるべきかは状況によって異なります.
ここでは得点を得る手段として「調理」と「収穫」が大きなウェイトが占めているためこのようにしました.
このプログラムが絶対ではないとだけは言っておきます.
おまけ シミュレーションが向いていないゲーム
「Creative Tavern」はプログラムと相性が良いゲームといえます.
それはすべての要素が盤上で完結しているためです.
では,相性が良くないゲームとは何か?
それはコミュニケーションが主となっているゲームです.
交渉などが要素となっているゲームは,プログラムで書かれたテストプレイでは再現できないでしょう.
そのようなゲームをシミュレーションする場合はそれこそ今流行りの AI が必要になるかと思います.
以上,ボードゲームのテストプレイを行うプログラムを作成してみた話でした.