Skip to content

Commit

Permalink
Add human rendering mode.
Browse files Browse the repository at this point in the history
  • Loading branch information
tristanrussell committed Apr 25, 2022
1 parent 35f7ff2 commit fb1586b
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 17 deletions.
Binary file modified .github/example_gif.gif
100644 → 100755
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ env = gym.make('SimpleTetris-v0',
width=10, # Width of Tetris grid
obs_type='ram', # ram | grayscale | rgb
extend_dims=False, # Extend ram or grayscale dimensions
render_mode='rgb_array', # Only supports rgb_array
render_mode='rgb_array', # Unused parameter
reward_step=False, # See reward table
penalise_height=False, # See reward table
penalise_height_increase=False, # See reward table
Expand All @@ -87,8 +87,9 @@ array will always be returned as 84 x 84 x 3. If using an observation type of
ram and `extend_dims` is set then an array of size width x height x 1 is
returned.

**Note: The environment only supports rendering as `rgb_array` at this time but a human
render option is planned in a future update.**
**Note: The default render mode is human. The `render_mode` parameter does not
alter the default render mode. To render using `rgb_array` then please use the
mode option when calling `env.render(mode='rgb_array')`.**

### Reward Table

Expand Down
42 changes: 30 additions & 12 deletions gym_simpletetris/envs/tetris_env.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import random
import gym
from gym import spaces
import pygame

# Adapted from the Tetris engine in the TetrisRL project by jaybutera
# https://github.com/jaybutera/tetrisRL
Expand Down Expand Up @@ -335,7 +336,7 @@ def __repr__(self):


class TetrisEnv(gym.Env):
metadata = {'render.modes': ['rgb_array']} # TODO: Add human
metadata = {'render.modes': ['human', 'rgb_array'], "render_fps": 8}

# TODO: Add more reward options e.g. wells
# TODO: Reorganise on next major release
Expand All @@ -359,6 +360,7 @@ def __init__(self,
self.obs_type = obs_type
self.extend_dims = extend_dims
self.render_mode = render_mode
self.window_size = 512

self.engine = TetrisEngine(width,
height,
Expand All @@ -373,6 +375,8 @@ def __init__(self,
penalise_holes_increase)

self.action_space = spaces.Discrete(7)
self.window = None
self.clock = None

if obs_type == 'ram':
if extend_dims:
Expand Down Expand Up @@ -428,22 +432,36 @@ def _observation(self, mode=None, state=None, extend_dims=None):
else:
return convert_grayscale_rgb(obs)

def render(self, mode=None):
new_mode = self.render_mode if mode is None else mode
def render(self, mode='human'):
if mode == 'human':
if self.window is None:
pygame.init()
pygame.display.init()
self.window = pygame.display.set_mode((self.window_size, self.window_size))
if self.clock is None:
self.clock = pygame.time.Clock()

if new_mode not in self.metadata.get('render.modes'):
print("Invalid render mode.")
return
obs = self.engine.render()
obs = np.transpose(obs)
obs = convert_grayscale(obs, self.window_size)
obs = convert_grayscale_rgb(obs)

pygame.pixelcopy.array_to_surface(self.window, obs)

obs = self.engine.render()
obs = convert_grayscale(obs, 160)
obs = convert_grayscale_rgb(obs)
canvas = pygame.surfarray.make_surface(obs)

if new_mode == 'rgb_array':
self.window.blit(canvas, canvas.get_rect())
pygame.event.pump()
pygame.display.update()

self.clock.tick(self.metadata["render_fps"])
elif mode == 'rgb_array':
obs = self.engine.render()
obs = convert_grayscale(obs, 160)
obs = convert_grayscale_rgb(obs)
return obs
else:
# TODO: Human mode
return
super(TetrisEnv, self).render(mode=mode)

def close(self):
del self.engine
5 changes: 3 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

setup(
name='gym_simpletetris',
version='0.3.0',
version='0.4.0',
author="Tristan Russell",
license='MIT',
description="A simple Tetris engine for OpenAI Gym",
Expand All @@ -16,7 +16,8 @@
"Bug Tracker": "https://github.com/tristanrussell/gym-simpletetris/issues",
},
install_requires=['gym>=0.21.0',
'numpy>=0.21.0'],
'numpy>=0.21.0',
'pygame>=2.1.0'],
classifiers=[
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.7",
Expand Down

0 comments on commit fb1586b

Please sign in to comment.