デジホリのblog

釣りと自転車とDIYを愛するオヤジのブログ

タグ:Java

その昔、管理人が若かりし頃、パチンコ/パチスロにどハマりしていた時期がありました。
80年後半から90年代あたりでしょうか。
ハマっていた台は色々あるのですが、その中でアレパチのExciteというのがありました。

そもそもアレパチをあまり知らない方もいると思いますが、
特殊なパチンコ台で、1ゲーム16発打って盤面下にある1から16までの入賞口に特定のパターンで入ると賞球があるというようなものです。
で、権利が発生するとその特定パターンが簡単に成立するようになってジャンジャン球がでるという仕掛けになっています。
で、肝心の権利の抽選ですが、2桁のデジタルが3か7で揃うとアタッカーが数秒開き、Vに球が入ると権利発生、というような流れです。
この2桁のデジタルを回すトリガーは盤面中央にあるスーパーコンビの役物と同じなんだけど、奥の2つの穴がデジタル始動です。ちなみにスーパーコンビは手前の穴が大当たりなんだけどね。

このデジタルの当たりが極端に偏っていて、当たる時は無茶苦茶連チャンするのです。逆に当たらない時は気が遠くなるぐらい当たりません。

なぜか最近、Youtubeのおすすめ動画にExciteがやたらと出てくるのです。なので懐かしくて見ていました。
あのリーチ時の「ヒョーイ!」という音がかなり印象強く、脳汁垂れまくりです(笑)
YoutubeにあるExciteの紹介動画をサンプルで載せておきます。。。


なんてことをしているうちに、スマホでシミュレータ作ったら面白そうだと思い、早速作ってみました。



この動画はプロト版を撮影したものです。
見た目やマルチデバイス対応などしてPlayStoreにアップしました。→これ

モードが8つあり、1が天国モードです。
天国モードに入ると2/6でリーチ、1/6で大当たり、1/12でモード移行です。

実際動かしてみると、リアルでやっていた時の感覚と微妙に違う感じ。
天国モードにいるときはもっとリーチがガンガンかかるような記憶だったが。
もしかしたら、Javaの乱数生成に偏りがあるのかも。

しかし、これずっと見てても飽きないです。(笑)

ってかこのアプリ、何も宣伝していないので誰もダウンロードしてくれません。。。
誰かコメントしてくれると嬉しいなぁ。(笑)


Pokecom GOでゲームコントローラ(ゲームパッド)が使えるようにしてみた。
すごい快適になります。。。


 
ちなみに、Android端末はデフォルトでゲームコントローラ対応しているので、繋げれば普通に認識します。
アプリケーションでゲームコントローラのキー入力を拾うには、ハードキーイベントを受け取れる dispatchKeyEvent() もしくは onKeyDown()などのメソッドをOverrideして、特定のキー入力を検出したら内部処理を行えばいいだけです。Pokecom GOの場合はソフトキー入力処理を擬似的に行えば良いことになります。
割と簡単です。。。

ただし接続するコントローラの種類で、イベント発生時のキーコードに違いがあり、事前の調査に結構時間を費やしました。
あと動画にも映っていますが、十字キーを操作するとAndroidのシステムがボタンなどのオブジェクトのフォーカスを切り替える動きをします。これを消したいんだけどやり方がわかりませんでした。
dispatchKeyEvent()で処理をした後に、superクラスのメソッドを呼ばなければいいのかと思いましたが、そうではない感じです。
よくわからないし、とりあえず動いているのでこれでいいか。

また Pokecom GO ネタ。
Pokecom GO2 で RND関数の動作がおかしいよというフィードバックをもらいました。
どうやら、RND(X, Y)とやると、結果がいつも 0 になるそうな。。
ちなみに RND というのは Round のことで、Xに対して指定した桁Yで四捨五入するという関数です。
PB-100の仕様では、
Y=0で1の位を、
 -1で0.1の位を、
 -2で0.01の位を四捨五入します。

ということで、ソースコードをみてみたら、なんと!何も実装されていませんでした。びっくり。

慌てて実装し、PlayStore の更新も行いました。
指摘をくれた方、どうもありがとうございました。

ちなみに Java の場合、Math クラスに round というメソッドがありますが、桁の指定はできません。
桁を指定する場合は、先に10倍(1/10倍)してから Math.round して、その後元に戻す、みたいなことをしないといけません。
というか、少数を扱うので、普通に double 型で Math.round は使えません。
なので、BigDecimal の setScale で、BigDecimal.ROUND_HALF_UP を指定するやり方で実現します。なおここでは桁の指定もできますので。
ただ、Java の場合は、
 -1で1の位
 0で0.1の位
 1で0.01の位
の指定になるので、PB-100とは引数に違いがあります。

久しぶりにPokecom GO2ネタ。
ユーザーレビューでSIN 180 = 0.22e-16ってなるよというフィードバックをもらいました。
JavaのMath.sin()メソッドの引数はdouble型のラジアン値なので、180はMath.toRadians()でラジアン単位に変換して計算している。だから小数の値になってしまうので誤差が出るのは当たり前なんだけど。
COS, TANなども同じ。
このアプリを関数電卓として使う人なんていない(普通いないよね??)ので、あまり真面目にインプリしていなかったんだけど、ツッコミが入りました。。。
んーーーでも、どうやって対応しようかな。
degree値の場合は180の倍数ならば0にすればいいだけのような気がする。
radian値の場合はどうするんだろう。変数PIを検出するしかないのかな。ちょっと難しいな。

---
追記(2020/12/19)
radianの場合も普通にMath.PIで計算すればPIの倍数かどうかの計算ができた。
ということで 1.05.01で修正しました。

↑このページのトップヘ