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)
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)
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)
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)
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
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)
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], ])))
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
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))