本ブログでは検証ツールとして自作のドミニオンシミュレータを使用しています。
ここではツールの簡単な説明をします。
動作環境
OS:Windows
標準でインストールされているWSHというソフトウェア上で動作します。
ソースコードはGitHubで公開しています。
書きっぷりはイマイチな部分も多いですが、まだまだ発展途上なので、ちまちま機能を追加していくつもりです。
ファイル拡張子は.jsとなっていますが、JavaScriptではなくJScriptというスクリプト言語です。
Windows上でソースだけあれば動作可能ということでこの言語を選択しました。
github.com
ダウンロード方法
- ファイルエクスプローラからダウンロードしたzipファイルを解凍し、出力されたフォルダ(DomSim-main)を任意のフォルダに配置する。
※解凍はzipファイルを右クリック→「すべて展開」を押下など実施してください。
実行方法
- ファイルエクスプローラから「DomSim-main」内に移動。
- 「domsim.bat」をダブルクリック。 (完了まではしばらく時間がかかります。)
※Windows Defenderなどにより、信頼されないアプリうんぬんのダイアログが出る可能性がありますが、その場合は、「続行」をクリックして進めてください。
実行すると、以下のようなコンソール画面が出力されます。
ダウンロード直後の状態だと、鍛冶屋1枚ステロのシミュレート結果が表示されます。
属州4の平均ターン数として、おそらく14.8~15.0あたりの数値が出るかと思います。
- Enterキーを押すことでコンソール画面が閉じます。
AIの設定方法
setting.jsをテキストエディタ(メモ帳など)で開いて編集します。
今回は簡単な箇所だけ説明します。
そのうちもう少し詳細な説明を書きたいところ。。
購入手順の変更方法
購入手順はprocessBuyPhaseという関数内に設定します。
this.processBuyPhase = function(player) {
player.playAllTreasure();
if(player.coinNum >= 8 && player.countByCardNameInDeck(Card.NAME.GOLD) >= 1) {
if(player.tryBuy(Card.NAME.PROVINCE) === true) {
return true;
}
}
if(player.coinNum >= 6) {
if(player.tryBuy(Card.NAME.GOLD) === true) {
return true;
}
}
if(player.coinNum >= 4 && player.countByCardNameInDeck(Card.NAME.SMITHY) < 1) {
if(player.tryBuy(Card.NAME.SMITHY) === true) {
return true;
}
}
if(player.coinNum >= 3) {
if(player.tryBuy(Card.NAME.SILVER) === true) {
return true;
}
}
return false;
}
ダウンロード直後のsetting.jsは①~④で示した手順で購入対象を決定しています。
例として以下のように編集すれば購入手順を変更できます。
8金出た場合、金貨がデッキになくても属州を買いたい
if(player.coinNum >= 8 && player.countByCardNameInDeck(Card.NAME.GOLD) >= 1) {
を以下に修正する。
if(player.coinNum >= 8 && player.countByCardNameInDeck(Card.NAME.GOLD) >= 0) {
鍛冶屋を2枚デッキにいれたい
if(player.coinNum >= 4 && player.countByCardNameInDeck(Card.NAME.SMITHY) < 1) {
を以下に修正する。
if(player.coinNum >= 4 && player.countByCardNameInDeck(Card.NAME.SMITHY) < 2) {
鍛冶屋ではなく学者を買いたい(後述の学者をプレイするための設定も必要)
if(player.coinNum >= 4 && player.countByCardNameInDeck(Card.NAME.SMITHY) < 1) {
を以下に修正する。
if(player.coinNum >= 5 && player.countByCardNameInDeck(Card.NAME.SCHOLAR) < 1) {
公領を買いたい
②と③の間に以下を記載する。
if(player.coinNum >= 5) {
if(player.tryBuy(Card.NAME.DUCHY) === true) {
return true;
}
}
アクションカードプレイ手順の設定方法
アクションカードプレイ手順はprocessBuyPhaseという関数内に設定します。
this.processActionPhase = function(player) {
if(player.tryPlayCard(Card.NAME.SMITHY) === true) {
return true;
}
return false;
}
ダウンロード直後のsetting.jsはアクションカードは鍛冶屋のみプレイします。
例として以下のように編集すればアクションカードのプレイ手順を変更できます。
- 学者をプレイしたい(上述の学者を購入する手順を記載も必要)
if(player.tryPlayCard(Card.NAME.SMITHY) === true) {
を以下に修正する。
if(player.tryPlayCard(Card.NAME.SCHOLAR) === true) {
ゲーム終了条件の設定方法
ゲーム終了条件はisGameEndという関数内に設定します。
Setting.isGameEnd = function() {
if(board.players[0].countByCardNameInDeck(Card.NAME.PROVINCE) >= 4) {
return true;
}
return false;
}
ダウンロード直後のsetting.jsは属州4枚購入したタイミングでゲームが終了します。
例として以下のように編集すればゲーム終了手順を変更できます。
属州5枚購入したらゲーム終了としたい
if(board.players[0].countByCardNameInDeck(Card.NAME.PROVINCE) >= 4) {
を以下に修正する。
if(board.players[0].countByCardNameInDeck(Card.NAME.PROVINCE) >= 5) {
属州4、または属州3公領2でゲーム終了としたい
if(board.players[0].countByCardNameInDeck(Card.NAME.PROVINCE) >= 4) {
を以下に修正する。
if((board.players[0].countByCardNameInDeck(Card.NAME.PROVINCE) >= 4)
||
(board.players[0].countByCardNameInDeck(Card.NAME.PROVINCE) >= 3
&& board.players[0].countByCardNameInDeck(Card.NAME.DUCHY) >= 2)) {
最後に
(いるとは思えませんが)もし本シミュレータについて質問などがある場合、TwitterやDiscordでDMいただければと思います。
ソースに対するツッコミなども歓迎です。
他にもドミニオンオンラインのゲームログと観戦チャットを時系列で横に並べて取得するGoogle Chromeの拡張機能なんかも作ったりしてます。以下みたいなイメージです。
有名人同士の試合だと観戦者も多くチャット欄が盛り上がるので記録のために使っています。
こちらについてもそのうちGitHubで公開できたらいいなと思っています。