この1年間で変わったこと

社会人になって1年で変わったことを振り返ろうと思ったら140字に収まりそうにないので、ここで*1

明らかに生活が偏ってるけど、こうやって見ると社会人も悪くないなぁ、と思う。たぶん。

*1:現在、3/31 23:50

ドミニオン初心者4人に勉強会を開いた話

最近全然ブログ更新していなかったので、年を越す前に何か書くネタは無いか考えたところ、1ヶ月半前に知り合い相手にドミニオン勉強会を開いたのをまだ記事にしていなかった。

いわゆる「初心者にドミニオンを好きになってもらう方法」の一例ということで一つ。

なぜ勉強会をやったのか

幸運なことに、4月からほぼ週1回ペースでドミニオンをオフラインプレイできる環境にいる。 ただ、その環境というのはわりと力量差が激しく、特に自分と親しい数人が所謂初心者で、いつも3 or 4位になっていた。

経験を積むのがドミニオンで強くなる最もわかりやすい方法なのは百も承知だが、それにしたって知らないといけないことというのはある。 (ここで言う知らないといけないこととは「1Tに村購入はほぼ弱い」「属州残り4枚以下の時に5金出たらアクションより公領を買う」とかのレベルである)

初心者ではある彼らは「ドミニオン勝てないなー勝てるようになりたいなー」と興味自体は示してくれていたが、このままの状態が続くと、やがてドミニオンを嫌いになってしまうのではないか。 それはなんというかこう、嫌だ。 しかしだからと言ってナンタラマニアックスとかを一方的に渡すのも何か違う気がする。 そう考えて、ちょっとでもドミニオンを面白く感じてもらうために、未熟ながらも彼らを相手に実体験ベースで学んでもらう勉強会を提案し、実際に開催することにした。

勉強会でやったこと

勉強会の概要は以下の通り。

  • 初心者4人を招待
  • 意図的なサプライを6つ用意して4人にプレイしてもらう
    • それぞれにコンセプトや教訓めいたものがある
    • 一部、変則ルールを設けた
  • 試合前に1人にだけ「こうするといいよ」というヒントを教える
  • AuToはよほどの悪手を打たないかぎりは見てるだけ
  • 試合後にAuToが偉そうなことを言いながら感想戦

用意したサプライはだいたいこんな感じ。 (詳細は長くなるので、この記事では省略。いつか書くかも)

  • 村・鍛冶屋・玉座の間のみの変則サプライ
    • 鍛冶屋ステロで十分
  • 一般的に弱い or 輝く場面が極めて限定的なカード10種
    • 金ステロで十分
  • よろずや、大使館、商人ギルドなどのステロ強カード10種
    • 強いステロカードの強さを実感してもらうのが目的
  • 大使砲サプライ
  • ステロカード vs 玉座・執事・橋
    • 決まると気持ちいいコンボと、玉座玉座でアクションを増やせることの実体験
  • 冒険カード & イベントによる獲得メインのコンボサプライ
    • 当時、冒険サプライが多かったので対策ということで

前半と後半でステロ場とコンボ場を分けたのは、長丁場の勉強会にメリハリを付けるため。 昼過ぎから休憩を挟んで18-19時くらいまでかかる想定で、実際その通りになった。

勉強会当日に起きたこと

4戦目以外はだいたい当初の意図通りになり、ヒントを教えた人が勝った。

4戦目は大使砲が完成する前に終了。 これはサプライというか意図がよくなかった。 (4人戦と2人戦の違いを甘く見過ぎた……)

5戦目はヒントを教えなかった3人のうち1人が意図を見抜き、ヒントを教えた人よりも先に玉座・執事・橋を完成させる。 予想外ではあったが、コンボを決めた側が勝つ事自体は当初の意図通り。

勉強会後にどうなったか

4人のうち少なくとも2人は明らかに強くなっていた(というか純粋なステロ戦だと偶に負ける)。 1人は、勉強会後に自分でドミニオンを3パック購入するくらいにはハマっていた。 また「別の友人とやるときに勝てるようになった」とも言ってくれた。

