class TetrisExtraHardEnv(gym.Env): metadata = {'render.modes': ['human']} def __init__(self): self.t = Tetris() self.action_space = spaces.Discrete(5) self.observation_space = spaces.Tuple( (spaces.Discrete(32), spaces.Discrete(4))) self.seed() #act_space = [k for k in self.t.ACTION_MAP] #self.observation_space = (self.t.full_board(), self.t.active_squares()) def step(self, action): og_score = self.t.score self.t.take_action(action) obs = [move for move in self.t.ACTION_MAP] reward = self.t.score - og_score done = (self.t.score is 0) return obs, reward, done, {} def reset(self): self.t.__init__() def render(self, mode='human', close=False): self.t.print_board() def seed(self, seed=None): self.np_random, seed = seeding.np_random(seed) return [seed]
class TetrisEnv(discrete.DiscreteEnv): metadata = {'render.modes': ['human']} def __init__(self): self.t = Tetris() state_num = 2**( 4 * 8 ) * 4 * 4 * 9 * 5 # 4x8 board [filled or not], 4*9 active-shape locations, 4 rotation positions, 5 shape types action_num = 4 # rotate, left, right, step #P = {s : {a : [] for a in range(action_num)} for s in range(state_num)} init_state_dist = [] for x in range(4): for rot in range(4): for shape_type in range(5): init_state_dist.append(encode([0, 0, x, rot, shape_type])) init_state_dist = np.array(init_state_dist) #init_state_dist /= init_state_dist.sum() #super(TetrisEnv, self).__init__(state_num, action_num, P, init_state_dist) self.action_space = spaces.Discrete(5) self.observation_space = spaces.Tuple( (spaces.Discrete(2**(4 * 8)), spaces.Discrete(4 * 9), spaces.Discrete(4), spaces.Discrete(5))) size = 2**(4 * 8) * 4 * 4 * 9 * 5 #-int(-np.log(2**(4*8)*4*4*9*5)/np.log(2)) self.observation_space.shape = np.zeros(size, dtype=int) #spaces.Discrete((2**(4*8))*4*4*9*5) # 4x8 board [filled or not], 4*9 active-shape locations, 4 rotation positions, 5 shape types # #(np.zeros(2**(4*8)), np.zeros(4*9), np.zeros(4), np.zeros(5)) def step(self, action): og_score = self.t.score self.t.take_action(action) shape_y, shape_x = t.shape_loc obs = (self.t.ground, shape_y, shape_x, t) reward = self.t.score - og_score done = (self.t.score is 0) return self.encode(obs), reward, done, {} def reset(self): self.t.__init__() return 0 def render(self, mode='human', close=False): self.t.print_board() def seed(self, seed=None): self.np_random, seed = seeding.np_random(seed) return [seed]
if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: game.tetromino.rotate() if event.key == pygame.K_DOWN: pressing_down = True if event.key == pygame.K_LEFT: # TODO move left pass if event.key == pygame.K_RIGHT: # TODO move right pass if event.key == pygame.K_SPACE: # TODO drop pass if event.key == pygame.K_ESCAPE: game.__init__(20, 10) if event.type == pygame.KEYUP: if event.key == pygame.K_DOWN: pressing_down = False screen.fill((255, 255, 255)) if game.tetromino is not None: for i in range(4): for j in range(4): if game.tetromino.image()[i][j]: pygame.draw.rect(screen, game.tetromino.color, [ game.x + zoom * (j + game.tetromino.x) + 1, game.y + zoom * (i + game.tetromino.y) + 1, zoom - 2, zoom - 2
def run(): # Initialize the game engine pygame.init() clock = pygame.time.Clock() pygame.display.set_caption("Multris") network = Network(1 - player.player, "Ramiz") # Other player is 1 - player network.run() network.discover() game = Tetris(network) display = Display() # Loop until the user clicks the close button. pressing_down = [False, False] done = False counter = 0 while not done: counter += 1 if counter > 100000: counter = 0 for ix in range(2): if game.figures[ix] is None: game.new_figure(ix) if (counter % (fps // game.level // 2) == 0 and ix == player.player) or pressing_down[ix]: if game.state == "start": game.go_down(ix) game.send_field() for event in pygame.event.get(): if event.type == pygame.QUIT: done = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: if game.state == "start": game.rotate(player.player) if event.key == pygame.K_DOWN: pressing_down[player.player] = True if event.key == pygame.K_LEFT: if game.state == "start": game.go_side(-1, player.player) if event.key == pygame.K_RIGHT: if game.state == "start": game.go_side(1, player.player) if event.key == pygame.K_SPACE: if game.state == "start": game.go_space(player.player) if event.key == pygame.K_ESCAPE: game.__init__(network) game.new_figure(player.player) if event.key == pygame.K_r: game.state = "ready" game.send_state() if game.remote_state == "ready": game.state = "start" game.send_state() if event.type == pygame.KEYUP: if event.key == pygame.K_DOWN: pressing_down[player.player] = False display.display(game.score, game.state, game.figures, game.field) clock.tick(fps) for i in range(os.cpu_count() + 4): network.send_udp_packet(Packet(PacketType.QUIT), (network.local_ip, local_port)) pygame.quit()