マジック×プログラム プログラミングチャレンジ 結果発表

7月末から8月にかけて募集した「Sekappyプログラミングチャレンジ」。全国から数多くのご応募を頂きました本イベントの、優秀作品を発表いたします!

マジック×ITの可能性を広げたい、そして何より多くのマジックプレイヤーであるエンジニアの方々にスキルを発揮していただきたい……という想いから実施した本イベント。ゴールデンウィークに開催した「Sekappyプログラミングコンテスト」を上回る数のご応募をいただきした。ご応募いただいた皆様、誠にありがとうございます。

※各課題の詳細はこちら

中でも、シールドデッキジェネレーターを作っていただく部門(3)では、遺伝的アルゴリズムを用いて最適なデッキを目指す独創的な作品をお寄せいただき、審査員一同、驚きとともに大絶賛となっておりました。

今回は、上述のシールドデッキジェネレーターをはじめ、特に優れた作品をお送りいただいた5名の方に賞品を進呈いたします。また、数名の方には、弊社より採用のオファーをお送りさせていただいております。

なお、Sekappyでは今後もプログラミングチャレンジを実施予定です。ご興味をお持ちの方は、ぜひ弊社のTwitterアカウント @SekappyOfficial をフォローいただき、続報をお待ち下さい。

それでは以下、優秀作品の発表です!

部門(3) 最優秀作品(1名)

部門(3)は、実務経験の有無を問わない課題として、カードプールからシールドデッキを構築するプログラムを製作いただきました。

こちらの部門で最優秀作品に輝いたのが、冒頭でもご紹介した遺伝的アルゴリズムを用いた意欲作!

「遺伝的アルゴリズムとは?」を一から解説すると非常に長くなってしまうため、そちらは専門サイトにお任せして、今回の受賞作品は以下のような手順でのデッキ生成を行っていました。

  1. 土地を除いたカードプールからランダムな枚数抽出されたスペルだけの束を大量に生成し、点数付けを行います。まだバランスは整っていません。これが原始的なデッキ――第一世代となります。
  2. 第一世代のうち、スコアの高かったデッキを半分ずつを掛け合わせたものを生成、ふたたび点数付けを行います。原則として、点数が低かったものは消去していきます。これによって、両親の良いところを受け継いだ優秀な第二世代が生まれます。
  3. 同様に、第二世代のうち優れたスコアのデッキ同士を掛け合わせ、さらに点数が高いデッキを作ります。
  4. この作業を100世代に渡って繰り返すことで、マナカーブや呪文の枚数比といったパラメータを最適化します。
  5. 数個組み上がったデッキの中から、完成度の上下を判定してデッキ完成!
  6. ※各世代において、ある束に存在した or しなかったカードが、存在する or しないように変更されて次の世代を作ります。「ちょっとカードパワーは低くてもいいから、サイズの大きいクリーチャーがもう1枚欲しいな~」といった場合の大型クリーチャーのように、”突然変異”で強デッキが生まれる可能性があるからです。

なるほど、おもしろい!!

……と、弊社スタッフ一同、たいへん感銘を受けました。お見事です! 製作者様には、賞品として《Volcanic Island(3rd)》[PLD]を進呈いたします!

なお、コードの審査とは別に、お送りいただいたプログラムを用いて実際に『基本セット2021』6パック分のカードプールからデッキを生成。構築されたデッキをBIG MAGICユニフォーム契約プレイヤーにしてSekappyきってのリミテッドフリーク・河浜 貴和が評価いたしました。

使用したカードプール

使用したカードプールはこちら(画像をクリックすると拡大します)。

河浜によるサンプルデッキ

河浜によるサンプルデッキはこちら(画像をクリックすると拡大します)。

制作者:30歳 男性

部門3:シールドデッキジェネレーター

部門3:シールドデッキジェネレーター(《Volcanic Island(3rd)》[PLD]プレゼント) 最優秀作品

※画像をクリックすると拡大します。

生成されたデッキ

生成されたデッキ(画像をクリックすると拡大します)

作品のアピールポイント