定期的にネットで「どうやって初心者をドミニオンに誘い込むか」みたいな話題を見かける。 小規模ではあるが、この勉強会はその目的を達成できたと思う。 この方法が全ての初心者に通用するわけではないし、たぶんコスパも悪い(サプライ準備も当日もめっちゃ疲れた)が、なんだかんだいって自分も楽しかったので良しとする。

尻切れトンボな終わり方ではあるが、うだうだしてると年が変わってしまうので、よいお年を。


サプライ作成の際に多くの助言をくださった @r_kuzumi@mmhiyoko にお礼申し上げます。

Valgrindのエラーメッセージだけを出力したい

最近、プライベートではなぜかCを書くことが多くて、その過程で今更ながらValgrindを使うようになった。

で、使っているうちにValgrindのエラーメッセージだけを表示したくなったので、そのやり方をメモ。 環境は以下のとおり。

一応明記しておくと、Valgrindのバージョンは3.10.0。 シェルはbashなので、それ以外のシェルの場合は適宜読み替えるように。

ネタバレ

--log-fdオプションとリダイレクトを組み合わせればいい。

Valgrindの使い方

例えば以下のCコードsample.cを考える。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
  puts("hello");
  malloc(42); // 特に意味もなく malloc して……
  fputs("goodby\n", stderr);
  return 0;   // free せずに終了
}

もちろんこのコードはコンパイルして実行することができる。

$ cc -Wall -g sample.c && ./a.out
hello  # 標準出力
goodby # 標準エラー出力

しかし、sample.cは6行目で(無意味に)mallocした領域を解放せずにプログラムを終了している。

Valgrindを介して実行すると、このようなメモリリークを検出できる。 --leak-check=fullオプションを付けると、メモリリーク箇所の詳細な情報もわかる

$ valgrind --leak-check=full ./a.out
==6865== Memcheck, a memory error detector
==6865== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==6865== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==6865== Command: ./a.out
==6865==
hello
goodby
==6865==
==6865== HEAP SUMMARY:
==6865==     in use at exit: 42 bytes in 1 blocks
==6865==   total heap usage: 1 allocs, 0 frees, 42 bytes allocated
==6865==
==6865== 42 bytes in 1 blocks are definitely lost in loss record 1 of 1
==6865==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==6865==    by 0x400614: main (sample.c:6)
==6865==
==6865== LEAK SUMMARY:
==6865==    definitely lost: 42 bytes in 1 blocks
==6865==    indirectly lost: 0 bytes in 0 blocks
==6865==      possibly lost: 0 bytes in 0 blocks
==6865==    still reachable: 0 bytes in 0 blocks
==6865==         suppressed: 0 bytes in 0 blocks
==6865==
==6865== For counts of detected and suppressed errors, rerun with: -v
==6865== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

definitely lost≒メモリリークしていると思えばいい。 今回はデバッグフラグを付けてコンパイルしているので、mallocした場所(sample.c:6)まで出力されている。

-qオプションをつけるとエラーメッセージのみが出力される。

$ valgrind -q --leak-check=full ./a.out
hello
goodby
==7135== 42 bytes in 1 blocks are definitely lost in loss record 1 of 1
==7135==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7135==    by 0x400614: main (sample.c:6)
==7135==

Valgrind自体は他にも色んな用途があるようだが、ここではとりあえずメモリリーク検出ツールとして扱う。

やりたいこと

makeスクリプトでまとめてチェックするような場合、「プログラム自体の出力を全て抑制して」「Valgrindの出すエラー報告だけを表示」したくなる。 つまり以下のsimple_leak_checkコマンドが欲しい。

$ simple_leak_check ./a.out # hello も goodby も出力しない
==7135== 42 bytes in 1 blocks are definitely lost in loss record 1 of 1
==7135==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7135==    by 0x400614: main (sample.c:6)
==7135==

「Valgrindのエラー報告だけ」という部分は、先述のValgrindの-qオプションで解決済みなので、問題は前者である。

試した方法

ダメな方法: 単純なリダイレクト

Valgrindのメッセージは標準エラー出力に出力されるので、標準出力を/dev/nullにリダイレクトすればいい……とはいかない。 これだとsample.cの7行目のような、プログラム中の標準エラー出力への出力が混じってしまう。

