def test_valid_plays(self): board = GameBoard() piece1 = Piece(color=COLORS.RED, shape=SHAPES.SPARKLE) piece2 = Piece(color=COLORS.RED, shape=SHAPES.SQUARE) piece3 = Piece(color=COLORS.RED, shape=SHAPES.CIRCLE) piece4 = Piece(color=COLORS.GREEN, shape=SHAPES.SQUARE) piece5 = Piece(color=COLORS.BLUE, shape=SHAPES.SQUARE) piece6 = Piece(color=COLORS.CYAN, shape=SHAPES.SQUARE) board.start_turn() board.play(piece1) board.play(piece2, x=1, y=2) board.play(piece3, x=1, y=3) board.end_turn() board.start_turn() board.play(piece4, x=2, y=2) self.assertEqual([(2, 1), (0, 2), (3, 2), (2, 3)], board.valid_plays()) board.play(piece5, x=3, y=2) self.assertEqual([(0, 2), (4, 2)], board.valid_plays()) board.play(piece6, x=4, y=2) self.assertEqual([(0, 2), (5, 2)], board.valid_plays()) board.end_turn() self.assertEqual([(1, 0), (0, 1), (2, 1), (3, 1), (4, 1), (0, 2), (5, 2), (0, 3), (2, 3), (3, 3), (4, 3), (1, 4)], board.valid_plays())
def test_score_straight_line(self): board = GameBoard() piece1 = Piece(color=COLORS.RED, shape=SHAPES.SPARKLE) piece2 = Piece(color=COLORS.RED, shape=SHAPES.SQUARE) piece3 = Piece(color=COLORS.RED, shape=SHAPES.CIRCLE) board.start_turn() board.play(piece1) board.play(piece2, x=1, y=2) board.play(piece3, x=1, y=3) self.assertEqual(3, board.score()) board.end_turn() self.assertEqual(0, board.score())
def test_complex_score(self): board = GameBoard() piece1 = Piece(color=COLORS.RED, shape=SHAPES.SPARKLE) piece2 = Piece(color=COLORS.RED, shape=SHAPES.SQUARE) piece3 = Piece(color=COLORS.RED, shape=SHAPES.CIRCLE) piece4 = Piece(color=COLORS.GREEN, shape=SHAPES.SQUARE) piece5 = Piece(color=COLORS.BLUE, shape=SHAPES.SQUARE) piece6 = Piece(color=COLORS.CYAN, shape=SHAPES.SQUARE) piece7 = Piece(color=COLORS.GREEN, shape=SHAPES.CIRCLE) piece8 = Piece(color=COLORS.BLUE, shape=SHAPES.CIRCLE) piece9 = Piece(color=COLORS.CYAN, shape=SHAPES.CIRCLE) piece10 = Piece(color=COLORS.GREEN, shape=SHAPES.SPARKLE) piece11 = Piece(color=COLORS.GREEN, shape=SHAPES.TRIANGLE) piece12 = Piece(color=COLORS.GREEN, shape=SHAPES.DIAMOND) piece13 = Piece(color=COLORS.GREEN, shape=SHAPES.STAR) board.start_turn() board.play(piece1) board.play(piece2, x=1, y=2) board.play(piece3, x=1, y=3) self.assertEqual(3, board.score()) board.end_turn() board.start_turn() board.play(piece4, x=2, y=2) board.play(piece5, x=3, y=2) board.play(piece6, x=4, y=2) self.assertEqual(4, board.score()) board.end_turn() board.start_turn() board.play(piece7, x=2, y=3) board.play(piece8, x=3, y=3) board.play(piece9, x=4, y=3) self.assertEqual(10, board.score()) board.end_turn() board.start_turn() board.play(piece10, x=2, y=1) board.play(piece11, x=2, y=4) board.play(piece12, x=2, y=5) board.play(piece13, x=2, y=6) self.assertEqual(14, board.score()) board.end_turn() board.print_board()
def test_playing_multiple_turns(self): board = GameBoard() piece1 = Piece(color=COLORS.RED, shape=SHAPES.SPARKLE) piece2 = Piece(color=COLORS.RED, shape=SHAPES.SQUARE) piece3 = Piece(color=COLORS.RED, shape=SHAPES.CIRCLE) piece5 = Piece(color=COLORS.GREEN, shape=SHAPES.SQUARE) piece6 = Piece(color=COLORS.BLUE, shape=SHAPES.SQUARE) piece7 = Piece(color=COLORS.CYAN, shape=SHAPES.SQUARE) piece8 = Piece(color=COLORS.YELLOW, shape=SHAPES.SQUARE) piece9 = Piece(color=COLORS.MAGENTA, shape=SHAPES.SQUARE) piece10 = Piece(color=COLORS.MAGENTA, shape=SHAPES.SPARKLE) piece11 = Piece(color=COLORS.MAGENTA, shape=SHAPES.CIRCLE) piece12 = Piece(color=COLORS.MAGENTA, shape=SHAPES.STAR) piece13 = Piece(color=COLORS.MAGENTA, shape=SHAPES.TRIANGLE) piece14 = Piece(color=COLORS.MAGENTA, shape=SHAPES.DIAMOND) board.start_turn() board.play(piece1) board.play(piece2, x=1, y=2) board.play(piece3, x=1, y=3) self.assertEqual(3, len(board._plays)) self.assertEqual([(1, 1), (1, 2), (1, 3)], board._plays) board.end_turn() board.start_turn() board.play(piece5, x=2, y=2) board.play(piece6, x=3, y=2) board.play(piece7, x=4, y=2) board.play(piece8, x=0, y=2) board.play(piece9, x=0, y=2) self.assertEqual(5, len(board._plays)) self.assertEqual([(4, 2), (5, 2), (6, 2), (2, 2), (1, 2)], board._plays) board.end_turn() board.start_turn() board.play(piece10, x=1, y=1) board.play(piece11, x=1, y=0) board.play(piece12, x=1, y=0) board.play(piece13, x=1, y=0) board.play(piece14, x=1, y=0) self.assertEqual(5, len(board._plays)) self.assertEqual([(1, 5), (1, 4), (1, 3), (1, 2), (1, 1)], board._plays) board.end_turn() expected_board = [ [ None, None, None, None, None, None, None, None, ], [None, piece14, None, None, None, None, None, None], [None, piece13, None, None, None, None, None, None], [None, piece12, None, None, None, None, None, None], [None, piece11, None, None, None, None, None, None], [ None, piece10, None, piece1, None, None, None, None, ], [ None, piece9, piece8, piece2, piece5, piece6, piece7, None, ], [ None, None, None, piece3, None, None, None, None, ], [ None, None, None, None, None, None, None, None, ], ] self.assertEqual(expected_board, board._saved_board)
class QwirkleGame: def __init__(self): self._bag_of_tiles = [] self._players = [] self._board = [] def main(self, players): self._board = GameBoard() self._generate_new_bag_of_tiles() player_number = 1 for player in players: if player == 'greedy_bot': self._players.append(GreedyBot('Player %i' % player_number)) elif player == 'single_greedy_bot': self._players.append(SingleGreedyBot('Player %i' % player_number)) elif player == 'human': self._players.append(Player('Player %i' % player_number)) else: raise ValueError('%s is an invalid player type' % player) player_number += 1 score_message = (-1, 0) current_player = 0 while True: print('\n' * 50) print('Qwirkle Hard\n') print(' Score:') for i in range(len(self._players)): message = ' %s - %i' % (self._players[i].name(), self._players[i].score()) if score_message[0] == i: message += ' +%i' % score_message[1] print(message) print('\n It is %ss turn\n' % self._players[current_player].name()) self._board.print_board(show_valid_placements=False) self._players[current_player].pick_tiles(self._bag_of_tiles) self._board.start_turn() self._players[current_player].play_turn(self._board) score = self._board.score() self._players[current_player].add_points(score) score_message = (current_player, score) self._board.end_turn() if score == 0: print(' %s is exchanging tiles...' % self._players[current_player].name()) self._bag_of_tiles += self._players[current_player].get_tiles() self._players[current_player].clear_tiles() self._players[current_player].pick_tiles(self._bag_of_tiles) if self._players[current_player].has_no_tiles(): break current_player += 1 if current_player >= len(self._players): current_player = 0 winning_player = max(self._players, key=lambda p: p.score()) print('\n Final Score:') for i in range(len(self._players)): message = ' %s - %i' % (self._players[i].name(), self._players[i].score()) print(message) print('\n %s wins!\n' % winning_player.name()) def _generate_new_bag_of_tiles(self): self._bag_of_tiles = [] shapes = [ SHAPES.CIRCLE, SHAPES.DIAMOND, SHAPES.SPARKLE, SHAPES.SQUARE, SHAPES.STAR, SHAPES.TRIANGLE ] colors = [ COLORS.BLUE, COLORS.CYAN, COLORS.GREEN, COLORS.MAGENTA, COLORS.RED, COLORS.YELLOW ] for i in range(3): for c in range(len(colors)): for s in range(len(shapes)): self._bag_of_tiles.append(Piece(color=colors[c], shape=shapes[s]))