MultiAgent gym environment for reinforcement learning
Project description
Installation
git clone https://github.com/khoda81/tankwar.git
cd tankwar
pip install -e
or
pip install git+https://github.com/khoda81/tankwar.git
Keyboard
- Environment:
- Esc : set
env.done
toTrue
(end episode on next step) - F : toggle limited frame rate
- Esc : set
- HumanAgent:
- W A S D : movement
- Q E : rotate turret
- Space : toggle shooting
- Left Mouse Button : start shooting when pressed and stop shooting
- Script:
- G : toggle window update (disabling window update will blur window and increase performance)
Basic Usage
from tankwar.agents import HumanAgent, RandomAgent
from tankwar.envs import TankWarEnv
def main():
random_agents = 2
# create environment
env = TankWarEnv(random_agents + 1, shape=(200, 200))
w, h = env.shape
# create agents
agents = [HumanAgent(env)] + [RandomAgent(env) for _ in range(random_agents)]
# initialize a window with the height of 200
# width is calculated based on env.shape
# limit frame rate to 60 if a human is playing
env.init_window(600, True)
done = False
# reset environment
observations = env.reset()
while True:
env.render("human") # render to screen
actions = [
agent.act((None, None), 0, done)
for agent in agents
]
observations, rewards, done, info = env.step(actions)
if done:
break
if __name__ == "__main__":
main()
Main Usage
import time
import pygame
import torch
from torch.nn.functional import interpolate
from tqdm import tqdm
from tankwar.agents import HumanAgent, RandomAgent
from tankwar.envs import TankWarEnv
MAX_EPISODE_STEPS = 5000
def main():
random_agents = 2
human_agent = True # whether or not a human is currently playing
display_to_human = human_agent
# create environment
env = TankWarEnv(random_agents + human_agent, shape=(200, 200))
w, h = env.shape
# create agents
agents = (
[HumanAgent(env)] * human_agent +
[RandomAgent(env) for _ in range(random_agents)])
# initialize a window with the height of 200
# width is calculated based on env.shape
# limit frame rate to 60 if a human is playing
env.init_window(h, human_agent)
padded_frame = torch.zeros(3, w + 200, h + 200)
observations = env.reset()
done = False
rewards = [0] * env.n
s = time.time()
for _ in tqdm(range(MAX_EPISODE_STEPS), unit="step"):
# render to screen
if display_to_human:
env.render("human")
# convert frame to pytorch tensor with shape (3, height, width)
# frames are cached and will be rendered once per step
frame_torch = env.render("rgb_array_torch")
# each frame will be down sampled to (w, h)
if env.window_scale != 1:
frame_torch = interpolate(frame_torch.reshape(1, *frame_torch.shape), (h, w))[0]
# with 100 pixels padding on each side:
padded_frame[:, 100:-100, 100:-100] = frame_torch
# image that each agent can see
images = []
for i, tank in enumerate(env.tanks):
x, y = tank.body.position.int_tuple
images.append(padded_frame[:, y:y + 200, x:x + 200])
actions = [
agent.act((observation, image), reward, done)
for agent, observation, image, reward
in zip(agents, observations, images, rewards)
]
observations, rewards, done, info = env.step(actions)
# if g is pressed screen is toggled
# disabling screen will make rendering faster
# because copying frame to window takes time
for event in env.events:
if event.type == pygame.KEYDOWN and event.key == pygame.K_g:
display_to_human = not display_to_human
if not display_to_human:
env.blur_window()
if done:
break
print(f"Episode took {time.time() - s:.2f} seconds.")
if __name__ == "__main__":
main()
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
tankwar-env-1.0.0.tar.gz
(9.7 kB
view hashes)
Built Distribution
Close
Hashes for tankwar_env-1.0.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8e4524bd70b2be9069ead8be57508cbf55df25536126cef445da54e47848dfee |
|
MD5 | 038881abd070f77fcaee1cc6982cec16 |
|
BLAKE2b-256 | ed07464e8743ae3ea102a6ab39d522b908115d16bb87dba1cd9c33822fb9e145 |