デッキ作成基準

  • 強いデッキを作成する
  • 強いデッキは次のように定義する
  • マナカーブが綺麗で、各ターンでアクションを行える
  • カードパワーの高いカードで構成されている
  • デッキ枚数を40枚に抑えてボムを引きやすいようにする
  • デッキの色が2色程度
  • カードパワーの高いカードを採用するために3色目以降をタッチすることも考える

デッキ構築とは

  • 限られたカードプールからいくつかカードを選択する行為
  • 今回はシールドなので90枚から23枚程度選ぶ
  • 組み合わせは 90 C 23 ≒ 10^21
  • 組み合わせを全て列挙し、前のページで定義した強いにより当てはまるデッキを探せば良い
  • ただ、組み合わせの数が多すぎるので現実的ではない
  • そのため遺伝的アルゴリズム(以降GAと略す)を利用して組み合わせの問題を解くことで、強いデッキを構築する

シールドデッキジェネレータのアイディア

  • デッキの強さを定義して
  • GAを利用して一番強いデッキを出力する

(中略)

展望

  • カード評価は自分の主観で行っている
  • 人のデッキ作成履歴からカード評価を自動生成したい
  • 強いデッキを作ろうとしているのだから、bot対戦などで勝率を出してそれを利用したい
  • カード評価だけではシナジーを評価しきれないので、カード同士のシナジー効果もデッキ評価に組み込みたい
  • GAパラメータのチューニングや強いデッキの定義が甘いのか、実行するたびに毛色の違うデッキが生成される
  • GAの過程を追いながら調整したい
  • 土地の選び方が雑(デッキが赤青であれば山9島8のように等分)
  • 土地の選び方をデッキ評価関数に入れたい

審査員の講評
遺伝的アルゴリズムを使った挑戦的なアプローチをとっており、今後の展望も期待できる作品でした。また複雑なアルゴリズムながらもソースコードはよく整理されていました。

河浜コメント
色がついている以外は基本上位互換である《引きずり鬼》ではなく《プリズマイト》であったり、シナジーのあるカードがデッキに1枚もない《猫の君主》など、チョイスに問題がある部分はありますが、このプールを渡されたときにするであろう色とカードの選択が大筋なされている印象です。ボム+除去というラインもきちんと確保できています。

また、他の応募作品もそれぞれ独自のデッキが構築される結果となりました。ここでは、いくつかの作品を、生成されたデッキおよびコメントとともにご紹介いたします。

制作者:31歳 男性

部門3:シールドデッキジェネレーター

生成されたデッキ

生成されたデッキ(画像をクリックすると拡大します)

作品のアピールポイント
強いデッキが作れるように、プログラム出来たと思います。

審査員の講評
強いデッキが出力されるような調整の跡は見受けられ、実際にデッキも強かったです。ただ実装にかなり力技な部分が見受けられ、効率や保守性に改善の余地がありそうです。

河浜コメント
まず気になるのは《チャンドラのマグムット》と《猫の君主》しかシナジーのない《鳥獣保護区》。
これが良い方向に作用するより、緑緑や赤赤のマナが出なくて困るシーンのほうが多そうです。これのためだけに《猫の君主》を採用するというのも疑問が残ります。
ですが、一番まずいのは《光輝の泉》2枚採用です。
デッキ構成上、全くシナジーがない上、色拘束が多少あるこのデッキでは事故の素にしかなりません。おとなしく森と山をいれたほうが無難です。
とはいえ、その他カードチョイスは大筋問題ありませんので、惜しい構築、といったところです。

制作者:48歳 男性

部門3:シールドデッキジェネレーター

生成されたデッキ

生成されたデッキ(画像をクリックすると拡大します)

作品のアピールポイント
CSVファイルの point を調整することにより、自分なりのデッキを作成することができます。
-c のオプションをつけることにより、メインカラー、サブカラーの指定ができるようになります。

審査員の講評
シンプルなアルゴリズムで、過不足なくコードにまとまっています。
カードの点数付けも、テキストやマナコストから自動で算出できるような工夫があるとより良かったです。

