見出し画像

Shadowverseにおける「棋譜」の導入可能性と試作

初めまして。wagasode(@origin_seeker)と申します。

本記事は、Toby(@toby_24ss)さん主催のShadowverse Advent Calendar 2021の21日・昼の部の記事です。

カレンダー(昼の部・夜の部)↓

前日夜に投稿されたのなさん(@noname_tan)の記事↓(必見!

また、自分と同じタイミングで、ぜろでんさん(@verse_splaDEN)の記事「平成JUMP!〜もし彼らが令和Shadowverseに帰ってきたら〜」が投稿されていると思います。(要チェックだ!)

本記事の要旨

シャドバでは、ゲーム内リプレイ機能を利用することで過去30戦までの対戦記録を振り返ることができる。しかし個人的に、シャドバの上達を目指す上で現状のリプレイ機能に不満な点があった。そこで、将棋などにおける「棋譜」を参考に、シャドバの「対戦記録」をそれっぽい独自の規格に落とし込むことを試みた。結果、謎の暗号文が出来上がってしまった。

初めに

シャドバを上手くなるために「リプレイを見直して反省する」ことが重要なのは言うまでもないが、リプレイを振り返るのって結構めんどくさい。

  • 特定のターンだけ見直したい場合であっても、1ターン目から見返す必要がある。

  • 早送り機能はあるけれど、ターン切り替わり時に元の速度に戻ってしまうのでポチポチするのがしんどい。

個人的には「欲しい情報を得るために掛かる時間と工程がまあまあ多い」と感じている。

常識的なwagasode
「手間と言っても数十秒〜数分で済む作業だし、めんどくさがってるのって結局本気で上手くなろうと思えてない向上心の低さの裏返しなのでは?」

という至極もっともな意見はあると思われるが

横着なwagasode
「リプレイを一々見返すのは面倒。リプレイと同じ量の情報を内包しつつ、パッと一瞥しただけで得たい情報にアクセスできるような表現形式があれば…」

という欲望も捨てきれない訳である。

棋譜からの着想

記録の表現形式」として、真っ先に思い付くものと言えばやはり棋譜である。
棋譜の定義を引用すると、

囲碁・将棋・チェスなどのボードゲームにおいて、互いの対局者が行った手を順番に記入した記録を指す。また同時に、棋譜が記入された用紙(つまり棋譜用紙)を意味する場合もある。

Wikipedia

とのこと。(将棋のみを指すと思っていたけど、囲碁やチェスでも用いる用語なんだね)
ネットで拾った適当な棋譜↓

筆者は将棋経験0な為、この譜面を見て脳内でリプレイを再生することは全くできないが、十分に将棋に精通しているプレイヤーであれば再生可能だと思われる。

また、棋譜には「ある時点の盤面」が付属されている場合も多い。

試合を再現するための情報としては文字と記号で十分ではあるのだが、「脳内で試合をイメージするため」の補助としてグラフィカルな情報を追加しているのだと考えられる。

近年はAI将棋の発展もあり、棋譜とグラフィカルな盤面を連動して表示できるGUIの普及も進んでいるようだ。このようなGUIはある意味、シャドバにおけるリプレイと同等のものと捉えられる。

本記事は「このような棋譜という記録形式をシャドバにも導入できればな」という願望のもと、それっぽい何かを作成していく。

ver0.1:まずは叩き台を作る

頭で考えているだけでは具体的なイメージが沸きづらいので、叩き台として「リプレイを文字に起こしただけのもの」をExcelにて作成したのが以下。
(試合としては、RAGE 2021 Summer 決勝 第4試合 Shimon(ラスワNc) vs kendama(AFNm) https://www.youtube.com/watch?v=r2rc3s-Q3FQ を勝手ながら採用させて頂きました。ギガスターンを書き起こすとどうなるのか見てみたかった。)

最左列にターン数、2,3列目を各プレイヤーに割り当て、プレイ内容を順番に書き連ねた。(カードの名称については「イーター」「メカニック」などの略名を使用)

よいところ

  1. 試合内容が一意に再現されている。(プレイしたカードとその順番、選択の対象、ランダム効果の当たり先、などの情報)

  2. 試合中にプレイしたカードを簡単に知ることができる。今回であれば「ラスワNc側が2ターン目にオミナス結晶をプレイした事」「AFNm側が5ターン目にギガスをプレイした事」など。

1の再現の一意性は、棋譜を作成する上で最低限の要件であると考えている。同じ棋譜からは必ず、同じゲーム内容が再現されるべきである。
2はキーカードの有無の把握が容易い事を述べている。「最速でアリアをプレイしたか否か」「2Tに託宣をプレイしたか否か」「後手4ラミエルしたか否か」などの情報はゲームを振り返る上で重要なものの一つである。例としては、大量の棋譜が目の前にある場合に、「アリアをプレイしなかったけど勝てた試合」の棋譜のみに絞って内容を振り返り分析することでアリアを引けない試合の勝ち方を学習する、といった利用法が可能になる。

わるいところ

  1. 手作業なので、作成に時間が掛かりすぎる。(リプレイを見て、プレイしたカードを確認して、画面を停止して、記譜に書き込んで、画面を再生して…を繰り返す)

  2. その時その時の手札内容、リーダーの体力、フォロワーのスタッツなどに関しては、ログを丁寧に追っていかないと把握できない場合がある。

1は作成コスト、2は判読性に関する課題である。
作成コストに関しては、究極的には物体検出などのプログラミング技術によって解決できると妄想しているものの、筆者に十分な技術力が無いため現状は手作業で作成する他ない。そこで次節では、その手間を削減する方法として「記号化」の導入を考える。
また判読性に関しては、手作業である以上「作成コスト」とのトレードオフであると考えている。例として「ターン開始時の手札内容の把握」に関して言及すると、

  • 判読性の観点からは、逐一棋譜に記述されていることが望ましい。実際には「全ドローカード」から「それまでにプレイした全カード」を引き算すれば把握できる情報であるものの、それを一発で把握することは困難である為。

  • 作成コストの観点からは、コスト増大を引き起こす要因であるため記述しないべきである。あくまで重複した情報である為。

理想的には様々な判読レベルの棋譜を作成し、棋譜の用途によって使い分けるべきであると考えられる。とはいえ自動作成技術が達成されない限りは作成コストの鬼すぎて、論外。

ver0.2:カード名を記号化する

この節では「棋譜の記号化」に関して言及する。
記号化という言葉は本記事で勝手に使っている言葉であるが、「カードの名称や特定のアクションをそのまま表記せず、簡略化したもので表記する」ことを指すものとする。
例えば、先ほど示した叩き台の棋譜でも既に

「ナイトメアイーター」を「イーター」と略記
「アーティファクトの同調」を「同調」と略記

などとしていたが、これを更に「アルファベット数文字程度」で表現することを考える。

「イーター」を「Ea」と略記(Eaterの頭文字2文字)
「同調」を「Tu」と略記(Tuningの頭文字2文字)

このような記号化を行うことで、殆どのカードをアルファベット数文字で表現することができ、作成コストの削減が可能となる。(タイピング数がめちゃめちゃ減る)

ただし、このような記号化につきものなのが対応表の必要性とそれに伴う判読性の低下である。ここで対応表とは、どのカードをどの略称で記しているのかを示した表のことを指している↓

  • 基本的には英訳の頭文字2文字を略記として採用する。(今回は英語名を調べるのがめんどくさかったため単純な英訳を使用したが、命名規則の統一の観点からはたぶんあんまり良くない)

  • 名称が重複するカードがある場合には3文字目以降を、重複しなくなるまで採用する。(AnaとAncのような感じ)

といった規則で命名されている。
記号化された棋譜を閲覧し判読する場合、この対応表が脳に定着していること、または対応表を手元に置いておき、分からない略記に関しては辞書を引くかの如く調べながら読んでいく必要があるといったデメリットが存在する。
すなわち、作成コストを減らすことができる反面、対応表が脳に定着するまでの導入コストや、新カード追加などで対応表更新が必要になるなどの維持コストが発生してしまうことに留意する必要がある。

ver0.3:アクションを記号化する

続いて、更に作成コストを削減するために「ドローする」「攻撃する」といったアクションに関しても記号化を試みる

「ドロー」を「D」と略記
「攻撃する」を「A」と略記
「プレイする」を「P」と略記

アクションによっては対象の選択を伴う場合があるので、そのような事柄についても記号化する。

・「アクションの選択対象」を「:」の後ろに置く
例:「技師をドローする」→「D:技師」
・「アクションの2次的な選択対象」を「/」の後ろに置く
例:「技師でリーダーを攻撃する」→「A:技師/リーダー」
・「あるアクションに誘発して発生するアクションを「-」の後ろに置く
例:「アナライズでイーターを攻撃する、(ラストワードによって)シップをドローする」→「A:アナライズ/イーター-D:シップ」

このような記号化を行うことで、様々なアクションをわずかな記述により表現することができる。

度重なる記号化の末、判読性はかなり低くなった反面、非常にコンパクトな棋譜となった。以下で一部を抜粋しながら試し読みしてみる。(対応表が頭に入った、という方はぜひ一緒に解読してみてください!

一行目:Shimon選手のマリガン。再誕・再誕・オミナスをドローし、再誕・再誕・オミナスをキープ。
二行目:kendama選手のマリガン。技師・メカニック・ララミアをドローし、技師をキープ。スキャン・同調をドロー。

Shimon選手の6ターン目。記憶の軌跡をドロー。ボーンドミネーターをアクセラでプレイし、イーターをドロー。記憶の軌跡をプレイし、不死者と左から2番目のイーターを選択。トリモンをドロー。不死者を進化する。不死者と解放者と1~3番目のイーターでリーダーを攻撃。

kendama選手の7ターン目。技師がドローで燃える。メカニックをプレイし、(ギガスの効果で)ロボティクスとバハムートが燃える。シップをアクセラでプレイし、ロボティクスが燃える。アナライズで3番目のイーターを攻撃し、ミリアムが燃える。エンシェントとミスティックで2番目のイーターを攻撃する。スキャンをプレイし、エッジAFが加わる。エッジAFをプレイし、同調をドローする。エッジAFでイーターを攻撃する。シフトをプレイし、ブリッツAFをチョイス、技師をドローする。シフトをプレイし、ブリッツAFをチョイス、水銀の遮断をドローする。シフトをプレイし、ブリッツAFをチョイス、肉球シュートをドローする。1番目のブリッツAFを進化する。1~3番目のブリッツAFでリーダーを攻撃。バハムートをアクセラでプレイ。シフトをプレイし、ブリッツAFをチョイス、スピネをドローする。ブリッツAFでリーダーを攻撃する。

勝利!

終わりに:ver0.4以降に向けて

本記事の内容としてはここまでとなります。(つーかこれが限界)
お読みいただきありがとうございました。
記事の題として「棋譜の試作」と銘打ったものの、実際に出来上がったのは自己満ベースの謎暗号文ということになってしまい恐縮なばかりです。どなたか技術力と発想力に優れた御仁によってシャドバ棋譜の実現が成されるとよいなあ〜と願うばかりですが、最後に筆者が思う現状の課題を書き連ねていき、本記事の結びとしたいと思います。

GUI(盤面表示)機能

「判読性」の話には軽く触れましたが、文字だけの棋譜では当然脳内でのゲーム再現が困難です。真面目に棋譜の導入を考えるのであれば、棋譜データを読み込み、対応する盤面や手札を表示してくれるグラフィック機能の実装が欠かせないでしょう。とはいえ筆者には技術力が足りないので、頑張って勉強したいと思います。

「棋譜DB2」(https://shogidb2.com)における盤面表示。ボタンをクリックして試合を逐次進行していくことができる。

アドカレにもあった、tdTomatoさん(@tdTomato628
)のシャドバシュミレーター。凄すぎる。

棋譜DB2のような感じで、棋譜をシャドバシミュレーターに読み込ませて盤面を表示できる、といったイメージを妄想中。

棋譜の自動作成機能

手作業での棋譜作成は意味不明なほど非効率です。「効率よくシャドバを上達するため」の棋譜考案なので、手作業で棋譜を作るくらいならば大人しく普通にリプレイを見て振り返った方が圧倒的にコスパが良いと思っているので、やはりプログラムによる自動作成機能は必須でしょう。

シャドウバースのプログラムにアクセスしてゲーム情報を引き出す、といった行為は規約違反の危険性が高そう(だし、そもそもやり方を知らない)なので、リプレイ映像から棋譜を自動作成するには「画像認識」や「物体検出」といった技術を利用する必要がある気がします。

YOLOv4による物体検出。(ネットで適当に調べて出てきた奴)

当然筆者は無知なので妄想でしかありませんが、

シャドバのリプレイ画面を読み込む→物体検出技術によって何のカードがプレイされたとかが分かる→それをもとに棋譜が自動作成

みたいな。

アドカレ

本日21日・夜の部の記事は、とーふさん(@_koyadofu_momen)の「ありがとう清浄、さようなら清浄」になります。お楽しみに!

この記事が気に入ったらサポートをしてみませんか?