「これプレイヤーが勝てないように仕組んでない?」
G'sアカデミーというプログラミングスクールを卒業しました。卒業生は再履修できるのでもう一周しています。
じゃんけんをJavascriptで作るという課題があり、ブラックジャックをKotlin Javascriptで作って提出しました(G'sの課題はカオスの塊)。チェックしてくれたスタッフのAさんに「昨日からプレイしているけど、1回も勝てていない。これプレイヤーが勝てないように仕組んでない?」と聞かれました。
そんな仕様にした記憶はなかったので、自分でも再度プレイしたのですが3勝10敗でした。確かにちょっと勝率が偏っているかもしれません。勝率が50%だとすると3勝10敗になる確率は3.5%くらい(数学苦手なので計算間違ってるかも)
検証しよう
たまたま運が悪かっただけかもしれないので、試行回数を1万回ぐらいに増やして勝率を計算してみましょう。手でポチポチするのはめんどくさいです。怠惰はプログラマの美徳です。めんどくさいことはプログラムにさせましょう。
という訳で、Seleniumに自分が作ったブラックジャックを1万回ぷれいさせることにしました。
私の環境とバージョン情報
今回は特に環境がハマりどころなので要注意(後述)
- OS: Windows10 1803
- intelliJ: 2019.3 Community Edition
- Kotlin: 1.3.41-release-150 (JRE 1.8.0_202-release-1483-b03)
- Selenium: selenium-server-standalone-3.141.59.jar
- Chrome: 79.0.3945.79
- Chrome driver: 79.0.3945.36
- npm: 6.9.0
テストしたいブラックジャック
https://nagashimam.github.io/BlackJack/
ソース:https://github.com/nagashimam/BlackJack
Seleniumスクリプト
ソース:https://github.com/nagashimam/BlackJackTest
スクリプトを書く際のハマりどころ
環境構築自体はたくさん記事があるので、私がハマったところについて。
Chromeとドライバーのバージョン
この2つの整合性が取れていないとTimeoutExceptionで強制終了になります。ドライバーのどのバージョンがどのChromeに対応しているかはドキュメントを参照してください
有効な Win32 アプリケーションではありません。
エラーメッセージを保存し忘れたので若干違うかもしれませんが、npmでドライバーをインストールすると、上記のエラーメッセージが出てスクリプトを実行できません
コマンドプロンプトで
where chromedriver
と打つと
(パス)/chromedriver
(パス)/chromedriver.cmd
と出てきました。正しい方法ではないかもしれませんが、私の環境ではchromedriver(cmdがついていない方)を削除すると動くようになりました。
検証結果
保存する前にブラウザを閉じてしまった(笑)ので、記憶違いかもしれませんが勝率は42%だったはずです。
1万回実行した後にスクリーンショットをとるようにスクリプトを変えたので、今晩もう一度実行してみます。
仮に勝率を40%とすると、3勝10敗になる確率は11%ほどなので、ありえなくはないかな、ぐらいの数字ですね。