河浜コメント
ボムレアである《解き放たれた者、ガラク》を使いつつ、《議事会の導師》+《バスリの侍祭》、《野生林の災い魔》といったカウンターを乗せるシナジーを無理なく採用しているデッキです。
しかし、飛行が1体しかおらず概ねバニラな《天界の処罰者》、同じくデッキに猫が0な《猫の君主》、パワー4が少ないので大体4/2/2接死のままの《気難しいディロフォサウルス》、誘発機会がほとんど無く無駄牌になりそうな《グリフィンの高楼》と、ちぐはぐなカードがところどころ見受けられますし、除去が《素早い反応》1枚のみというのも不安が大きいです。
飛行という回避能力もちなだけで偉いので《ヴリンの翼馬》を入れ替えで採用したほうが良いように思います。デッキの体としては問題ないですが、勝ちきれるかは怪しいところです。

制作者:30歳 男性

部門3:シールドデッキジェネレーター

生成されたデッキ

生成されたデッキ(画像をクリックすると拡大します)

作品のアピールポイント
工夫した点として、プログラム内の重視するキーワードを追加したり、評価の重みを変更して、カードの優先度を調整できるようにしました。
また、実行時に引数でどのカードプールデータを使用するか選択できるようにしました。
本課題からは外れますが、6パック分のカードデータを自動で作成するプログラムも作り、連携できるようにしました。

審査員の講評

  • カードテキストを読み取ってカード評価を行っている点が、実践的かつ今後の拡張性の面でも良いですね。また、マナカーブ、マナレシオ、キーワードによる評価をそれぞれ関数として切り出している点も保守性の面で対応しやすくて良いと思います。
  • こちらで実施されたテストプールによるシールドデッキ作成について言えば、プレイヤーから見て強い(弱くない)カードが生成されるデッキから漏れていたのが惜しかったです。例としてはXの評価が低いためデッキに入らなかった《野生林の災い魔》などですね。

河浜コメント
同じく緑白のチョイスです。この色でやる以上《天界の処罰者》《猫の君主》など若干無理のあるカードが入るのは仕方のない状況ではあります(それでも私としては《ヴリンの翼馬》を推しますが)。
そんな中で一番の違いは、このカードプールで強い寄りのカードで、+1/+1カウンター、パワー4以上クリーチャーとも多少のシナジーのある《 野生林の災い魔》が不採用なこと。見た目入れ得なのでここはかなりもったいないです。
また《落とし格子の蔦》はデッキ内でシナジーがないなら単にマナを使った手札入れ替えカードにしかならないため、弱いカード群のなかでも更に落ちる存在です。《墓碑のゴーレム》《金属複製機》といった(バニラ寄りではあるが)比較的まともそうなアーティファクトクリーチャーが入ってないところをみると、そもそも選択肢にあがってないのかもしれませんね。

部門(2) 該当者なし

部門(2)は実務経験3年未満の方を対象に、「デッキ1人回しWEBアプリ」を制作していただくものでした。今回はこちらの部門へのご応募が無かったため、該当者なしとなります。

我こそは!という方、ぜひ次の機会にご参加ください!

部門(1) 優秀作品(4名)

部門(1)は実務未経験の方を対象とし、『基本セット2021』のパック開封シミュレーターを製作していただきました。開封結果だけにとどまらない、ユニークな付加価値を持たせた作品も多く、バラエティ豊かな結果となりました。

今回は、特に素晴らしい作品をお寄せくださった4名の方に『ゼンディカーの夜明け』日本語版ドラフト・ブースター1ボックスをお贈りいたします。

制作者:23歳 男性

部門1:『基本セット2021』開封シミュレーター

部門1:『基本セット2021』開封シミュレーター 優秀作品(1)

※画像をクリックすると拡大します。

作品のアピールポイント
初プログラミングですが頑張りました。
プログラム内で操作手順がわかるように記述しました。
開封した後にさらに追加で開封できるようにしました。

審査員の講評

  • foil判定が抽選後になっているためレアfoilが出ないようです。
  • json1ファイルで抽選に必要な情報を網羅している点は良いですね。

製作者:22歳 男性

部門1:『基本セット2021』開封シミュレーター

部門1:『基本セット2021』開封シミュレーター 優秀作品(2)

※画像をクリックすると拡大します。

