diff --git a/gym/envs/toy_text/blackjack.py b/gym/envs/toy_text/blackjack.py index 1e2c7b486..312bb8e45 100644 --- a/gym/envs/toy_text/blackjack.py +++ b/gym/envs/toy_text/blackjack.py @@ -1,4 +1,8 @@ from typing import Optional +import os + +import numpy as np +import pygame import gym from gym import spaces @@ -75,6 +79,8 @@ class BlackjackEnv(gym.Env): http://incompleteideas.net/book/the-book-2nd.html """ + metadata = {"render.modes": ["human", "rgb_array"]} + def __init__(self, natural=False, sab=False): self.action_space = spaces.Discrete(2) self.observation_space = spaces.Tuple( @@ -124,3 +130,107 @@ class BlackjackEnv(gym.Env): self.dealer = draw_hand(self.np_random) self.player = draw_hand(self.np_random) return self._get_obs() + + def render(self, mode="human"): + player_sum, dealer_card_value, usable_ace = self._get_obs() + screen_width, screen_height = 600, 500 + card_img_height = screen_height // 3 + card_img_width = int(card_img_height * 142 / 197) + spacing = screen_height // 20 + + bg_color = (7, 99, 36) + white = (255, 255, 255) + + if not hasattr(self, "screen"): + if mode == "human": + pygame.init() + self.screen = pygame.display.set_mode((screen_width, screen_height)) + else: + pygame.font.init() + self.screen = pygame.Surface((screen_width, screen_height)) + + self.screen.fill(bg_color) + + def get_image(path): + cwd = os.path.dirname(__file__) + image = pygame.image.load(cwd + "/" + path) + return image + + def get_font(path, size): + cwd = os.path.dirname(__file__) + font = pygame.font.Font((cwd + "/" + path), size) + return font + + small_font = get_font( + os.path.join("font", "Minecraft.ttf"), screen_height // 15 + ) + dealer_text = small_font.render( + "Dealer: " + str(dealer_card_value), True, white + ) + dealer_text_rect = self.screen.blit(dealer_text, (spacing, spacing)) + + suits = ["C", "D", "H", "S"] + dealer_card_suit = self.np_random.choice(suits) + + if dealer_card_value == 1: + dealer_card_value_str = "A" + elif dealer_card_value == 10: + dealer_card_value_str = self.np_random.choice(["J", "Q", "K"]) + else: + dealer_card_value_str = str(dealer_card_value) + + def scale_card_img(card_img): + return pygame.transform.scale(card_img, (card_img_width, card_img_height)) + + dealer_card_img = scale_card_img( + get_image( + os.path.join("img", dealer_card_suit + dealer_card_value_str + ".png") + ) + ) + dealer_card_rect = self.screen.blit( + dealer_card_img, + ( + screen_width // 2 - card_img_width - spacing // 2, + dealer_text_rect.bottom + spacing, + ), + ) + + hidden_card_img = scale_card_img(get_image(os.path.join("img", "Card.png"))) + self.screen.blit( + hidden_card_img, + ( + screen_width // 2 + spacing // 2, + dealer_text_rect.bottom + spacing, + ), + ) + + player_text = small_font.render("Player", True, white) + player_text_rect = self.screen.blit( + player_text, (spacing, dealer_card_rect.bottom + 1.5 * spacing) + ) + + large_font = get_font(os.path.join("font", "Minecraft.ttf"), screen_height // 6) + player_sum_text = large_font.render(str(player_sum), True, white) + player_sum_text_rect = self.screen.blit( + player_sum_text, + ( + screen_width // 2 - player_sum_text.get_width() // 2, + player_text_rect.bottom + spacing, + ), + ) + + if usable_ace: + usable_ace_text = small_font.render("usable ace", True, white) + self.screen.blit( + usable_ace_text, + ( + screen_width // 2 - usable_ace_text.get_width() // 2, + player_sum_text_rect.bottom + spacing // 2, + ), + ) + if mode == "human": + pygame.display.update() + else: + return np.transpose( + np.array(pygame.surfarray.pixels3d(self.screen)), axes=(1, 0, 2) + ) diff --git a/gym/envs/toy_text/font/Minecraft.ttf b/gym/envs/toy_text/font/Minecraft.ttf new file mode 100644 index 000000000..85c14725a Binary files /dev/null and b/gym/envs/toy_text/font/Minecraft.ttf differ diff --git a/gym/envs/toy_text/img/C2.png b/gym/envs/toy_text/img/C2.png new file mode 100644 index 000000000..56c446d4a Binary files /dev/null and b/gym/envs/toy_text/img/C2.png differ diff --git a/gym/envs/toy_text/img/C3.png b/gym/envs/toy_text/img/C3.png new file mode 100644 index 000000000..f496d19c2 Binary files /dev/null and b/gym/envs/toy_text/img/C3.png differ diff --git a/gym/envs/toy_text/img/C4.png b/gym/envs/toy_text/img/C4.png new file mode 100644 index 000000000..d8f10f216 Binary files /dev/null and b/gym/envs/toy_text/img/C4.png differ diff --git a/gym/envs/toy_text/img/C5.png b/gym/envs/toy_text/img/C5.png new file mode 100644 index 000000000..3382e2302 Binary files /dev/null and b/gym/envs/toy_text/img/C5.png differ diff --git a/gym/envs/toy_text/img/C6.png b/gym/envs/toy_text/img/C6.png new file mode 100644 index 000000000..ab19dc3f3 Binary files /dev/null and b/gym/envs/toy_text/img/C6.png differ diff --git a/gym/envs/toy_text/img/C7.png b/gym/envs/toy_text/img/C7.png new file mode 100644 index 000000000..19bf11c59 Binary files /dev/null and b/gym/envs/toy_text/img/C7.png differ diff --git a/gym/envs/toy_text/img/C8.png b/gym/envs/toy_text/img/C8.png new file mode 100644 index 000000000..1fd6f80db Binary files /dev/null and b/gym/envs/toy_text/img/C8.png differ diff --git a/gym/envs/toy_text/img/C9.png b/gym/envs/toy_text/img/C9.png new file mode 100644 index 000000000..41a6431f9 Binary files /dev/null and b/gym/envs/toy_text/img/C9.png differ diff --git a/gym/envs/toy_text/img/CA.png b/gym/envs/toy_text/img/CA.png new file mode 100644 index 000000000..006f9841e Binary files /dev/null and b/gym/envs/toy_text/img/CA.png differ diff --git a/gym/envs/toy_text/img/CJ.png b/gym/envs/toy_text/img/CJ.png new file mode 100644 index 000000000..b948a0f07 Binary files /dev/null and b/gym/envs/toy_text/img/CJ.png differ diff --git a/gym/envs/toy_text/img/CK.png b/gym/envs/toy_text/img/CK.png new file mode 100644 index 000000000..9db8c772e Binary files /dev/null and b/gym/envs/toy_text/img/CK.png differ diff --git a/gym/envs/toy_text/img/CQ.png b/gym/envs/toy_text/img/CQ.png new file mode 100644 index 000000000..fc23d8538 Binary files /dev/null and b/gym/envs/toy_text/img/CQ.png differ diff --git a/gym/envs/toy_text/img/CT.png b/gym/envs/toy_text/img/CT.png new file mode 100644 index 000000000..bde8478dc Binary files /dev/null and b/gym/envs/toy_text/img/CT.png differ diff --git a/gym/envs/toy_text/img/Card.png b/gym/envs/toy_text/img/Card.png new file mode 100644 index 000000000..04ec431da Binary files /dev/null and b/gym/envs/toy_text/img/Card.png differ diff --git a/gym/envs/toy_text/img/D2.png b/gym/envs/toy_text/img/D2.png new file mode 100644 index 000000000..2b4babadf Binary files /dev/null and b/gym/envs/toy_text/img/D2.png differ diff --git a/gym/envs/toy_text/img/D3.png b/gym/envs/toy_text/img/D3.png new file mode 100644 index 000000000..25e2e2e03 Binary files /dev/null and b/gym/envs/toy_text/img/D3.png differ diff --git a/gym/envs/toy_text/img/D4.png b/gym/envs/toy_text/img/D4.png new file mode 100644 index 000000000..f33e33dd6 Binary files /dev/null and b/gym/envs/toy_text/img/D4.png differ diff --git a/gym/envs/toy_text/img/D5.png b/gym/envs/toy_text/img/D5.png new file mode 100644 index 000000000..dce581381 Binary files /dev/null and b/gym/envs/toy_text/img/D5.png differ diff --git a/gym/envs/toy_text/img/D6.png b/gym/envs/toy_text/img/D6.png new file mode 100644 index 000000000..59fa18072 Binary files /dev/null and b/gym/envs/toy_text/img/D6.png differ diff --git a/gym/envs/toy_text/img/D7.png b/gym/envs/toy_text/img/D7.png new file mode 100644 index 000000000..35b733bce Binary files /dev/null and b/gym/envs/toy_text/img/D7.png differ diff --git a/gym/envs/toy_text/img/D8.png b/gym/envs/toy_text/img/D8.png new file mode 100644 index 000000000..ee777f97a Binary files /dev/null and b/gym/envs/toy_text/img/D8.png differ diff --git a/gym/envs/toy_text/img/D9.png b/gym/envs/toy_text/img/D9.png new file mode 100644 index 000000000..5b3936889 Binary files /dev/null and b/gym/envs/toy_text/img/D9.png differ diff --git a/gym/envs/toy_text/img/DA.png b/gym/envs/toy_text/img/DA.png new file mode 100644 index 000000000..23b581158 Binary files /dev/null and b/gym/envs/toy_text/img/DA.png differ diff --git a/gym/envs/toy_text/img/DJ.png b/gym/envs/toy_text/img/DJ.png new file mode 100644 index 000000000..6ca59058f Binary files /dev/null and b/gym/envs/toy_text/img/DJ.png differ diff --git a/gym/envs/toy_text/img/DK.png b/gym/envs/toy_text/img/DK.png new file mode 100644 index 000000000..25d4acedc Binary files /dev/null and b/gym/envs/toy_text/img/DK.png differ diff --git a/gym/envs/toy_text/img/DQ.png b/gym/envs/toy_text/img/DQ.png new file mode 100644 index 000000000..a56f982e9 Binary files /dev/null and b/gym/envs/toy_text/img/DQ.png differ diff --git a/gym/envs/toy_text/img/DT.png b/gym/envs/toy_text/img/DT.png new file mode 100644 index 000000000..c94858b02 Binary files /dev/null and b/gym/envs/toy_text/img/DT.png differ diff --git a/gym/envs/toy_text/img/H2.png b/gym/envs/toy_text/img/H2.png new file mode 100644 index 000000000..466c0f352 Binary files /dev/null and b/gym/envs/toy_text/img/H2.png differ diff --git a/gym/envs/toy_text/img/H3.png b/gym/envs/toy_text/img/H3.png new file mode 100644 index 000000000..66b71ccac Binary files /dev/null and b/gym/envs/toy_text/img/H3.png differ diff --git a/gym/envs/toy_text/img/H4.png b/gym/envs/toy_text/img/H4.png new file mode 100644 index 000000000..57ff831f7 Binary files /dev/null and b/gym/envs/toy_text/img/H4.png differ diff --git a/gym/envs/toy_text/img/H5.png b/gym/envs/toy_text/img/H5.png new file mode 100644 index 000000000..64e37dceb Binary files /dev/null and b/gym/envs/toy_text/img/H5.png differ diff --git a/gym/envs/toy_text/img/H6.png b/gym/envs/toy_text/img/H6.png new file mode 100644 index 000000000..61a1ea4ff Binary files /dev/null and b/gym/envs/toy_text/img/H6.png differ diff --git a/gym/envs/toy_text/img/H7.png b/gym/envs/toy_text/img/H7.png new file mode 100644 index 000000000..346d0a572 Binary files /dev/null and b/gym/envs/toy_text/img/H7.png differ diff --git a/gym/envs/toy_text/img/H8.png b/gym/envs/toy_text/img/H8.png new file mode 100644 index 000000000..dc8dca2f6 Binary files /dev/null and b/gym/envs/toy_text/img/H8.png differ diff --git a/gym/envs/toy_text/img/H9.png b/gym/envs/toy_text/img/H9.png new file mode 100644 index 000000000..3f92346e0 Binary files /dev/null and b/gym/envs/toy_text/img/H9.png differ diff --git a/gym/envs/toy_text/img/HA.png b/gym/envs/toy_text/img/HA.png new file mode 100644 index 000000000..2f8854de2 Binary files /dev/null and b/gym/envs/toy_text/img/HA.png differ diff --git a/gym/envs/toy_text/img/HJ.png b/gym/envs/toy_text/img/HJ.png new file mode 100644 index 000000000..3930ff3f0 Binary files /dev/null and b/gym/envs/toy_text/img/HJ.png differ diff --git a/gym/envs/toy_text/img/HK.png b/gym/envs/toy_text/img/HK.png new file mode 100644 index 000000000..ed169c8d2 Binary files /dev/null and b/gym/envs/toy_text/img/HK.png differ diff --git a/gym/envs/toy_text/img/HQ.png b/gym/envs/toy_text/img/HQ.png new file mode 100644 index 000000000..06388f6fa Binary files /dev/null and b/gym/envs/toy_text/img/HQ.png differ diff --git a/gym/envs/toy_text/img/HT.png b/gym/envs/toy_text/img/HT.png new file mode 100644 index 000000000..02724791e Binary files /dev/null and b/gym/envs/toy_text/img/HT.png differ diff --git a/gym/envs/toy_text/img/S2.png b/gym/envs/toy_text/img/S2.png new file mode 100644 index 000000000..09eaccc3e Binary files /dev/null and b/gym/envs/toy_text/img/S2.png differ diff --git a/gym/envs/toy_text/img/S3.png b/gym/envs/toy_text/img/S3.png new file mode 100644 index 000000000..ba094d549 Binary files /dev/null and b/gym/envs/toy_text/img/S3.png differ diff --git a/gym/envs/toy_text/img/S4.png b/gym/envs/toy_text/img/S4.png new file mode 100644 index 000000000..4090e1197 Binary files /dev/null and b/gym/envs/toy_text/img/S4.png differ diff --git a/gym/envs/toy_text/img/S5.png b/gym/envs/toy_text/img/S5.png new file mode 100644 index 000000000..230db548f Binary files /dev/null and b/gym/envs/toy_text/img/S5.png differ diff --git a/gym/envs/toy_text/img/S6.png b/gym/envs/toy_text/img/S6.png new file mode 100644 index 000000000..2189d5b99 Binary files /dev/null and b/gym/envs/toy_text/img/S6.png differ diff --git a/gym/envs/toy_text/img/S7.png b/gym/envs/toy_text/img/S7.png new file mode 100644 index 000000000..5b859dfed Binary files /dev/null and b/gym/envs/toy_text/img/S7.png differ diff --git a/gym/envs/toy_text/img/S8.png b/gym/envs/toy_text/img/S8.png new file mode 100644 index 000000000..26e6b7138 Binary files /dev/null and b/gym/envs/toy_text/img/S8.png differ diff --git a/gym/envs/toy_text/img/S9.png b/gym/envs/toy_text/img/S9.png new file mode 100644 index 000000000..d69a68350 Binary files /dev/null and b/gym/envs/toy_text/img/S9.png differ diff --git a/gym/envs/toy_text/img/SA.png b/gym/envs/toy_text/img/SA.png new file mode 100644 index 000000000..bd136074b Binary files /dev/null and b/gym/envs/toy_text/img/SA.png differ diff --git a/gym/envs/toy_text/img/SJ.png b/gym/envs/toy_text/img/SJ.png new file mode 100644 index 000000000..3adc3a90b Binary files /dev/null and b/gym/envs/toy_text/img/SJ.png differ diff --git a/gym/envs/toy_text/img/SK.png b/gym/envs/toy_text/img/SK.png new file mode 100644 index 000000000..5948ae521 Binary files /dev/null and b/gym/envs/toy_text/img/SK.png differ diff --git a/gym/envs/toy_text/img/SQ.png b/gym/envs/toy_text/img/SQ.png new file mode 100644 index 000000000..9fb503770 Binary files /dev/null and b/gym/envs/toy_text/img/SQ.png differ diff --git a/gym/envs/toy_text/img/ST.png b/gym/envs/toy_text/img/ST.png new file mode 100644 index 000000000..7e4a12a0f Binary files /dev/null and b/gym/envs/toy_text/img/ST.png differ diff --git a/requirements.txt b/requirements.txt index 9ee702426..7a310af04 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,5 +5,6 @@ mujoco_py>=1.50, <2.0 scipy>=1.4.1 numpy>=1.18.0 pyglet>=1.4.0 +pygame==2.1.0 cloudpickle>=1.2.0 lz4>=3.1.0