$ valgrind -q --leak-check=full ./a.out >/dev/null
goodby   # <- ./a.out 中の stderr への出力
==7613== 42 bytes in 1 blocks are definitely lost in loss record 1 of 1
==7613==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7613==    by 0x400614: main (sample.c:6)
==7613==

「メモリチェックしたいプログラムが出力するのがおかしい」と言いたくもなるが、この時チェックしていたのは自作のテストフレームワークという、本質的に出力も込みのプログラムだったので、なんとかしたいところ。

一応大丈夫な方法: --log-fileオプションの使用

Valgrindのメッセージをファイルに出す方法がある筈と思って調べたら、--log-fileオプションがあった。 標準出力と標準エラー出力を両方共/dev/nullへリダイレクトし、Valgrindのエラーメッセージは適当なファイルへリダイレクトしてから、後で表示すればよい。

$ valgrind -q --leak-check=full ./a.out \
> --log-file=/tmp/log.txt \ # Valgrind の出力をファイルに一時保存
> >/dev/null 2>/dev/nul     # プログラム自体の出力は投げ捨てる
$ cat /tmp/log.txt          # 終了後に、保存しておいた出力を表示
==8057== 42 bytes in 1 blocks are definitely lost in loss record 1 of 1
==8057==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8057==    by 0x400614: main (sample.c:6)
==8057==

一応できた。

でもこの方法の何がイケてないって、/tmp/log.txtを作ってるのがイケてない。 別にパフォーマンス云々やディスク云々を気にするわけではないが、なんか腑に落ちない。 もうちょっとスマートにできないか。

腑に落ちた方法: --log-fdオプションの使用

ヘルプを眺めてたら、--log-file オプションのすぐ近くに --log-fd オプションがあることに気づく。 以下、抜粋。

$ valgrind --help
  (中略)
    --log-fd=<number>         log messages to file descriptor [2=stderr]

--log-file がファイル名を指定するのに対して、--log-fd はファイルディスクリプタの番号を直接指定する。 最初は「なんだそりゃ」と思ったが、これとリダイレクトを組み合わせれば、中間ファイルを使わずに目的を達成できる。

$ valgrind --log-fd=3 \  # Valgrind の出力をファイルディスクリプタ3番に
> -q --leak-check=full ./a.out 3>&2 \
> 3>&2 \                 # 3番を標準エラー出力に向ける
> >/dev/null 2>/dev/null # プログラム自体の出力は投げ捨てる
==8729== 42 bytes in 1 blocks are definitely lost in loss record 1 of 1
==8729==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8729==    by 0x400614: main (sample.c:6)
==8729==

今度こそできた!

ここではファイルディスクリプタは3を使っているが、3以上ならなんでもいい(はず)。 1つ落とし穴があり、--log-fdは実行するプログラム(ここでは./a.out)よりも前に置かないと、何故か無視される。解せぬ。

オマケ: --error-exitcodeオプション

デフォルトではValgrindの終了ステータスはエラーの有無に関係なく0となっている。 これではスクリプトで処理するときに何かと不便だが、--error-exitcodeオプションで、メモリリークを1つ以上検出した際の終了ステータスを指定できる。

というわけで、目標だったsimple_leak_checkコマンドは次のようになる。

alias simple_leak_check=
'valgrind --log-fd=3 -q --leak-check=full\
3>&2 >/dev/null 2>/dev/null'

まとめ

Valgrindのエラーメッセージのみを出力する方法を述べた。

正直、--log-fileオプションで中間ファイルを生成する方法でもいい気がするが、一生使う機会が無いと思っていた「3以上のファイルディスクリプタを使ったリダイレクト」が役に立つ形で使えたので、つい記事にまでしてしまった。

というか--log-fdオプションのこれ以外の用途が思いつかないけど、何かあるのかしら。


ちなみに上のsample.cは、コンパイル時に-O2オプションを付けるとmalloc呼出し自体が最適化によって削除される可能性があるので注意(?)*1

*1:手元のClang 3.6では、最適化後のアセンブリを覗いたら無くなってた

