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]
Esempio n. 2
0
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]
Esempio n. 3
0
        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
Esempio n. 4
0
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()