見出し画像

あなたのデッキは最強か?Ruby x モンテカルロで解き明かすポケポケ最適化

こんにちは!
aisaacでエンジニアしているsoです!
今回アドベントカレンダーの指名してもらったので、せっかくだから最近流行ってる事をエンジニアぽく触れてみようと思いこのテーマで書いていきます。

↓2024年アドベントカレンダー今までの記事とこれからの記事はこちらから

ポケモンカードゲームのスマホアプリ「ポケポケ」が大流行していますね。aisaac社内でも「このデッキ強いよ」「いや、こっちの方が勝率高いんじゃない?」といった会話が日々交わされています。
そんな中、「デッキの強さって数値化できないかな?」という疑問が浮かび、シミュレータを作ってみることにしました。今回は代表がRubyコミッターということもあり、得意な言語の一つであるRubyで実装してみました。

RubyKaigi 2024 のスポンサーをさせていただきました🙌

システムの概要

このシミュレータは、以下のような特徴を持っています:

  1. モンテカルロ法による大量対戦シミュレーション

  2. ポケポケの基本システム実装

  3. 拡張性の高い設計

モンテカルロ法によるデッキ評価

モンテカルロ法とは、乱数を用いた試行を多数回繰り返すことで、確率的な事象の結果を予測する手法です。

ポケモンカードゲームには以下のような確率的要素が多く存在します
- 初手の手札
- デッキからのドロー
- コイントスによる効果の発動

これらすべての場合の数を計算で求めようとすると、膨大な組み合わせになってしまいます。そこで、実際のゲームをコンピュータ上で何度も再現することで、より現実的な評価を行うことができます。

Claud

実装のポイント

  • 効果処理の抽象化

  • 並列処理による高速シミュレーション

シミュレーション結果から見えてきたこと

同じデッキ同士で1000戦のシミュレーションを複数回実行してみると、、、

# 11回の1000戦シミュレーション結果 Player 1 勝率: 67.9%, 71.1%, 66.6%, 69.5%, 71.9%, 70.0%, 68.4%, 68.5%, 66.4%, 68.9%, 69.0% 平均勝率: 約69%
  • 先攻の優位性

    • 同一デッキの対戦でありながら、先攻プレイヤーが約69%という高い勝率を示しています

    • 標準偏差が1.7%と小さく、現在構築されたルール上ではこの優位性は偶然ではなさそう

    • 実際のポケポケでも、先攻を取ることの重要そう…!

  • ゲーム展開の特徴

    • 引き分けが一度も発生していないことから、現在のデッキ構成では50ターン以内に必ず決着がつく

  • デッキ構築の示唆

    • 「オーキド博士」のような手札補充カードが、安定した展開を支えている

今後の課題

現状のシステムには、以下のような制限があります:

  • バトル場から「逃げる」機能未対応

  • 「ピカチュウEXレンタルデッキ」のみ対応

  • 手札からたねポケモンを出す優先順位が完全ランダム

  • ベンチからバトル場に出すポケモンの優先順位が完全ランダム

  • etc….

これらの制限は、時間的な制約により実装できなかった機能です。機能拡張のPRをお待ちしています!

さいごに

最後までお読みいただき、ありがとうございます!

アイザックでは、「ポケポケ」のように身近な題材からエンジニアリングの可能性を探求する、そんな「世の中を実験する」仲間を募集しています。技術力を活かして世の中をワクワクさせたい方、ぜひカジュアルにお話ししましょう!

また、このプロジェクトは、エンジニアとしての技術的興味と、「ポケポケ」への関心が結びついて生まれました。まだまだ改善の余地はありますが、オープンソースとして公開することで、多くのエンジニアの方々と一緒にシステムを成長させていければと思います!(ポケモンカードのシステムをコードに落とし込むのめっちゃおもろいけど、めっちゃむずい、、、!!

ぜひ、GitHub上でコードを確認いただき、PR、Issue等でフィードバックをいただけると幸いです!

GitHubリポジトリはこちら


いいなと思ったら応援しよう!