投稿

8月, 2020の投稿を表示しています

スランプグラフから差枚数を自動算出するツール作成(後編)

イメージ
前編に引き続きスランプグラフから差枚数を自動算出するツールをPythonで作っていきます。 前編で求めたグラフの位置 からスランプグラフの差枚数を算出していきます。 2. スランプグラフから差枚数を求める はじめに 以下の画像から差枚数を算出していきますが、スランプグラフ内には差枚数算出に不必要なグラデーションが入っています。 人間の場合は、どれがグラフで、どれが不必要なグラデーションかを感覚的に判断できますが、コンピュータではどちらが必要なデータなのかはわかりません。 そこで、不必要なグラデーションを除去する処理を行います。 エッジ保存フィルタ(エッジ抽出フィルタ)と呼ばれる方法を採用しますが、これはその名の通り画像のエッジ(輪郭)だけを抽出する方法です。 言葉ではイメージしづらいと思うので、処理前後の画像を↓に貼っておきます。 画像全体からグラデーションが消えて、エッジ部分の線のみ残っています。 エッジ保存フィルタの中身の基本的な処理としては、画像の微分があげられます。 下図に示すように、微分の値は変化が急峻なところほど大きくなります。 これを画像にあてはめると、「変化が急峻なところ=画像のエッジ」、「変化が緩やかなところ=グラデーション部分」となるので、画像のエッジ部分だけを抽出することができます。 求めたエッジ部分を画像の端から探していけば、最初に見つかった点がグラフの最後の点がわかります。 最後に比例計算でピクセル数を差枚数に変換すれば差枚数算出完了です。 グラフの範囲は今回の場合±2000枚なので、全体として4000枚の範囲(2000×2枚)を計算しています。 画像のエッジ抽出 ここからは、Pythonでのコーディングに入ります。 まずは、画像のエッジ抽出を行います。 これまたテンプレートマッチングの時と同じく、1行だけです。 Canny法と呼ばれる方法を採用されているようですが、詳しいことは理解不足で説明できません。。 差枚数を求めたい画像は、「img_gray」に保存されているので、「img_gray」に対してエッジ抽出を行います。 # 差枚数を求めたい画像のエッジ抽出 img_bin = cv2.Canny(img_gray,128,200) 走査範囲の設定 続いて、グラフの最後の点を探してい

スランプグラフから差枚数を自動算出するツール作成(前編)

イメージ
今回はスランプグラフから差枚数を自動算出するツールをPythonで作りたいと思います。 スランプグラフから差枚数を算出するには以下の2ステップが必要となるので、前編・ 後編 の2部構成で説明します。 1. グラフの位置を求める 2. スランプグラフから差枚数を求める 今回は、下図のような画像から差枚数を読み取ってみます。 1. グラフの位置を求める はじめに 先ほどの画像では、1枚の画像の中に3枚のスランプグラフが含まれています。 この場合、まずは画像の中にある3枚分のスランプグラフの場所を求める必要があります。 方法は様々なものがあると思いますが、今回は「テンプレートマッチング」を用いて、スランプグラフの場所を見つけていきます。 テンプレートマッチングは下図のような技術で、あらかじめ作成したテンプレート画像が、調べたい画像(対象画像)の中のどこにあるのかを探してくれます。 テンプレートマッチングのアルゴリズムも様々なものがありますが、簡単な例としては引き算で探す方法があげられます。 例えば●、▲、■から、■を引き算すると以下のような結果になります。 つまり、引き算をしたときに、何もなくなるところが今回探したい場所になります。 これを対象画像からテンプレート画像をちょっとずつずらしながら引き算していくことで、テンプレート画像と同じ画像がある位置を知ることができます。 Pythonでのコーディング では、実際にPythonでグラフの位置を探してみましょう。 まずは、テンプレート画像とグラフを探したい画像を準備します。 今回は、以下のような画像を準備しました。 ※今回の方法の注意点として、テンプレート画像のグラフの大きさと、グラフを探したい画像のグラフの大きさを揃える必要があります。 ※グラフの大きさが違うと、引き算した時に差が出るので、正しい位置が求められません。 テンプレートマッチングについて長々と説明しましたが、Pythonでのコードは↓の二行だけです。 このコードを実行することで、先ほどの例でいうところの「ちょっとずつずらしながら引き算した結果」を出力してくれます。 ※しかも実際にはもっと賢いことをやってくれてます。ありがとうPython!! import cv2 res = cv2.matchTempla

