マルコフ連鎖でデュエマの能力テキストを作る
この記事は KMC Advent Calendar 2020 第22日目の記事です。昨日の記事はAotsukiさんの「Zoom授業録画自動化した話」ですが、まだ書かれていません。
皆さんごきげんよう。デュエプレの無料10連で5枚目のガルバロスが出ました、tronです。これで5弾のパックから出たSRのうち62.5%がガルバロスなんですが、何かデュエプレに嫌われるようなことでもしましたか?
持ってる5弾SR。デスフェニはイベント報酬でスターマンのうち1枚は生成。
さて、今回はデュエマはデュエマでも紙の方です。
やったこと
マルコフ連鎖を使ってデュエマの能力テキストを作った。
本当はカードの全情報(コストとか種族とか……)について、それぞれ関連付けて生成したりしたかったけど、初心者がいきなりやるのは難しそうなので……
使ったもの
プログラム
Learn from aozora bunko and output markov chain · GitHub
[Python] MeCab とマルコフ連鎖ライブラリ markovify を使い、文章を学習して自動生成する方法 - Qiita
このへんを参考にして書きました。気をつけた点として、
- 形態素解析は1行ずつ行う
- 「。」で文を区切らない
があります。これは元カード1枚のテキストごとに1文として認識させるため。そうすることで生成したものも複数の能力を持った、「1枚のカードのテキスト」になるというのを狙ってます。
学習データ
デュエマ(紙版)で殿堂入りしているカードの能力テキスト。出典はデュエマWiki。
これを1枚につき1行に収めて、コンマで区切ってあります。
ドラグハートやツインパクトなどの複数のカードが1枚になっているタイプのものは、それぞれ分けました。
結果
state_sizeごとに結果をいくらか貼ってみます。
state_size=2
- 自分のターン中に他の「S・トリガー,自分は、コマンド、イニシャルズ、あるいは名前に《禁断》とあるクリーチャーであれば、自分の墓地に置くかわりに持ち主の墓地に置く。その後、山札をシャッフルする。,
- シンパシー:自分のクリーチャーをバトルゾーンを離れる時、かわりにこのクリーチャーがバトルゾーンに出た時、そのクリーチャーは相手のマナゾーンから召喚してもよい。,
- このターン、自分の墓地からマナゾーンに火のコスト3のクリーチャーとして合体させる。
- このクリーチャーが4枚を、マナゾーンに置く。,
- S・トリガー,自分の墓地から手札に加える。このターンのはじめに、バトルゾーンを離れるかわりに自分のクリーチャーを2体まで破壊する。,
state_size=3
- S・トリガー,自分のクリーチャー1体の上に置く。その後、相手はカードを1枚、自分の墓地からコストを支払わずにすぐ唱えてもよい。,W・ブレイカー,このクリーチャーがバトルゾーンを離れる時、自分の手札をすべて捨てさせる。,
- W・ブレイカー,自分の墓地からバトルゾーンに出た時、このD2フィールドを自分のマナゾーンから唱えてもよい。,
- パワー3000以上のクリーチャーは攻撃できない。,禁断機動:このクリーチャーがバトルゾーンにある自分のクリーチャーが攻撃する時、相手のシールドを1枚、自分のマナゾーンからバトルゾーンにある相手のクリーチャーを1体、自分の墓地から手札に戻す。,
- このクリーチャーがバトルゾーンにあるクリーチャーを1体、自分の墓地からバトルゾーンに出した時、自分のクリーチャー1体の上に置く。,このクリーチャーがバトルゾーンに出た時、自分の山札の一番下に置く。,
- ニンジャ・ストライク4,このクリーチャーがバトルゾーンを離れない。,このカードがバトルゾーンに出してもよい。,
state_size=4
- このウエポンをバトルゾーンに出した時、自分のマナゾーンにあるカードをすべてアンタップする。,
- この呪文を自分のマナゾーンから墓地に置く。,
- S・トリガー,クリーチャーを1体、自分のマナゾーンからバトルゾーンに出す。それ以外なら山札の一番下に置いてもよい。,
- G・ゼロ-自分の墓地に置かれる。,
- 自分のシールドをひとつ相手に選ばせ、見る。その中から多色クリーチャーを1体、破壊する。,
state_size=5
- S・トリガー,自分のクリーチャーすべてに「スピードアタッカー」を得、種族にガイアール・コマンド・ドラゴンを追加する。,
- カードを2枚まで、自分の墓地からコストを支払わずに召喚してもよい。,
- コスト7以下の呪文を1枚、自分の手札に戻す。,
- S・トリガー,クリーチャーを1体選び、相手に見せてから自分の手札に戻してもよい。,
- この呪文を自分のマナゾーンから、コストを支払わずに唱えてもよい。,
state_size=6
- S・トリガー,自分のクリーチャーを1体破壊してもよい。そうしたら、相手のクリーチャーをすべてタップする。,
- バトルゾーンにある自分の闇のクリーチャー1体の上に置く。,W・ブレイカー,
- このクリーチャーをバトルゾーンに出した時、そのターン、自分のクリーチャーすべてに「スピードアタッカー」を与える。,
- このクリーチャーがバトルゾーンに出た時、自分の手札を1枚山札の一番下に戻す。,
- コスト7以下の呪文を1枚、自分の墓地から手札に戻してもよい。,
state_size=7
- S・トリガー,クリーチャーを1体選び、持ち主の手札に戻してもよい。,バトルゾーンにあるクリーチャーを1体選び、持ち主の手札に戻す。,
- このウエポンをバトルゾーンに出した時、クリーチャーを1体、自分の墓地からバトルゾーンに出す。,
- このウエポンをバトルゾーンに出した時、クリーチャーを1体、自分の墓地から手札に戻してもよい。,
- S・トリガー,クリーチャーを1体選び、持ち主の手札に戻してもよい。,W・ブレイカー,
- このウエポンをバトルゾーンに出した時、クリーチャーを1体、自分の墓地からバトルゾーンに出す。,
どうでしょうか。最初のうちはかなり怪しいテキストですが、サイズを上げるごとに安定してきます。一番安定してるのは6ですね。7は完全に固定されてしまって、面白さが皆無になっています。
傑作選
最後に、できたテキストの中から良かったものをいくつか紹介。なお、この先のテキストは適宜見やすく修正しています。
まずはstate_size=6から。
- 自分のターンのはじめに、相手はカードを1枚、自分自身のマナゾーンから選び、持ち主の手札に戻してもよい。
- W・ブレイカー
よっぽどコスト低くないと使いたくないな。
- 自分のマナゾーンに火のカードがあれば、カードを1枚引いて、自分の手札を1枚、自分のマナゾーンに置く。
火に反応してマナブーストする効果、珍しくない?
ちょっとおとなしい気がするので、ここからはstate_size=4。
- カードの名前をひとつ選んで言う。その後、自分の手札をすべて捨てる。
言うだけ。何も嬉しくない……
- W・ブレイカー
- このクリーチャーがバトルゾーンを離れる時、自分の山札の上から3枚をすべてのプレイヤーに見せてもよい。
見せるだけ。そんなに辛くはないけど嬉しくもない。
- 相手のクリーチャーを2体まで破壊する。
- このクリーチャーがバトルゾーンを離れる時、バトルゾーンを離れるかわりにとどまる。
- W・ブレイカー
- このクリーチャーが攻撃する時、自然のクリーチャーをすべて、自分の墓地からマナゾーンに置く。
最初のはcipかな?ちぐはぐ感はあるけどこれまでのと比べると悪くない。
- 自分の山札の上から5枚を、マナゾーンに置く。その後、クリーチャーを1体、自分の墓地からマナゾーンに置く。
6マナブースト。コストによっては強そう。
- G・ゼロ-バトルゾーンに自分のサイバーロードがあれば、カードを1枚引く。その後、自分のマナゾーンのカードを5枚、墓地に置く。
サイバーロードと一緒に使ってはいけないカード。
state_size=4はやっぱりまだ文に怪しい部分があって、それっぽいのを探し出すのが大変でした。ただ、面白さではstate_size=6より上だと思ってます。
まとめ
というわけでデュエマのカードテキストでマルコフ連鎖してみました。ゆくゆくは最初に言ったような、カード全体を生成するプログラムまで進めたいですね。
明日はtak0kadaさんの記事です。お楽しみに。