【ドミニオン】Adventure初体験

知人がドミニオンAdventure(英語版)を入手したので遊んでみた。

うろ覚えな対戦ログ

イベントはとりあえず3枚入れてみた(あとで調べたら2枚が推奨だったらしい)。 使ったカードやイベントはうろ覚えなので覚えている分だけ。

あと1・2戦目がタイマンで、3・4戦目は3人戦。

1戦目

  • サプライ: Raze, Ranger, Miser, Magpie, Messanger, Duplicate, Wine Merchant, Relic, Tresure Trove, Artifacer
  • イベント: Plan, Seaway, Pathfinding

Magpie楽しい。 こちらのMagpieは運良く財宝カードばかりをめくってくれた上に、Pathfindingで+1 cardトークンを乗せたら更に加速した。 途中でArtifacerを入れ、最終的にはArtifacerで8枚捨てて属州を獲得した上で、8金で属州を購入できるデッキになり勝利。 相手はMessagerに廃棄トークンを載せた上で、Messangerで呪いを獲得してばら撒く手に出るが、そこまで強くは無さそうだった(一応、あまったMessangerはRazeの餌にはなっていたが……)。

枚数が多いという理由でMagpieに+1 cardトークンを付けたが、Artifacerの方がよかったかもしれない。 Relicさえ無ければ、ArtifacerはArtifacerを簡単に増やせるし、ドローし続ければ属州が確定で獲得できるし。

あとRelicがなかなかえげつない。 アクション回数を無視して2金出しつつ、相手を足止めをするアタック……って文面に起こすとかなり強いんじゃないですか。

2戦目

ここからサプライがうろ覚え。

  • サプライ: Page, Peasant, Gear, Amulet, Port, Giant
  • イベント: Training

PageやPersantの旅人カードがどの程度強いのかは気になるが、どう見てもGearステロが強すぎる……と思ったらGiantで出てきて完全に話が変わる。 PortはChampionを撃つまでのコンボパーツにもGiantに対する壁にもなるし、Amuletで軽圧縮も可能。 結局2人ともChampionを目指しつつ、Giantをできるだけたくさん撃つコースを狙う。

結果的には2人ともChampionまで育つが、TrainingされたGiantを2回毎ターンプレイできる体制を先に整えられて負け。 Championまで育つ前にGiantで3回くらいで呪いを撒かれたのが辛かったが、そもそもデッキ構築がダメダメだった気がする。

3戦目

  • サプライ: Guide, Magpie, Wine Merchant, Relic, Tresure Trove
  • イベント: Borrow, Inheritance

Magpie、再び。 相変わらず相性が良いRelicに加え、今回はInheritanceが強力なサポートになりそう。 1戦目に試せなかったTresure Troveとの相性も気になるところ。

初手は5金スタートだったのでWine Merchantを入れる。 Relicと悩んだが、銅貨2枚とWine Merchantが揃えば、Borrowを使ってInheritanceを発動できるため。 さっそく3Tに6金 + BorrowでMagpieに屋敷トークンを置くことに成功。 これで事実上、4T目から屋敷3枚を圧縮してMagpieに入れ替わる。

その後は、RelicとTresure Troveを追加し、Magpieを増殖させながら屋敷を購入していく。 特にWine Merchantは+1 buyが屋敷増量に役立った(屋敷追加くらいなら大体2コインは余るので、酒場マットに送らずにすむ)。

そのまま順調に属州と屋敷を買うプレイで圧勝。 効果が公開された時からやばいやばいと思っていたInheritanceだったが、今回のような環境では案の定のぶっ壊れだった。

あとこのゲームは3人中Relicに行かなかった1人が完全に死んでいたのが印象深かった。 4枚にされた手札をGuideで復帰させようとしていたが、Guideを使うタイミングでは大抵-1 cardトークンが乗っているという。

4戦目

  • サプライ: Coin of the Realm, Gear, Lost City, Swamp Hag
  • イベント: Trade, Pathfinding

1番手3-4なので、今度こそGear-Gearスタートでステロへ。 ただでさえ早いGearステロがTradeによってさらに強化され、Gearに行かなかった2人とは頭2つくらい抜けてリード。 早々に属州を買い始め、そのまま圧勝……かと思ったら甘かった。

