Example #1
0
 def test_TTetromino(self):  # pylint: disable=invalid-name
     tetromino = Tetromino.TTetromino()
     expected1 = Tetromino([
         [3, 3, 3],
         [0, 3, 0],
     ], Tetromino.TYPES[3])
     expected2 = Tetromino([
         [0, 3],
         [3, 3],
         [0, 3],
     ], Tetromino.TYPES[3])
     expected3 = Tetromino([
         [0, 3, 0],
         [3, 3, 3],
     ], Tetromino.TYPES[3])
     expected4 = Tetromino([
         [3, 0],
         [3, 3],
         [3, 0],
     ], Tetromino.TYPES[3])
     self.assertTetrominosEqual(tetromino, expected1)
     self.assertEqual(tetromino.width(), 3)
     self.assertEqual(tetromino.height(), 2)
     self.assertTetrominosEqual(tetromino.rotate_right(), expected2)
     self.assertEqual(tetromino.width(), 2)
     self.assertEqual(tetromino.height(), 3)
     self.assertTetrominosEqual(tetromino.rotate_right(), expected3)
     self.assertTetrominosEqual(tetromino.rotate_right(), expected4)
     self.assertTetrominosEqual(tetromino.flip(), expected2)
     self.assertTetrominosEqual(tetromino.rotate_left(), expected1)
Example #2
0
 def test_LTetromino(self):  # pylint: disable=invalid-name
     tetromino = Tetromino.LTetromino()
     expected1 = Tetromino([
         [7, 7, 7],
         [7, 0, 0],
     ], Tetromino.TYPES[7])
     expected2 = Tetromino([
         [7, 7],
         [0, 7],
         [0, 7],
     ], Tetromino.TYPES[7])
     expected3 = Tetromino([
         [0, 0, 7],
         [7, 7, 7],
     ], Tetromino.TYPES[7])
     expected4 = Tetromino([
         [7, 0],
         [7, 0],
         [7, 7],
     ], Tetromino.TYPES[7])
     self.assertTetrominosEqual(tetromino, expected1)
     self.assertTetrominosEqual(tetromino.rotate_right(), expected2)
     self.assertTetrominosEqual(tetromino.rotate_right(), expected3)
     self.assertTetrominosEqual(tetromino.rotate_right(), expected4)
     self.assertTetrominosEqual(tetromino.rotate_right(), expected1)
     self.assertTetrominosEqual(tetromino.flip(), expected3)
     self.assertTetrominosEqual(tetromino.rotate_left(), expected2)
     self.assertTetrominosEqual(tetromino.rotate_left(), expected1)
Example #3
0
 def test_STetromino(self):  # pylint: disable=invalid-name
     tetromino = Tetromino.STetromino()
     expected1 = Tetromino([
         [0, 4, 4],
         [4, 4, 0],
     ], Tetromino.TYPES[4])
     expected2 = Tetromino([
         [4, 0],
         [4, 4],
         [0, 4],
     ], Tetromino.TYPES[4])
     self.assertTetrominosEqual(tetromino, expected1)
     self.assertTetrominosEqual(tetromino.rotate_right(), expected2)
     self.assertTetrominosEqual(tetromino.rotate_right(), expected1)
     self.assertTetrominosEqual(tetromino.flip(), expected1)
     self.assertTetrominosEqual(tetromino.rotate_left(), expected2)
Example #4
0
 def test_OTetromino(self):  # pylint: disable=invalid-name
     tetromino = Tetromino.OTetromino()
     expected = Tetromino([
         [2, 2],
         [2, 2],
     ], Tetromino.TYPES[2])
     self.assertTetrominosEqual(tetromino, expected)
     self.assertTetrominosEqual(tetromino.rotate_right(), expected)
     self.assertEqual(tetromino.width(), 2)
     self.assertEqual(tetromino.height(), 2)
     self.assertTetrominosEqual(tetromino.rotate_right(), expected)
     self.assertEqual(tetromino.width(), 2)
     self.assertEqual(tetromino.height(), 2)
     self.assertTetrominosEqual(tetromino.rotate_left(), expected)
     self.assertTetrominosEqual(tetromino.rotate_left(), expected)
     self.assertTetrominosEqual(tetromino.flip(), expected)
Example #5
0
 def _get_fitness_(self):
     """
     Helper method to perform a single simulation to evaluate the performance
     of the chromosome. This will be called multiple times and the overall
     performance of the chromosome is the average of all the runs.
     """
     tetrominos = [
         Tetromino.ITetromino(),
         Tetromino.OTetromino(),
         Tetromino.TTetromino(),
         Tetromino.STetromino(),
         Tetromino.ZTetromino(),
         Tetromino.JTetromino(),
         Tetromino.LTetromino()
     ]
     field = Field()
     field_score = -1
     for length in range(self.max_simulation_length):
         tetromino = random.choice(tetrominos)
         _, __, _field, _field_score = field.get_optimal_drop(
             tetromino, self.genes)
         if _field_score == math.inf:
             return length, field_score
         else:
             field = _field
             field_score = _field_score
     return length, field_score