バーサスの設定判別ツール作成

イメージ
今回はバーサスの設定判別ツールをPythonで作成します。 過去に作成した ハナビの設定判別ツール とほぼ同じ要領で作成できます。 今回は、ハナビの設定判別ツール作成で説明できていなかった、BB中の判別要素の計算方法について記載します。 バーサスのBB中の判別要素といえば、「Vを狙え演出」ですね。 設定ごとにVを狙った時の停止形の出現確率が異なっているため、BBのG数を算出して計算に用いる必要があります。 BBのG数は24Gですが、せっかくなのでこの24Gを導出してみましょう。 バーサスのBBは344枚を超える払い出しで終了とあります。 BB中は、14枚役を1回取ったあと、15枚を取っていくので、下表のようになります。 24Gのところで、払い出し枚数が344枚を超えるので、24GでBB終了です。 G数 取得役 払出枚数 1 14 14 2 15 29 3 15 44 4 15 59 ・ ・ ・ ・ ・ ・ ・ ・ ・ 22 15 329 23 15 344 24 15 359 方程式で算出するとしたら、以下の式となります。 15 * G数 - 1 > 344 → G数 > 23 式を解くと、23Gを超えるG数が答えとなるので、24GでBBが終了することになります。 BBのG数がわかったので、「Vを狙え演出」での判別要素の二項分布確率を算出できます。 コードは以下のようになります。 三連Vテンパイの二項分布確率 = binom.pmf(三連Vテンパイ回数, BB * 24, 三連Vテンパイの設計上の確率) こちらが実際に作成したバーサスの設定判別ツールのコードです。 ※VS-CHANCE中のはずれ確率にも設定差があるようですが、設定差が小さいので項目から除外しています。 # coding: UTF-8 from scipy.stats import binom def S_EST(回転数, BB, RB, チェリー, スイカ, ベル, 三連Vテン, 三連V上下段, 三連V斜め, VSゲームはずれ, VSゲームマイナス): # 設定値データを定義 header = ['Machine', 'Setting', 'BB', 'RB',

ハナビの設定判別ツール作成

イメージ
今回はハナビの設定判別ツールをPythonで作成します。 過去に作成した マイジャグラーⅢ や ディスクアップ の設定判別ツールとほぼ同じ要領で作成できます。 そのため、今回は新しい情報というよりは作り方の趣味や思想の話になってしまいます旨、ご了承ください。 ハナビの設定判別ツールを作るにあたって気になるところといえば、花火チャレンジと花火GAME(以下まとめてRTと記載することがあります。)の回転数のカウント方法だと思います。 できるだけ実戦時のカウント値をそのまま入力できるプログラムを作りたいわけですが、例えば実戦中のカウント方法として以下の方法が考えられます。 1. 消化したRTのG数をカウント メリット:G数の把握が楽 特に毎回回数が変動する花火チャレンジでデータカウンタの数字をそのまま入れるだけでOK。 デメリット:カウンターの数字が大きくなるので、カウンターをポチポチするのが大変 2. 消化できなかったRTのG数をカウント メリット:カウンターの数字が小さいので、カウンターをポチポチするのが楽 デメリット:RTの残G数の確認が面倒 残G数を見ておくか、データカウンタの数字から毎回引き算しないとダメ。 どのようなツールにするかは使用者の好み次第ですが、今回は自分用のツールなので、私個人の好みで「2. 消化できなかったRTのG数をカウント」する方法で作成していきます。 計算方法としては、花火チャレンジと花火GAMEそれぞれ、BB1回あたり20Gついてくるので、「BB回数 * 20 - RTの残G数」で計算できます。 二項分布確率の算出のコードにあてはめると以下のようになります。 花火チャンレンジ中のはずれの二項分布確率 = binom.pmf(花火チャレンジ中のはずれ回数, BB * 20 - 花火チャレンジの残G数, 花火チャレンジ中のはずれの設計上の確率) 花火GAMEの場合も同様の計算方法でOKです。 こちらが実際に作成したハナビの設定判別ツールのコードです。 ※花火GAME中のRTリプレイにも設定差があるようですが、目押し精度に自信がないので項目から除外しています。 # coding: UTF-8 from scipy.stats import binom def S_EST(回転数, BB, RB, チェ

