投稿

Pとある魔術の禁書目録(インデックス)のシミュレーション

イメージ
お世話になっております、スログラミングです。 「遊タイム機のシミュレーションがしたい!」 と思い始めて早3ヶ月が経ってしまいました。 (9月の「ぱちんこ 仮面ライダー 轟音」がきっかけ) はまり属性の私にとって遊タイム(天井、天井時短)は非常にありがたい機能であるわけですが、実際どのくらい甘くなっているのかイメージしづらいところがありました。 具体的には、 遊タイム有と無の場合のスランプグラフ を描画して、どのくらい助かったのかを比較してみたいと思います。 今回タイトルにあるとおり、「Pとある魔術の禁書目録(インデックス)」のシミュレーションを作っていこうと考えていますが、インデックスを選んだ理由は1点!! ST100%突入でスペックがシンプルだから!! 当初は突時もついている「P真・牙狼」のシミュレーションを予定していましたが、ちょっと複雑なので今回は断念。気が向いたら取り掛かってみます。 ということで早速行ってみましょう。 今回もPythonでのコーディングです。 ※当然ですが念のため。素人の趣味なので実機とは異なる可能性が大いにある点ご承知おき下さい。 今回のアジェンダはこちら。 1. 遊タイムのコーディング 2. STのコーディング 3. 今回作成したコード 4. 結果の確認 5. 最後に 1. 遊タイムのコーディング 遊タイムはご存じのとおり、大当たり間で規定回数はまると時短に突入する機能です。 今回は、大きく2点の考慮を行いますので、それぞれ記載していきます。 1.1. ベースの違い これは、イメージしやすいですね。 左打ちでヘソを狙うときと、右打ちで電チューを狙うときでは、1k(250玉)あたりの回転数が大幅に異なります。 今回のプログラム上では以下のような形で定義しています。 普段の遊技でイメージしやすいように、左打ちは1k(250玉)あたりの回転数、右打ちは玉がどのくらい残るかで設定しています。 # 1k(250玉)あたりの回転数(左打ち) Border = 18 # 1k(250玉)打って何発残るか(右打ち)。今回は10%減→90%残る仮定で計算 Border_ST = 250 * 0.90 続いて、先ほどの設定値を元にループ処理(1回転毎の処理の繰...

VBAのこれってどうだったっけ?集

お世話になっております、スログラミングです。 ※本記事にパチンコ・スロットは一切関係ありませんので、ご容赦ください。 本記事は、 VBAのこれってどうだったっけ?集 を作っていきます。 ただそれだけです。 目次はこちら Cellsはどっちが行でどっちが列? ブックの指定、シートの指定 新規ブックの作成 シートのコピー for文を抜ける 最終行、最終列 シートの削除 画面更新OFF(ちょっと高速化) Cellsはどっちが列でどっちが行? Cells(行, 列) 例えば、A2セルはCells(2, 1) Cells(行, 列) ブックの指定、シートの指定 ブックは、Workbooks("ブック名") シートは、Sheets("シート名")で指定。 Workbooks("ブック名").Sheets("シート名").Cells(行, 列) 'もしくは Workbooks("ブック名").Worksheets("シート名").Cells(行, 列) 新規ブックの作成 新しいブックは、Workbooks.Addで作成できる Workbooks.Add シートのコピー 別のブックからシートをコピー。 先頭に追加するケースと、一番後ろに追加するケース。 ' 先頭に追加 Workbooks("コピー元").Sheets("シート名").Copy After:=Workbooks("コピー先").Sheets(1) ' 最後に追加 Workbooks("コピー元").Sheets("シート名").Copy After:=Workbooks("コピー先").Sheets(Workbooks("コピー先").Sheets.count) for文を抜ける Exit forでfor文を抜けることができる。 For i = 1 To MaxRow ...

ディスクアップの青7を自動認識

イメージ
今回はディスクの青7を自動認識させてみたいと思います。 というのも、スマホ等でカメラを構えると、勝手に人間の顔を認識して追いかけてくれるのを見たときに、 「これってスロットの目押しもできるんじゃない?」 と思ったのがきっかけです。 残念ながら、私にはスマホアプリを作成するスキルはないので、 この記事を元に、 どなたかビタ押しのタイミングを教えてくれるスマホアプリを作成していただけたら感謝感激です。 ということで、早速ディスクの青7を認識させる方法を考えていきます。 本日のアジェンダはこちら。 1. どうやって図柄を認識させるか? 2. カラートラッキングとは 3. 動画とは 4. Pythonでのコーディング 5. 今回作成したコード 6. 結果の確認 1. どうやって図柄を認識させるか? まずは、私たちが普段目押しを行う時に、どの部分に注目しているかを考えてみます。 ディスクアップのリール配列はこちら。 サミーさんのHP から引用 人によって違いはあると思いますが、個人的に一番目につくのは 「色」 ですね。 (リプレイ図柄が水色で色が近いのが気になりますが、 「大きさ」 でフィルタすればなんとかなりそうです。) 今回のように、 「色」 によって物体を追跡することを 「カラートラッキング」 といいます。 2. カラートラッキングとは 「カラートラッキング」は、直訳すると 「色追跡」 となるように、色で物体を追跡する手法です。 コンピュータでは、色を 赤・青・緑 それぞれの数値で定義しています。(光の三原色というやつですね。) 例えば、WindowsのPaintで「色の編集画面」を開くと、R(Red:赤)・G(Green:緑)・B(Blue:青)の値を直接指定して好きな色を作ることができます。 下図のように、R=0・G=0・B=255とすると、「青」の色が作成できます。 実際のカメラの画像では、ホールの明るさやカメラのスペック、撮影方法によって色が変わってくるので、ある程度の幅以内に含まれる色を判定するコードを記載します。 Pythonでは、↓のコードを用いることで、指定した色部分だけを抽出することができます。 色の指定は、RGBの順番でなくBGRの順番であることに注意が必要です。 cv2.inRang...

