gym-super-mario-brosのマリオのスピードを取得する

gym-super-mario-brosのマリオの座標だけでなくスピードを取得する方法がわかったのでメモします。

方針

スーパーマリオのメモリマップからx方向とy方向のスピードを探し出して、取得します。

メモリマップの参考

Super Mario Bros.:RAM map - Data Crystal

A Comprehensive Super Mario Bros. Disassembly · GitHub

実装

下記のように SuperMarioBrosEnv クラスに x_speed メソッドと y_speed メソッドを実装します。 元々あった_x_positionメソッド_y_positionメソッドをマネしています。

def x_speed(self):
  s = self.ram[0x57]
  return s if s < 0x80 else s - 0x100

def y_speed(self):
  s = self.ram[0x9f]
  return s if s < 0x80 else s - 0x100

SuperMarioBrosEnv.x_speed = x_speed
SuperMarioBrosEnv.y_speed = y_speed

_x_position メソッドや _y_position メソッドと同様に _ で始まるメソッド名にしようかとも考えたのですが、そうするとWrapperクラスもメソッドを追加する手間が増えるので、 _ はつけませんでした。

今回のColab

colab.research.google.com

Colabの中で動かすとコマ送りできるので研究がはかどります。