``` /atropos-rock-paper-scissors-main.zip ``` repository structure: ``` atropos-rock-paper-scissors-main/ ├── atropos/ │ ├── __init__.py │ └── env.py ├── atropos_rock_paper_scissors/ │ ├── __init__.py │ └── env.py ├── pyproject.toml └── readme.md ``` ### `pyproject.toml` ```toml [project] name = "atropos-rock-paper-scissors" version = "0.1.0" description = "a rock-paper-scissors environment for the atropos rl library." dependencies = [ "gymnasium>=0.29.0", "numpy>=1.22.0", ] ``` ### `readme.md` ```markdown install the project dependencies: ```bash git clone https://your-repo-url/atropos-rock-paper-scissors.git cd atropos-rock-paper-scissors pip install -e . ``` use the environment: ```python from atropos_rock_paper_scissors.env import rockpaperscissorenv env = rockpaperscissorenv() observation, info = env.reset() for _ in range(5): random_action = env.action_space.sample() obs, reward, terminated, truncated, info = env.step(random_action) print(f"reward: {reward}") if terminated: obs, info = env.reset() ``` ``` ### `atropos/env.py` ```python import gymnasium as gym baseenv = gym.env ``` ### `atropos_rock_paper_scissors/env.py` ```python import gymnasium as gym from gymnasium import spaces import numpy as np from atropos.env import baseenv class rockpaperscissorenv(baseenv): metadata = {} def __init__(self): super().__init__() self.action_space = spaces.discrete(3) self.observation_space = spaces.discrete(4) self._opponent_last_action = 3 def reset(self, seed=none, options=none): super().reset(seed=seed) self._opponent_last_action = 3 return self._get_obs(), self._get_info() def step(self, action): opponent_action = self.action_space.sample() if action == opponent_action: reward = 0 elif (action - opponent_action) % 3 == 1: reward = 1 else: reward = -1 self._opponent_last_action = opponent_action terminated = true return self._get_obs(), reward, terminated, false, self._get_info() def _get_obs(self): return self._opponent_last_action def _get_info(self): return {"opponent_action": self._opponent_last_action} def close(self): pass ```