import numpy as np from retro.views.headless import HeadlessView from retro_gamer.observation import egocentric_board, encode_board, encode_state CHARACTER_SET = ["@", "*", ">", "<", "^", "v"] RADIUS = 8 def egocentric_observation(game): """17×17 window centered on the snake's head, plus apple_dx and apple_dy.""" view = HeadlessView() view.on_game_start(game) view.render(game) head = game.get_agent_by_name("Snake head") cropped = egocentric_board(view.board_characters, head.position, RADIUS) board_vec = encode_board(cropped, CHARACTER_SET).flatten() extras = encode_state(game.state, ["apple_dx", "apple_dy"]) return np.concatenate([board_vec, extras])