スマホで設定判別ツールを使おう(Google Colaboratory)

イメージ
これまで マイジャグラーⅢの設定判別ツール や、 ディスクアップの設定判別ツール の作成方法や自作のコードを公開してきました。 今回はこれらのツールをスマホで使う方法に関してご説明したいと思います。 ※皆様全ての環境で正しく動作するかは、私では保証できませんので、その点ご留意ください。 今回ご紹介する方法は、「Google Colaboratory」と「Google Drive」を用いた方法です。 サービスは無償で提供されており、プログラミングの学習でハードルの高い初期の環境構築もほぼ不要なので、私のような素人にはありがたいサービスです。 では早速使用方法について説明します。 サービスの使用開始までの流れについては、他のGoogleサービスと同様に簡単になっているので、こちらでは割愛します。 Google DriveのHP Google ColadivatoryのHP 普段の私の使用方法を一例として記載します。 全体の流れとしては、以下のような形です。 コーディングをスマホで行うのは大変なので、コーディングはPCで行い、ホールで実戦中にツールを使うときはスマホで行っています。 1. PC作業 1.1. Google Drive上にGoogle Colaboratory用のファイルを作成 1.2. Google Colaboratory上でコーディング 2. スマホ作業 2.1. Google Colaboratory上で実戦データを入力 2.2. プログラムを実行 1. PC作業 1.1. Google Drive上にGoogle Colaboratory用のファイルを作成 まずは、Google Drive上でGoogle Colaboratory用のファイルを作成します。 「新規」ボタンを押下、もしくは画面上で「右クリック」→「その他」→「Google Colaboratory」と選択します。 するとこのような画面に遷移します。 画面左上の「Untitled0.ipynb」の部分をわかりやすいファイル名前(今回は「DISC-UP.ipynb」)に変更しましょう。 基本的には自動で保存されますが、「Ctrl + S」もしくは、「ファイル」→「保存」でも保存できます。 Google Driveの画面に戻ると、ファイル名が変

ディスクアップの設定判別ツール作成

イメージ
今回はディスクアップの設定判別ツールをPythonで作成します。 過去に作成した ジャグラーの設定判別 と異なり、ディスクアップはART(DANCE TIME, DJ ZONE)中の「共通9枚役」と「はずれ」も計算する必要があります。 設定推測値の計算方法 計算自体は簡単で、二項分布の確率算出の関数である「binom.pmf」で「回転数」を入力し ていたところに「ART回転数」を入れるだけです。 具体的には、下記の計算式になります。 共通9枚役の二項分布確率 = binom.pmf(共通9枚役回数, ART回転数, 共通9枚役の設計上の確率) はずれの二項分布確率 = binom.pmf(はずれ回数, ART回転数, はずれの設計上の確率) また、ディスクアップではビタ乗せなし(BB中のビタ押し成功時に上乗せが発生しない)確率にも設定差が設けられているため、こちらの計算も必要です。 この場合も計算自体は簡単で、先ほどの「回転数」の部分を「BB中の回転数」に変更するだけです。 具体的には以下のように、BB1回あたりのG数である25Gに、BB回数をかけることによって計算できます。 ビタ乗せなしの二項分布確率 = binom.pmf(ビタ乗せなし回数, BB回数 * 25, ビタ乗せ無しの設計上の確率) あとはジャグラーの設定判別ツールと同様に各役の二項分布確率を計算すれば完成です。 今回作成したコード こちらが実際に作成したディスクアップの設定判別ツールのコードです。 # coding: UTF-8 from scipy.stats import binom def S_EST(回転数, BB, RB, チェリー, スイカ, ART回転数, 共通9枚, はずれ, 異色BB, チェレグ, ビタ乗せなし): # 設定値データを定義 header = ['Machine', 'Setting', 'BB', 'RB', 'Cherry', 'Suica', '9mai', 'Hazure', 'ABB', 'CherryRB', 'Bi

ジャグラーの設定判別ツール作成

