ダメージ計算ツールを作る その①
前回からだいぶ時間が経ってしまっていますが、ちゃんとやることやってるんです、
いつもお世話になってます。
ひとまず対戦補助ツールの作成を進めようと思ったのですが、
わからんことが多かったので対戦補助ツールの機能として考えていた
「ダメージ計算ツール」(以下ダメ計)の作成を学習題材として取り組んでいます。
ネット上にすでにあるのでイメージしやすく、開発技術の習得に集中できる
のではないかという理由です。
当面ダメ計ツールの開発を利用して、デスクトップアプリ開発のノウハウを
勉強するって感じです。
ということで、ダメ計ツールの進捗です。
画面はとりあえず完了し、肝となる計算部を実装中です。
※画面はこんな感じ
作ってみたダメ計のインターフェースがゴミってるのはスルーしつつ、
開発に使用しているWPFというフレームワークが結構便利だと思いました。
画面設計とロジック設計を分離できる、つまり
見た目と処理が分けられるのが画期的に感じました。
まあデスクトップアプリの開発がほぼ初めてなので
全部が全部新鮮に感じられているのですが。
WPFで開発するにあたり、MVVMというデザインパターンのようなものがあるのですが
これを理解するのに時間がかかりました。
ド基本の考え方としては、先に述べた「画面設計とロジック設計を分離できる」
これに終始するのですが、頭でわかってても設計段階で結びつけるのが難しく。。。
※特にViewModelがよくわからんかった
ダメ計というちょうどよい題材があるので、これを例に示すと、、、
多分こんな感じになるのだと思う。
※ViewModelとModelがまだごっちゃになってるから合ってるのかは知らん
そもそもオブジェクト指向の理解も怪しいのでだいぶ苦労してる。
明日から本気出す
2020年は本気を出す年にしようと決めたので、現時点でやろうと思ってることを列挙してみた。
①対戦補助ツールの作成
②動画制作×10本くらい
→現時点で1本済
③新しい技術の獲得 or 既存技術のクオリティ向上
→3Dとか音声編集とか
③に関しては、ある程度やった感あるので、これから取り組むべきものとしては、
①か②になる。
②に関しては、剣盾のDLC発売が迫ってるので環境固まってから考えることにする。
となると①か。
先日選出予想のブログも書いたので、記憶がまだ新鮮なうちにやっておきたい感も確かにある。
一応リアル職業がSE(プログラマー?)やけど、デスクトップアプリを作ったことないので、もろもろ勉強しないと達成するのが難しそう。気が重いなあ。
コンソールアプリだったらサクッと作れるかもしれないけど、さすがにGUI必要でしょ。
今年は本気を出す年なので、とりあえず始めるだけ始めよう。
勉強したことをブログに乗せていけばネタにも困らんやろう。
今年中に作れる見通しないけど、とりあえず暇があればやっていこう。
途中まででもいいからやりゃあええんや。きっとたぶん。
よし、頑張るぞ!
明日から!
選出予想計算式
いつもお世話になっております。
今更感ありますが、ポケモンの選出予想システムの詳しい計算式を書いておきます。
なんの話よ?って方は下記動画をご参照ください。
https://www.nicovideo.jp/watch/sm35950475
選出予想の考え方
①同じパーティで対戦しまくって、選出の統計取る
②単体の選出率ではなく、6体中3体の組み合わせのパターンのなかで、どのパターンが
一番選ばれるか?を予想する
この記事で書くのが②の予想するための計算式です。
単純に計算式を作ろうとすると、①で集めた統計から選出された3体組み合わせのパターンを数え上げれば事足りそうです。
例)
→よっしゃ、じゃあこの↓パターンがくるはずや!
と、「選出されたこと有る」パターンがあれば予測はできます。
ただ「選出がまったく一致するってそんなに多い?」「型が変われば選出方法も変わっるのでは?」と課題が残ります。
さらに、全パターン「選出されたこと無い」であれば、予想が全くできません。
以上の課題を解決するための手段として、単体の選出回数も考慮に含めることにしました。
単体と3体組み合わせを考慮するのなら、2体組み合わせも入れたらええんちゃうか、ってことで計算方法は最終的にこんな感じになりました。
用語説明
汎用化した式の説明の前に、いちいち図を用意しなくても済むように記号で表します。
P(X):Xというポケモンが選出された割合
= (Xが選出された回数)÷(相手のパーティにXがいた回数)
P(X,Y):XというポケモンとYというポケモンが同時選出された割合
=(XとYが同時選出された回数)÷(相手のパーティにXとYがいた回数)
P(X,Y,Z):ポケモンX、Y、Zの組み合わせが選出された割合
=(XとYが同時選出された回数)÷(相手のパーティにXとYがいた回数)
選出予想計算式
ポケモンX,Y,Zの選出スコア
= α × P(X,Y,Z) + β × {P(X,Y)+P(Y,Z)+P(Z,X)} + γ ×{P(X)+P(Y)+P(Z)}
ただし、(1 ≧ α > β > γ ≧ 0)
これを20パターンすべて計算して、選出スコアが高いものが一番選出される確率が高いと判断します。
※そのまま確率とせずスコアと言い換えてるのは正規化するのが面倒だったから
突然でてきた、α、β、γ ってなんだよっていう話ですが、ただの調整用のパラメータです。
選出される3体の予測に一番影響を与えるのは、やはり "P(X,Y,Z)" なので、P(X)よりも選出スコアへの影響度を高くしたい、その調整のためのパラメータです。
実際に選出予想をしていたときは、α=1, β=0.1, γ=0.01 としています。
最後に
大学で統計学やら機械学習をかじった程度の知識で作ってみたので、たぶん穴だらけだと思います。
もうちょっと勉強してればよかったと後悔しつつ、統計数を増やしたりより精度の高い手法を考えたりしようと思います。
その前に対戦データを記録し、集計するツールが必要ですね。
今までは全部エクセルに記入して、集計→予想までを全部VBAで組んでましたw
ちゃんとしたGUIアプリ作ったことないので、そこの勉強からしようと思います。
それでは、お元気で。