Adsense

2018年1月13日土曜日

Spring Statemachineを使ってドラクエ11のポーカーを自動プレイするプログラムを作ってロイヤルストレートスライムを出すまでの道のり 第1回

PS4版ドラゴンクエスト11(以下、ドラクエ11)のポーカーで、ロイヤルストレートスライムを出すまで自動実行するツールをSpring Boot + Spring Statemachine で作ろうという連載企画。
第1回は準備編です。(どうしてこんなものを作ろうと思ったのかを書いているだけなので、あまり読む必要はないです)

あくまでSpring Statemachineの勉強が目的なので、ツールは大した出来にはならないと思います。お察しください。

ロイヤルストレートスライムって?

ドラクエ11のカジノではポーカーがプレイできますが、そのポーカーで最強の役として設定されているのがロイヤルストレートスライムです。

通常のポーカーではロイヤルストレートフラッシュという役が最強ですが、ドラクエ11のポーカーではさらに上の役として、ロイヤルストレートフラッシュの各5枚のカードをスライムのマークで統一した「ロイヤルストレートスライム」という独自の役を定義しています。ロイヤルストレートフラッシュよりもさらに低確率の超レアな役です。
スライムの10、J、Q、K、A が揃えばロイヤルストレートスライム

称号コンプにはロイヤルストレートスライムを出す必要がある 

ドラクエ11では称号というやりこみ要素があり、ある条件を満たすと称号を獲得することができます。
その称号の中に、カジノでロイヤルストレートスライムを出さないと取ることができない「ロイヤルスライマー」という鬼畜極まりない称号が存在します。(なんでこんな称号を設定するのかね・・・)

別に称号を取っても得することはないのでただの自己満足なのですが、やはりできることならコンプリートしたいのです。

ロイヤルストレートスライムってどれくらいやれば出せるの?

運次第ですが、ネットで調べてみると2~3時間で出た人から15時間かかった人、さらにそれ以上の時間をかけているけどまだ出てない人、など・・・やはりとにかく低確率な模様です。

数十時間もPS4のコントローラを操作してポーカーをやり続ける・・・これは人間のやる作業なのか?コンピュータになんとか自動実行させることはできないものか?

ということで、ポーカーを自動実行させるツールの実現性について、妄想をし始めました。

どうやってコンピュータにやらせる?

PS4はゲーム機です。ゲーム機の自動実行を実現するなんて、不可能ではないのでしょうが、知識のない私にはとても無理です。なんとかしてPCの世界に土俵を持ってこないと・・・。

そこで、PS4リモートプレイを使います。

PS4リモートプレイは公式に提供されているアプリケーションで、Windows/Mac上でリモートのPS4につないでゲームをプレイできるという超すごいやつです。

一度、実家から遠く離れた自宅のPS4につないでゲームをやってみましたが本当に感動しました。まぁ、遅延があったり接続が切れたりするので、現実的にそこまでしてプレイするか?というと微妙ですが。

PS4リモートプレイを使えばキーボードで操作できますし、プログラミングで自動実行を実現できそうです。

操作はJavaのRobot APIで

低レベルプログラマの私はJavaしかまともに使えませんので、今回もJavaでなんとかします。

キーボードやマウスの操作はJava標準で備わっているRobot APIが使えそうです。
画面キャプチャもできるので、画面の確認にも使えそうです。

状態遷移マシンが必要だ

ドラクエ11のポーカーを注意深くやってみると分かるのですが、ほとんどの場合○ボタン(PS4リモートプレイだとEnterキーでもよい)さえ押していればポーカーが進行していくようになっています。

○ボタン連打だけで進行しないのは、最初のカードが5枚配られたときです。
この時だけは左右キーと○ボタンを使って残すカードを選択し、下キーを押して「くばる」ボタンにカーソルを合わせ、○ボタンを押す、という操作が必要になってきます。

つまり、今から作ろうとしているツールは「カードが配られた状態」を認識し、操作を切り替える必要があるということです。

状態に応じてアクションを切り替えるということは、状態遷移マシンの考え方が使えそうです。

そう言えば、Spring Frameworkの関連プロジェクトでSpring Statemachineというマニアックなやつがあったよな・・・。

Spring Statemachineの導入

Spring Statemachine はSpring Frameworkの関連プロジェクトで、状態遷移を扱うことができるフレームワークです。

これまでその存在は知っていて、いつか勉強がてら使ってみたいと思っていたのですが、なかなかいい機会がありませんでした。
しかし、今回のこのツールがSpring Statemachineを勉強するいい題材となりそうです。

実際のところ、時間をかけてこんなツールを作るなんて時間の無駄なので、実現性の妄想だけで終わる予定でしたが、Spring Statemachineの勉強という大義名分が立つなら話は別です。
実際にツールを実装してみようということになりました。

使用する技術のまとめ

  • PS4リモートプレイ: PC上でPS4を操作するために使用
  • Java: プログラミング言語として使用
  • Java Robot API: キーボード・マウスの操作、画面キャプチャに使用
  • Spring Boot: アプリケーションの基盤として使用
  • Spring Statemachine: 状態遷移の管理に使用
道具は揃った。


次回からSpring Statemachineを少し触ってみます。

2016年10月22日土曜日

HTML / XHTML タグの閉じタグ

<br>, <img>, <meta> のように子要素がないタグの書き方について、いつも忘れるのでメモ。
Another HTML-lint 5 で確認。

HTML4

  • ○: <br>
  • ×: <br/>
  • ×: <br></br>

XHTML

  • ×: <br>
  • ○: <br/>
  • ○: <br></br>

 HTML5

  • ○: <br>
  • ○: <br/>
  • ×: <br></br>

2016年10月1日土曜日

FreeMindが起動しない

久しぶりにFreeMindを起動したらエラー



"The registry refers to a nonexistent Java Runtime Environment installation or the runtime is corrupted."
指定されたファイルが見つかりません。

環境
  • Windows7 SP1 64bit
  • Java 1.8.0_102 (64bit)
  • FreeMind 1.0.1

色々調べたけれども治らなかったので、JDKをすべて消してからインストールし直したら起動した。
  1. コントロールパネルから全てのJDK,JREをアンインストール
  2. "C:\Program Files\Java" ディレクトリを削除
  3. "C:\Program Files (x86)\Java" ディレクトリを削除
  4. Oracleのページから最新のJDKをダウンロードしてインストール

2016年9月27日火曜日

Spring Bootでlogbackの設定

ログレベルの変更やログ出力先の指定程度であれば、application.propertiesで可能。
設定できる主なプロパティは以下。(logback以外のロギングライブラリだと使えないプロパティもある)

  • logging.file
    • ログファイル出力先(ファイル名まで指定)
  • logging.path
    • ログファイル出力先(ディレクトリを指定。ファイル名はspring.logになる )
  • logging.pattern.console
    • コンソール出力ログのレイアウトパターン指定
  • logging.pattern.file
    • ファイル出力ログのレイアウトパターン指定 
  • logging.pattern.level
    • ログレベルの表示パターン指定。デフォルトは %5p

本格的にlogbackの設定をしたい場合は、クラスパス直下に logback.xml を配置してセッティングすればよい。

デバッグ 

ログレベルをデバッグにする場合は簡易な方法がある。以下の2通りのうちどちらかを実施すればよい。
  1. application.properties で "debug=true" を記述
  2. 起動時オプションで "--debug" を指定
$ java -jar myapp.jar --debug

参考

Spring Boot Reference - Logging