2番手がCoin of the RealmとLost CityでSwamp Hagを並べるコンボを着々と組み立て、呪いを受け取らざるを得なくなる。 Swamp Hagを2枚並べられたターンにTradeで呪いを銀に換えたり、PathfindingでGearを強化したりでお茶を濁してみたが、最終的には毎ターンSwamp Hagが3枚持続する体制を整えられ、1点差で捲くられる。

Gearをもう1枚入れてもよかったのかもしれないが、そもそもSwamp Hagコンボを舐めすぎていた。 これがAdventureの世界か。

感想

プレイ中は終始こんな感じだった。

TLでよく見かける「Adventureはパーティゲーだ」というは、なんとなく理解できた。 でも個人的には面白かったのでこれはこれでいいかな、と。

ただ「ルールを順守したプレイ」はこれまでよりも明らかに難しい。 もし来年日本選手権があってレギュレーションに冒険があったら、イベントとトークンの誤処理が大量発生してジャッジが過労死するんじゃないかなって。

【Ruby】OS XでDigest::MD5を使おうとすると「Symbol not found: _rb_Digest_MD5_Finish (LoadError)」なるエラーが出る問題

週末に久々に会った友人から「お前アナログゲーム以外のこともブログに書けよ」って言われたので、メモ代わりに最近が自分が嵌った落とし穴について。 YosemiteRuby 2.2を入れたところ、MD5を扱う標準ライブラリのDigest::MD5が使えなくて困った。

発生した問題

例えばこんな感じでRubyをインストールする。

$ rbenv install 2.2.1 # rbenvでCRuby 2.2.1をインストール
$ rbenv local 2.2.1   # 現在のディレクトリで2.2.1を使用

で、digest/md5requireすると……