作品のアピールポイント
大学で学んだ知識を使い、お盆の期間を含めた約1週間で完成させました。
一度の実行で何度もパック開封を行え、かつ収録内容を確認できるようにしています。少し手を加えれば、BOX開封にも対応できるかと思います。
カードをクラスとして定義し、操作性をよくしています。
各機能ごとに関数分けをし、テストが行いやすいようにしています。
適切なエラー処理をし、プログラムが想定していない入力・読み込みで突然終了することを防いでいます。

また、今回カードリストとして与えられたM21のみではなく他の収録内容でもパック開封を楽しめるように、同じフォーマットのエクセルファイルなどを用意することでパック開封が行えるようにしました。
MTGはパックによってレア・foilの封入率が異なること・テストのしやすさを考慮し、抽選確率は関数内部で指定するのではなく、外部で指定するようにしています(この抽選確率のみ、内部実装を触る必要があります。これを防止する方法としては、外部ファイルに抽選確率を記述しておき、それを読み込むなどが考えられそうです)。

また、別のプログラムから作成した関数を呼び出す際にわかりやすようにするため、各関数に適切なコメントを残しています。このコメントは、VSCodeやその他Pythonのエディタの補完機能で関数の仕様を表示することができます。
こういったプログラミングコンテストに自分のソースコードを提出するのは初めての経験ですが、自分の悔いのないように実装しました。自分自身の成長のため、フィードバックをくださるとありがたいです。

審査員の講評

  • テストコードが付けられているのは保守性の観点で良いですね。
  • レアリティごとにリスト出力できる追加機能のアイデアは良いですね。
  • 変数の記述方法に統一性がないのが気になりました。

製作者:25歳 男性

部門1:『基本セット2021』開封シミュレーター

部門1:『基本セット2021』開封シミュレーター 優秀作品(3)

※画像をクリックすると拡大します。

作品のアピールポイント

  • カードリスト及びタップインランドリストについて、レアリティに変更がなければ、ソースコードを修正せずに他のブースターパックのリストを使用する事でシミュレーション可能です。
  • 一度のプログラム起動で複数回のパック開封が可能です。また、プログラム終了時にはColabのローカルファイルにパックの開封結果を出力します。

審査員の講評

  • 整理されており読みやすいコードでした。
  • アルゴリズムにも冗長な点やミスがありませんでした。

製作者:22歳 男性

部門1:『基本セット2021』開封シミュレーター

部門1:『基本セット2021』開封シミュレーター 優秀作品(4)

※画像をクリックすると拡大します。

作品のアピールポイント

  • PC、スマホ、ブラウザ等のマルチプラットフォームに対応可能。
  • GUIを比較的安易に導入できる。

などの理由でUnityで制作しました。凝った点は、

  • CSVデータ読み込みによる動的なリスト整理(ただし、カード名の”,”の扱いに困ったため少し特殊な形式(” , ”)にしてある)
  • 入手カードの画像一覧表示
  • フォイルカードのシェーダの加算合成による特殊表示
  • 一覧のスクロール
  • クリックによる拡大表示
  • 開封パック数の選択
  • 入手カードの保存

あたりです。
6パック分開封して保存を繰り返し、シールド用のリストを作成して遊ぶことも可能です。

プログラマ専攻ではない上に半年ぶりのプログラミングとはいえ、途中で処理に困って段々と乱雑なコードになってしまい、反省するところも多いです。
次の機会があれば、もっとキレイなコードを書けるように練習しておきたいと思います。

審査員の講評

  • GUIでしっかり動くものができているのは素晴らしいです。
  • 何度も利用する処理は関数化するなど、メンテナンス性を考えた整理ができるともっと大規模なものを作る際に助けになると思います。

ご紹介は以上となりますが、掲載しきれなかった作品も素晴らしいものばかりでした。改めて、ご応募くださった皆様に御礼申し上げます。参加賞も順次発送しておりますので、到着をお待ちいただければ幸いです。

Sekappyでは、これからもマジック×ITを盛り上げるべく、プログラミングチャレンジを継続開催してまいります。本記事をご覧になって企画を知られた方、自分のスキルを試してみたいという方、はたまた賞品獲得を狙おう!という方、ぜひ次回の開催を楽しみにお待ちください。

この度は多数のご参加、誠にありがとうございました。