Pong Game
強化学習のトライアルとして、ビデオゲームを題材に取り上げます。本来はインベーダーゲームを対象としたいのですが複雑であるため、比較的単純なPongとします。
Youtubeで動作画像を探すとこのような動画が見つかりました。
図690.1 CmodA7toPMODボード回路図
これを参考にしつつ、bsvによりプログラミングを行います。
Sound
強化学習本来の目的ではサウンドは不要ですが、ゲームとしての完成度のためにサウンドも実装します。サウンドコントローラであるSoundFSMやその周りの回路は開発済みなので、サウンド実装の工数はサウンド収集加工以外にはほとんどかかりません。そこでサウンドの収集から始めます。
サウンドフォーマット等の参考にする過去記事はこれです。
まずWindows+Gによりゲームバーを呼び出し上記動画の動画をキャプチャします。次にffmpegによりwaveに変換します。変換コマンドは次のとおりです。audacityはmp4を読み込めないため、ffmpegを用います。
\$ffmpeg -i input.mp4 output.wav
これをaudacityにより編集し以下の4つのサウンドを取得します。
表690.1 4種のサウンド
コード |
種類 |
1 |
発射音 |
2 |
パドル |
3 |
壁 |
4 |
アウト |
ffmpegを用いるとINFO等の余分な情報が削除できずハードウエアが読み込めません。よってaudacityでサウンドデータを開き、
- 音量をノーマライズ。イフェクト⇒音量⇒ノーマライズとします。
- メタデータを全て削除
- 形式はwav (microsoft)
- チャンネルはモノラル
- サンプリングは11025 Hz
- エンコーディングはUnsigned 8-bit PCM
としてエクスポートします。
ここで各ファイルサイズを見ると、
\$ ls -l s?.wav
-rwxrwx--- 1 root vboxsf 1610 10月 29 21:10 s1o.wav
-rwxrwx--- 1 root vboxsf 900 10月 29 21:10 s2o.wav
-rwxrwx--- 1 root vboxsf 872 10月 29 21:13 s3o.wav
-rwxrwx--- 1 root vboxsf 4388 10月 29 21:11 s4o.wav
以上からROMの構成表を作成すれば、
表690.2 ROM構成表
Code |
Sound |
Start
| Size [bytes] |
Entry=Start+16 |
1 |
発射音 |
0 |
1,610 |
0+16 |
2 |
パドル |
1,610 |
900 |
1,610+16 |
3 |
壁 |
1,610+900 |
872 |
(1,610+900)+16 |
4 |
アウト |
1,610+900+872 |
4,388 |
(1,610+900+872)+16 |
合計 [bytes] (16KB ROM使用率) |
7,770 (95%) |
となります。各サウンドのエントリは表の黄色で示したアドレスであり、これを次のようにbsvでFSM内に記述します(次ページにFSMの全リストを掲載)。
// Format decoding
//
action
case (current)
`SOUND1: romaddr <= 0 + 16;
`SOUND2: romaddr <= 1610 + 16;
`SOUND3: romaddr <= (1610 + 900) + 16;
`SOUND4: romaddr <= (1610 + 900 + 872) +16;
endcase
endaction
前のブログ
次のブログ