数当てゲーム(イージスコードのアレ)の戦略

はじめに

イージスコードの数当てゲームやってて、これの最適戦略どうすればいいんだろう、と思って、色々な戦略を考案して試してみた。

イージスコードの軽い説明

イージスコードは所謂ソシャゲなのだが、戦闘システムが数当てになってる。数当ては、

  • 0から9までの数字を3桁
  • 数字の重複はしない
  • 1度数字を決めると、Hit(位置が正しい数字)とBlow(位置は間違ってるけど別の場所にある数字)の数が分かる

というルールで行う。ので、選べる数字は最初720パターンあって、数字を回答すればそのHitとBlowの数から数字がどんどん絞り込める訳である。

とりあえず

まず最初に作ったのは今可能性としてある数字を候補として出すツール。

http://54.199.141.205/aegis/

やること

上のツールとかを使い、候補が全て分かっていることを前提として、どのような数字を選んでいけば

  • 最も早く数字を当てられるか(countが少ない方が良い)
  • 最もダメージを稼げるか(damageが多い方が良い。全部当てたHIT3の場合を0としてその差分をマイナスして計算)

を計算する。ダメージ倍率は

http://senkosinki.gamerch.com/%E3%83%80%E3%83%A1%E3%83%BC%E3%82%B8%E8%A8%88%E7%AE%97%E5%BC%8F

を参照

幸い選べる数字は720パターンしかないので、全部の場合で試して合計を取れば良い。

試した戦略

HeadStrategy
候補の先頭をそのまま選ぶ。処理が早い
RandomStrategy
候補の中からランダムに選ぶ
DiscreteStrategy
同じ数字をできるだけ使わないように選ぶ
PointStrategy
候補毎にpointを出して、その数値が一番デカいのを選ぶ。Pointの計算方法として、数字が被るとPointが下がる計算方法を考案
WikiStrategy
Wikiに書いてある奴 http://senkosinki.gamerch.com/%E6%95%B0%E5%AD%97%E5%BD%93%E3%81%A6%E3%81%AE%E3%82%B3%E3%83%84 ただし2回目しか書いてないので、それ以外は他のStrategyを選択する
NewWiki
下のコメントにある「次の候補数の二乗の和が一番小さいのを選ぶ」Strategy。PointStrategyの一種として実装

結果

Strategy count damage
Head 3469 -4613
Random1 3422 -4553
Random2 3412 -4535
Random3 3474 -4668
DiscreteStrategy 3489 -5259
Point 3469 -4613
Wiki + Head 3590 -4700
Wiki + Random 3533 -4629
Wiki + Discrete 3537 -5326
Point + NewWiki 3362 -4471

実際に書いたコードはこちら

https://github.com/ponkotuy/AegisStrategy

下のコメントで出てきた「通り数の二乗の和が最小になるものを選ぶ」というStrategyが一番優秀なもよう。次点でランダムなので、他は「余計なことするぐらいなら適当に候補から選んどけよ」ってことらしい。

まとめ

結局ランダムが一番早いという驚愕の結果になった訳だが、他に面白いアルゴリズムとか思い付いたら、簡単に試せるので、試してみると面白いと思う。