6号機ジャグラーのぶどう確率予測

イメージ
導入日が延期されていた6号機ジャグラーですが、導入日は12月14日になったというニュースが流れていますね。 最も気になるのはスペックだと思いますが、こちらは ㈱北電子さんのホームページ 上で公開されており、以下のような数値になっています。 ㈱北電子さんのホームページ( https://www.kitadenshi.co.jp/slot/ )から引用 次に気になるのは設定差の部分かと思いますが、ジャグラーシリーズといえばメイン小役のぶどう確率に設定差が設けられていることが有名です。 残念ながら、小役確率はまだ公表されていませんが、ユーザーとしてはぜひとも知りたい情報ですよね。 ということで、今回は 6号機ジャグラーのぶどう確率を推測 してみたいと思います。 スペックから逆算する方法が王道かと思いますが、シミュレーションを使って泥臭く求めてみます。 作成するプログラムは↓のようなイメージです。 ぶどう確率を6.00~7.00まで変化させたときの出玉率を計算した後、近似式を利用して出玉率が設計値になるぶどう確率を算出します。 ※公表されている出玉率の算出方法が不明であったり、ぶどう以外の小役確率は適当な推測値を入力していますので、今回の結果が正しいものとは限りません。 近似式とは 近似式は、ばらつきをもったデータの傾向を知るのに有効な手法です。 ご存じのようにスロットの出玉率は膨大な試行を行わないと設計値に収束しません。 そのため、今回取得したデータも下図のようにばらつきを持った結果となります。 ぶどう確率の推測精度をあげるためには、ばらつきを持ったデータをそのまま信用するのではなく、ぶどう確率と出玉率の傾向をつかむ必要があるため、近似式を利用します。 今回はぶどう確率を振る範囲が狭く、データの傾向もほぼ線形で近似できると思うので、一次近似式を利用したいと思います。 本日のアジェンダはこちら。 1. ぶどう確率を変化させた時の出玉率をシミュレーション 2. 一次近似式を求める 3. 出玉率が設計値になるぶどう確率を算出 4. 今回作成したコード 5. 結果の確認 1. ぶどう確率を変化させた時の出玉率をシミュレーション では早速、ぶどう確率を変化させた時の出玉率をシミュレーションを行います。 とは言っても、以前作成した...

スランプグラフから設定判別してくれるなんちゃってAI

イメージ
突然ですが、ジャグラーで↓のスランプグラフの時、設定はいくつだと思いますか? きっと大多数の方が「設定6」と答えるのではないでしょうか? では、こちらはどうでしょう? はい、「設定1」ですよね。 これってたぶん、我々スロッターの頭の中では過去に見てきたたくさんのスランプグラフが脳にインプットされていて、そこから今見たスランプグラフがどの記憶に似ているかで判断していると思います。 今回はこれをコンピュータにやらせてみたい! ということで、スランプグラフから設定判別してくれるなんちゃってAIを作成したいと思います。 (あくまでも素人が思いつきで作ったようなレベルなので、緩い目でご覧ください。) 今回はマイジャグラーⅢを例に、スランプグラフの傾向から設定判別してみます。 はじめに 今回は以下の流れで実験を行います。 1. 判別したいスランプグラフを作成 2. 設定ごとのビッグデータ(スロッターの脳にあるたくさんのスランプグラフの記憶)を作成 3. 判別したいスランプグラフに似た傾向がビッグデータ内にどれくらいあるかを確認 4. 各設定のビッグデータ内で、近いデータがいっぱい見つかった設定が今回の設定!(のはず。) 当然「3. 判別したいスランプグラフに似た傾向がビッグデータ内にどれくらいあるかを確認」が最も大事になってきますが、今回は「相互相関」という手法を使って検証していきます。 どうやってスランプグラフの傾向を評価するか?(相互相関) 「相互相関」とは、ある2つのデータの類似度を評価する手法です。 例によってpythonでは↓の1行で計算してくれるわけですが、せっかくなので中身の計算のイメージだけでもつかんでおきたいと思います。 np.corrcoef(ビッグデータから1日分抜き出したデータ, 1日分のスランプグラフ)[0,1] 「相互相関」の中身の計算は、「内積」とほぼ同じなので、「内積」の計算について説明します。 「内積」は線形代数で勉強したあの「内積」で、以下の計算式で求められます。 ↑の式をcosθの式に直すと、↓のようになります。 この式が「相互相関」でやっていることとほぼ同じです。 ちょっと式を見てもわからないので、下図に例を計算してみました。 ベクトルだと考えると理解しにくいですが、スランプグラ...

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

イメージ
前編に引き続きスランプグラフから差枚数を自動算出するツールを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...