Refactoring lab

This commit is contained in:
Chris Proctor
2026-06-26 13:27:11 -04:00
parent e752bb848b
commit a9385f8296
32 changed files with 644 additions and 686 deletions

41
games/babysnake/train.py Normal file
View File

@@ -0,0 +1,41 @@
"""Train a Q-learning agent to play BabySnake, then watch it play.
Run this file to train and watch:
python train_babysnake.py
This module wires the generic Q-learning algorithm in q_learning.py up to
BabySnake specifically, using retro_gamer.GameEnvironment (configured by
babysnake/pyproject.toml's observation_function) as the environment.
"""
from q_learning import QLearning
from games import babysnake
from retro.input import ProgrammaticInput
from retro_gamer import GameEnvironment, GameMetadata
def train():
trainer = QLearning()
env = GameEnvironment(babysnake.create_game, GameMetadata.from_pyproject("games.babysnake"))
return trainer.train(env, babysnake.ACTIONS)
def watch(Q):
inp = ProgrammaticInput()
class PolicyInput:
"""An input source that picks actions from the Q-table."""
def collect(self):
state = babysnake.get_state(game)
q, action = sorted([(Q.get((state, a), 0), a) for a in babysnake.ACTIONS], reverse=True)[0]
inp.press(action)
return inp.collect()
game = babysnake.create_game()
game.play(input_source=PolicyInput())
if __name__ == '__main__':
print("Training Q-learning agent on BabySnake...")
Q = train()
print(f"\nDone. Q-table has {len(Q)} entries.")
print("\nWatching trained agent (press Enter or Escape to quit)...")
watch(Q)