$ ruby -e 'require "digest/md5"'
/Users/autopp/.rbenv/versions/2.2.1/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in
`require': dlopen(/Users/autopp/.rbenv/versions/2.2.1/lib/ruby/2.2.0/x86_64-darwin14/digest/md5.bundle,
9): Symbol not found: _rb_Digest_MD5_Finish (LoadError)
  Referenced from:
/Users/autopp/.rbenv/versions/2.2.1/lib/ruby/2.2.0/x86_64-darwin14/digest/md5.bundle
  Expected in: flat namespace
 in /Users/autopp/.rbenv/versions/2.2.1/lib/ruby/2.2.0/x86_64-darwin14/digest/md5.bundle
- /Users/autopp/.rbenv/versions/2.2.1/lib/ruby/2.2.0/x86_64-darwin14/digest/md5.bundle
from /Users/autopp/.rbenv/versions/2.2.1/lib/ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in
`require'
from -e:1:in `<main>'

あまり目にしない例外を吐いて死ぬ。 ここではrbenvを使っているが、恐らく他のツール野良ビルドでも発生する。 またRubyのバージョンは2.1でも発生することを確認している。

Digest::MD5はまあ色んな所で使われていて、例えばbundler/setupなんかも使えなくなってしまうため、これは無視できない問題である。

解決策

先ほどのエラーログではCのdlopenのエラー出力らしきものが含まれていることから「たぶんRuby自体のインストールに問題があったんだろうな」というところまでは検討が付くが、思い当たる節は特に無い。

ひたすらクエスチョンマークを頭から垂れ流しながらググっていてたら、次のstackoverflowの質問に行き着いた。

Mountain Lion - Rails - Symbol not found: _rb_Digest_MD5_Finish (LoadError)

これのアンサーによると、Mac OSRubyをインストールする時に環境変数C_INCLUDE_PATHが設定されているとマズイらしい。 なんじゃそりゃと思うような、まあそんなこともあるかと思うような……

手元の環境で確認してみると確かに定義されている。

$ if [[ $C_INCLUDE_PATH ]]; then echo yes; fi
yes

Rubyのインストール時にこの環境変数がセットされてさえいなければいいらしいので、以下の手順で再インストールすればよい。

$ rbenv uninstall 2.2.1 # 一度アンインストールして
$ unset C_INCLUDE_PATH  # 環境変数を一時的に削除して
$ rbenv install 2.2.1   # 再インストール

改めてdigest/md5requireしてみる。

$ rbenv local 2.2.1
$ ruby -e 'require "digest/md5"; puts "OK"'
OK

OK。

この問題、踏むと致命的なわりにはあまり情報が出てこなかった。 そもそもC_INCLUDE_PATHは普通はセットしないので、踏んだ人も少ないのだろうと推測(gccclangなら-Iオプションで十分なはず)。 正直なところ自分もいつC_INCLUDE_PATHなんかを設定したのか覚えが無いが、たぶん昔何かの都合で.bashrcに書いたのがずっと残っていたのだろう。


なんにせよアナログゲーム以外の記事も書いたので、友人(非エンジニア)の不満も解消できただろう。 これで次はアナログゲームの記事が書ける。

第5回ドミニオン日本選手権に参加しました(後編)

前回のあらすじ:ドミニオンのプレイ回数が4回ふえるよ! やったねたえちゃん!

ということで前編の続き。

決勝が始まるまで考えてた/やっていたこと

正直、前日の予選を突破できる思っていなかったので、2日目は強い人と戦って勉強するくらいのつもりだった。 ただ、それだけだと流石に張り合いが無いので、4戦中1勝することを目標にした。

ちなみに「試験の日の朝に教科書を読んでる学生」の如く、試合直前までドミニオンラーニングを読んでいたが、大沖イラストのパン屋や行商人ちゃんがかわいいせいであまり頭に入らなかった。 きっとこうなることを考えて大沖イラストを採用している木ドミこわい。

試合備忘録

サプライはそれぞれの対戦毎にエクスパンションを固定した上で、スタッフが(たぶんその場で適当に)考えた組み合わせを発表するという形式だった。

スタッフ「サプライは事前に決めてると言いましたが、あれは嘘です
参加者「えー(爆笑)

1回戦

  • サプライ(基本・海辺): 玉座の間 魔女 木こり 工房 冒険者 巾着切り 真珠採り 宝物庫 灯台 引揚水夫
  • 2番手
  • 初手: 灯台-巾着切り

サプライがホワイトボードに書かれていく時の様子。

スタッフ「魔女」
参加者「ああああぁ……」
スタッフ「巾着切り」
参加者「うわああああぁ……」
スタッフ「灯台」
参加者「うおおおおおおお!!!!!!

いきなり荒れ場。 灯台が出てきた時の会場の盛り上がりがすごかった。

幸い初手は全員3-4だったので、みんななかよく灯台-巾着切りスタート。 巾着切りが横行し、全員なかなか5金が出ず、3・4Tは引揚水夫と灯台を補充。 (たしか)デッキ3巡目で出た5金は魔女にするか少し迷ったが、既にみんな灯台を構えている状態なのと、巾着切りのガードになるのを期待して宝物庫を購入。 その後も玉座や引揚水夫がいるので、アクション過剰でもなんとなると信じ、その後も巾着切り・宝物庫・引揚水夫・玉座の間を積んでいった。

転機が訪れたのは自分と似たようなデッキにしていた4番手が途中で魔女を挿してきた場面。 1枚ならと思い無視していたが、玉座魔女を撃ち始め、更に魔女をもう1枚入れてきた時点で「もう無視できない」とこちらも魔女を1枚購入。 今思うと「後追いは正しいのか?」と思わないでもないが、幸いこちらは玉座を多めに入れていたので、玉座魔女や玉座宝物庫からの魔女でなんとか4番手の呪い撒きに追いつく。

その後は巾着焼いて4金出したり、玉座引揚で呪い2枚を焼いたりしながら属州や公領を買い、(たしか)属州切れでゲームエンド。 結果は1点差でなんとか1位。 得点計算するまで誰が勝つのかわからなかった激戦だったのと、本戦1勝という目標を早くも達成できたので無駄にテンションが上ってしまった。 荒れ場で勝利点レースが始まるまでの宝物庫の強さを信じたのと「アクション被っても玉座と引揚水夫でなんとかする」という方針が上手くハマってなんとか回し切れた。

勝ったからというわけではないが、大会通して1番おもしろい試合だった。 初手以外の明確なルートが見えず*1、その場その場の判断でデッキを構築しないといけない展開が好きなのかもしれない。 そういうゲームは得てして荒れ場だけど……


最大の反省点は4人揃ってスタッフの試合開始の合図を聞き逃したところ。 4人で談笑していたらスタッフに怪訝な顔で「なにやってるんですか?」と言われて(ごめんなさい、なにもしてませんでした)、慌ててゲームを始めた始末。 人の話はちゃんと聞きましょう。

2回戦

  • サプライ(陰謀・繁栄): 中庭 執事 望楼 交易路 共謀者 改良 公爵 保管庫 鍛造 行商人ちゃん
  • 植民地・白金貨あり
  • 3番手
  • 初手: 保管庫-中庭

行商人ちゃんかわいい。

自分含めて1・2・3番手が5-2スタート。前2人は改良-中庭スタートで、恐らく行商人ちゃんを売り飛ばして白金貨にするルートを狙ってる様子。 自分も行商人ちゃんを白金貨に改良するのを見ていたが、少し捻って、保管庫で6金を出して6金で行商人を確保する方向にしてみた(まずこの選択がアレな気がする)。 中庭が3Tに来れば3・4Tに確実に行商人ちゃんが手に入るという目論見。

一応、行商人ちゃんも改良も早く用意はできたが、3人揃って行商人ちゃんと改良が一向に揃わない。 「それ(行商人ちゃん)をすてるなんてとんでもない!」と言わんばかりに揃わない。 結局、執事から入った4番手も含め、みんなで普通に9金で白金貨を買う展開に。

自分は中盤でかなり致命的なプレイミスを犯したせいで、白金貨を手に入れるのが大幅に遅れる。 このミスで完全に取り乱し、結局植民地もほとんど買えずに4位転落。 外野で見ていた知り合いにも指摘されたが、鍛造入れればもっとマシだったかもしれないのに入れてないし、属州を入れるべきところで入れてないしで、本当にダメ。


そもそも行商人ちゃんを白金貨に改良しようとしていた3人が全員間違ってるんじゃね? という*2。 これたぶん執事 or 改良で軽圧縮しつつ、中庭 or 保管庫だけで財宝を買っていく方が速いんじゃね? という。

3回戦

  • サプライ(錬金術・収穫祭・ギルド): 村落 蝋燭職人 大学 賢者の石 収税吏 伝令官 再建 豊穣の角笛 弟子 肉屋
  • 4番手
  • 初手: 銀-収税吏

錬金・収穫祭が含まれている時点で「使い魔か!? 馬上荒れ試合か!?」と神経を尖らせていたが、意外と丸い。 というか肉屋が無難に強い。 そして無難に強いカードがある場で4番手という辛み。

1番手が再建-銀、2・3番手がどちらも銀-銀と来て考える。 少なくとも2・3番手は手堅い肉屋ステロにしか見えず、「もはや1位になるためには曲芸しかない」という思考で2Tに収税吏を選択。 一応考えていたのは、3Tに収税吏と銀を揃えて他人の銀を落とせば、金貨を獲得しつつ他家の4T肉屋購入を潰せるというロマン。 夢を見るのも大概だし、できたところでその先のビジョンも深く考えていなかった辺り悪手だったと思う*3

その後は肉屋の流れに乗っかるも、間に合わず3番手の方と3位タイ。 ざんねん! わたしのぼうけんはここでおわってしまった!

ちなみに1位のFerryさんは銀-銀から入って3・4Tの両方で肉屋を購入。 徳が高い。


2戦目後の取り乱しを引きずったまま収税吏スタートとかいうよくわからないことをしてしまったけど、15ptを準決勝進出ラインとみなすなら「2位以上を狙う手」でよかった気がしないでもない(1-4-2-1で15ptを狙う)*4。 そう考えると、後手番とは言えやっぱり銀-銀でよかった気がする。 それこそ3T・4T両方で肉屋を買える方が、収税吏で銀を指すよりもまだマシな気がする。

あるいは伝令官と角笛でアレな方向に行く手も考えられるが、ただでさえコンボ構築力が低い上に肉屋3人のスピードに追いつける気もしない(属州を肉屋で焼かれる未来が視える……)。 というか、伝令官と角笛で悪いことをして勝った人はどれくらい居たのかな。

4回戦

  • サプライ(異郷・暗黒時代): 救貧院 岐路 物置 城塞 ゴミあさり 武器庫 官吏 大使館 厩舎 農地
  • 避難所あり
  • 2番手
  • 初手: 武器庫-物置

全員が勝っても準決勝に進めない卓なので、開始前に「最後なのでまったりやりましょうw」と意気投合。 サプライを見る限りゴミあさり-銀からの大使館ステロが無難に強そう。 しかし、ここで疲れきった脳内に悪魔が囁く。

「デッキ引ききってから物置で捨てて、更に救貧院並べたら強いんじゃね?」

……まあ冷静に考えれば大使館相手に間に合うはずも無く、例え理論上できるとしてもコンボデッキ構築力皆無の自分には到底無理なのだが、大会の熱気にやられきっていた頭では「武器庫でワンチャン!」とか考えてた。 3金で物置を買ってるのは更に意味がわからない。 たぶん「被らなければ武器庫を使える回数増えるよ! やったねたえちゃん!」とか考えていた自分の頭をひっぱたきたい。

無難にゴミあさり-銀で入った3人が意外と遅かったため、それっぽいデッキを作るには作ったが、結局不発に終わって4位。 ところで1番手と4番手がゴミあさり-銀からの厩舎ステロに行ったけど、大使館と比べるとどうなんだろう?(というか他人の大使館で降ってくる銀貨を期待してたのに……)


更に余談。 終わったあとの r_kuzumi との会話。

AuTo「ゴミあさり-銀から大使館は、大使館2枚要るのかな? ゴミあさりで大使館を置くし……」
r_kuzumi「そもそもゴミあさりは邪魔だから農地で焼いて金貨にするもんでしょ」
AuTo「なるほど?」

完全に盲点だった。 状況に依るとは思うけど、結局このサプライの4-3スタートはどう展開するのが正しいのか?

結果

というわけで1-4-3タイ-4の大会勝利点6.5点で敗退。 こうやって見ると1回戦の勝利で燃え尽きてた感がある。 2戦目以降の結果は自分の弱さが露呈しただけなので、ある意味納得の結果?

感想

ドミニオンに限らずゲームの大会的なのに参加したのは今回が初めてだったが、ポイントが付くと張り合いがあっておもしろい。 2日目のサプライ公開時の会場の盛り上がりとかの、普段は味わえないお祭り感覚も存分に楽しめた。 あとネットやなんとかマニアックスとかいう本でしか見ることが出来ない人達と戦ったり、生で試合を見たりできたのもよかった。 特に準決勝・決勝はゲーム自体はもちろんだが、サプライ決めの苦悩や駆け引きも見てて楽しかったし、とても勉強になった。

ところで大会終わった後は「楽しかったけど、練習も含めて散々ドミニオンをやったし、しばらくはいいかな」とか考えていた。 それなのにこの1週間は今まで以上にgokoにログインしたり、大会サプライで反省会をしたりと、ますますドミニオン漬けになってるのがおもしろい。 というかもっとこの記事早く書くつもりだったのに、書いてる途中でドミニオンやりたくなってgokoに行ったりしてたせいで、こんなに遅くなった。 いい意味で刺激になってる……のかな?

なんか「楽しかった」と「おもしろかった」しか書いてなくて頭悪い感想になってるけど、本当にその二言に尽きる濃厚な2日間だった。 今回は「予選突破 + 全体で2勝」という結果だったので、もし来年もあるとしたら「予選突破 + 全体で3勝」あたりが目標にしたい。

*1:見えてた人いたら教えてほしい。

*2:これのせいで同卓だったみなせさんはこの時点ではコンボの人なのかと思ってました

*3:結局、収税吏は4Tに来たのでアウト。

*4:結果的には15pt準決勝進出は確か0人か1人だったが