イメージ
今回はスロットの設定判別ツールを作成していきます。 ツールを使っている方やこれから使おうと思っている方で、どのような方法で設定推測値を算出しているのか気になっている方もいらっしゃると思います。 設定判別の方法 設定判別には「二項分布」というものを使用します。 二項分布とは、「コインを10回投げたときに、表が5回出る確率は?」といったときに使用できます。 これをスロットの設定判別に置き換えると、 ・1000回転でBBを10回引く確率は? ・1000回転で小役を100回引く確率は? といった計算を行うことができます。 さらに、1000回転でBBを10回、小役を100回引く確率は、それぞれの確率の掛け算で算出することができます。 つまり、以下の計算となります。 1000回転でBBを10回、小役を100回引く確率 = 1000回転でBBを10回引く確率 * 1000回転で小役を100回引く確率 各設定において、これらの計算を行い、最終的には各設定の確率の合計が100%になるように正規化すれば、設定判別ツールの完成です。 設定判別ツールの作成(マイジャグラー) では、早速Pythonで「マイジャグラーⅢ」の設定判別ツールをプログラミングしてみましょう。 今回作成する「マイジャグラーⅢ」では、以下の確率に設定差があるとされています。 ・BB = 287.4~240.9 ・RB = 431.2~240.9 ・チェリー = 36.028~33.233 ・ぶどう = 6.35~6.071 ・単独BB = 402~334.3 ・チェリーBB = 1456.3~1170.2 ・単独RB = 668.7~334.3 ・チェリーRB = 1213.6~862.3 これをPythonでのコードで記載すると以下のようになります。 # 設定値データを定義 header = ['Machine', 'Setting', 'BB', 'RB', 'Cherry', 'Budo', 'BB_T', 'BB_Ch', 'RB_T', 'RB_Ch'] set1

マイジャグラーⅢのシミュレータ作成

イメージ
マイジャグラーⅢの設定判別ツール 検証用にマイジャグラーⅢのシミュレータを作成していきます。 基本的には以前作成した ゴーゴージャグラー2のスランプグラフ作成ツール に改良を加える形です。 設定値の定義 まずは、設定値の定義から。 設定判別ツールに用いた配列にリプレイ確率を追加しています。 (設定判別にリプレイは不要ですが、シミュレーションには必要です。) # 設定ごとの小役・ボーナス確率の設定 header = ['Machine', 'Setting', 'Reaplay', 'Cherry', 'Grape', 'BB_T', 'BB_Ch', 'RB_T', 'RB_Ch'] set1 = ['MyJug3', '1', '7.29', '36.028', '6.35', '402', '1456.3', '668.7', '1213.6'] set2 = ['MyJug3', '2', '7.29', '35.949', '6.289', '397.1', '1394.3', '528.5', '1170.2'] set3 = ['MyJug3', '3', '7.29', '34.693', '6.25', '383.2', '1337.4', '496.4', '1092.2'] set4 = ['MyJug3', '4', '7.29', '33.522', '6.23', '372.3', '1260.3',

ゴーゴージャグラー2のシミュレーション(プログラミング編)

イメージ
前回 のコードを応用して、Pythonで「ゴーゴージャグラー2」のスランプグラフを作成してみましょう。 設定ごとの小役・ボーナス確率の設定 ジャグラーのスランプグラフを描画するにあたって、設定が6段階あることを考慮する必要があります。 今回は、ループ処理を用いて、設定値1~6まで変更し、各設定値に対応する小役・ボーナス確率をその都度設定しています。 # ループ処理 # 1~6の設定数分ループを回す for Setting in range(1,7): # 差枚数を入力する変数 Total = 0 # 設定ごとの小役・ボーナス確率の設定 if Setting == 1: Replay = 7.29 Grape = 6.82 Cherry = 33.7 BIG = 269.70 REG = 364.10 elif Setting == 2: Replay = 7.29 Grape = 6.75 Cherry = 33.7 BIG = 268.60 REG = 336.10 elif Setting == 3: Replay = 7.29 Grape = 6.70 Cherry = 33.7 BIG = 266.40 REG = 318.10 elif Setting == 4: Replay = 7.29 Grape = 6.65 Cherry = 33.7 BIG = 260.10 REG = 283.70 elif Setting == 5: Replay = 7.29 Grape =