Example #6
0
 def test_ITetromino(self):  # pylint: disable=invalid-name
     tetromino = Tetromino.ITetromino()
     expected1 = Tetromino([[1, 1, 1, 1]], Tetromino.TYPES[1])
     expected2 = Tetromino([
         [1],
         [1],
         [1],
         [1],
     ], Tetromino.TYPES[1])
     self.assertEqual(tetromino.tetromino_type, expected1.tetromino_type)
     self.assertEqual(tetromino.tetromino_type, expected2.tetromino_type)
     self.assertTetrominosEqual(tetromino, expected1)
     self.assertEqual(tetromino.width(), 4)
     self.assertEqual(tetromino.height(), 1)
     self.assertTetrominosEqual(tetromino.rotate_right(), expected2)
     self.assertEqual(tetromino.width(), 1)
     self.assertEqual(tetromino.height(), 4)
     self.assertTetrominosEqual(tetromino.rotate_right(), expected1)
     self.assertTetrominosEqual(tetromino.rotate_left(), expected2)
     self.assertTetrominosEqual(tetromino.flip(), expected2)
Example #7
0
    def test_drop(self):
        """
        Test various drop sequences and line clears.
        """
        state = generate_valid_state(
            np.array([
                [1, 1, 0, 1, 1, 0, 1, 1, 0, 0],
                [1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
            ],
                     dtype=np.uint8))
        field = Field.create(state)
        self.assertIsNotNone(field)

        lines_cleared = field.drop(Tetromino.JTetromino(), 0)
        self.assertEqual(lines_cleared, 0)
        expected_field = Field.create(
            generate_valid_state(
                np.array([
                    [6, 6, 6, 0, 0, 0, 0, 0, 0, 0],
                    [1, 1, 6, 1, 1, 0, 1, 1, 0, 0],
                    [1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
                ])))
        self.assertFieldsEqual(field, expected_field)

        lines_cleared = field.drop(Tetromino.TTetromino().rotate_right(), 8)
        self.assertEqual(lines_cleared, 1)
        expected_field = Field.create(
            generate_valid_state(
                np.array([
                    [6, 6, 6, 0, 0, 0, 0, 0, 0, 3],
                    [1, 1, 6, 1, 1, 0, 1, 1, 3, 3],
                ])))
        self.assertFieldsEqual(field, expected_field)

        field.drop(Tetromino.OTetromino(), 3)
        field.drop(Tetromino.ZTetromino(), 6)
        field.drop(Tetromino.JTetromino().flip(), 0)
        field.drop(Tetromino.OTetromino(), 8)
        expected_field = Field.create(
            generate_valid_state(
                np.array([
                    [6, 0, 0, 0, 0, 0, 0, 0, 2, 2],
                    [6, 6, 6, 2, 2, 0, 5, 5, 2, 2],
                    [6, 6, 6, 2, 2, 0, 0, 5, 5, 3],
                    [1, 1, 6, 1, 1, 0, 1, 1, 3, 3],
                ])))
        self.assertFieldsEqual(field, expected_field)
        lines_cleared = field.drop(Tetromino.ITetromino().rotate_right(), 5)
        self.assertEqual(lines_cleared, 2)
        expected_field = Field.create(
            generate_valid_state(
                np.array([
                    [6, 0, 0, 0, 0, 1, 0, 0, 2, 2],
                    [6, 6, 6, 2, 2, 1, 0, 5, 5, 3],
                ])))
Example #8
0
class TetrisDriver(): # pylint: disable=missing-class-docstring

    TETROMINOS = [
        Tetromino.ITetromino(),
        Tetromino.OTetromino(),
        Tetromino.TTetromino(),
        Tetromino.STetromino(),
        Tetromino.ZTetromino(),
        Tetromino.JTetromino(),
        Tetromino.LTetromino()
    ]

    def __init__(self, field):
        self.field = field
        self.held_tetromino = None
        self.num_placed = 0
        self.lines_cleared = 0

    @staticmethod
    def create(field=None):
        """
        Factory method to create a TetrisDriver, taking an optional Field with
        which to initialize the game with.
        """
        return TetrisDriver(Field.create() if field is None else field)

    def play(self, strategy):
        """
        Given a strategy callback which takes the current Field, the next
        Tetromino, and the held Tetromino, and returns a TetrisAction or None.
        This method will play the TetrisAction if provided, or return None if
        one if the TetrisAction was None, indicating the game is over.
        """
        tetromino = random.choice(TetrisDriver.TETROMINOS)
        action = strategy(self.field, tetromino, self.held_tetromino)
        if action is None:
            return False
        valid_tetromino_types = [tetromino.type()] if self.held_tetromino is \
            None else [tetromino.type(), self.held_tetromino.type()]
        assert action.tetromino.tetromino_type in valid_tetromino_types
        lines_cleared = self.field.drop(action.tetromino, action.column)
        self.num_placed += 1
        self.lines_cleared += lines_cleared if lines_cleared > 0 else 0
        return True
Example #9
0
def show(chromosome):
    tetrominos = [
        Tetromino.ITetromino(),
        Tetromino.OTetromino(),
        Tetromino.TTetromino(),
        Tetromino.STetromino(),
        Tetromino.ZTetromino(),
        Tetromino.JTetromino(),
        Tetromino.LTetromino()
    ]
    field = Field()
    pieces = 0
    while True:
        tetromino = random.choice(tetrominos)
        _, __, field, ___ = field.get_optimal_drop(tetromino, chromosome.genes)
        if field == None:
            break
        print(field)
        pieces += 1
        time.sleep(0.1)
    print('Performance: {}'.format(pieces))