def METHOD_NAME(self, actions):
    """
    step(action) takes in an action for each agent and should return the
    - observations
    - rewards
    - terminations
    - truncations
    - infos
    dicts where each dict looks like {agent_1: item_1, agent_2: item_2}
    """
    # If a user passes in actions with no agents, then just return empty observations, etc.
    if not actions:
        self.agents = []
        return {}, {}, {}, {}, {}
    # rewards for all agents are placed in the rewards dictionary to be returned
    rewards = {}
    rewards[self.agents[0]], rewards[self.agents[1]] = REWARD_MAP[
        (actions[self.agents[0]], actions[self.agents[1]])
    ]
    terminations = {agent: False for agent in self.agents}
    self.num_moves += 1
    env_truncation = self.num_moves >= NUM_ITERS
    truncations = {agent: env_truncation for agent in self.agents}
    # current observation is just the other player's most recent action
    observations = {
        self.agents[i]: int(actions[self.agents[1 - i]])
        for i in range(len(self.agents))
    }
    self.state = observations
    # typically there won't be any information in the infos, but there must
    # still be an entry for each agent
    infos = {agent: {} for agent in self.agents}
    if env_truncation:
        self.agents = []
    if self.render_mode == "human":
        self.render()
    return observations, rewards, terminations, truncations, infos