コード例 #1
0
    def test_get_valid_moves(self):
        board = blokus.Board()
        player = board.players[0]
        unplayed_piece = blokus.Piece(np.array([
            [1, 0],
            [1, 1],
            [1, 1]
        ]), player)

        player.unplayed_pieces = [ unplayed_piece ]

        valid_moves = player.get_valid_moves(board)
        self.assertEqual(len(valid_moves), 6)

        invalid_move = np.array([
            [0, 1],
            [1, 1],
            [1, 1]
        ])

        self.assertTrue(all([not np.array_equal(invalid_move, move) for move in valid_moves]))

        invalid_move = np.array([
            [0, 1, 1],
            [1, 1, 1]
        ])

        self.assertTrue(all([not np.array_equal(invalid_move, move) for move in valid_moves]))

        move_positions = map(lambda x: x._position, valid_moves)
        self.assertTrue(all([position == (0, 0) for position in move_positions]))
コード例 #2
0
    def test_get_block(self):
        board = blokus.Board()

        self.assertIsNone(board.get_block((-1, 0)))
        self.assertIsNone(board.get_block((0, -1)))
        self.assertIsNone(board.get_block((blokus.Board.SIZE, 0)))
        self.assertIsNone(board.get_block((0, blokus.Board.SIZE)))

        self.assertEqual(board.get_block((5, 9)), board.board[9][5])
コード例 #3
0
    def test_initialization(self):
        board = blokus.Board()

        self.assertEqual(len(board.players), 4)
        self.assertEqual(blokus.Board.SIZE, 20)
        self.assertEqual(len(board.board), blokus.Board.SIZE)
        self.assertTrue(all([len(row) == blokus.Board.SIZE for row in board.board]))

        self.assertTrue(board.get_block((0, 0)).anchors_player(board.players[0]))
        self.assertTrue(board.get_block((19, 0)).anchors_player(board.players[1]))
        self.assertTrue(board.get_block((19, 19)).anchors_player(board.players[2]))
        self.assertTrue(board.get_block((0, 19)).anchors_player(board.players[3]))
コード例 #4
0
    def test_get_blocks_affected(self):
        board = blokus.Board()
        player = board.players[0]

        piece = blokus.Piece(np.array([
            [1, 1, 1],
            [0, 1, 0],
            [0, 1, 0]
        ]), player)

        move = blokus.Move(board, piece, (13, 6))
        expected = [
            board.get_block((13, 6)),
            board.get_block((14, 6)),
            board.get_block((15, 6)),
            board.get_block((14, 7)),
            board.get_block((14, 8))
        ]

        self.assertEqual(set(move.get_blocks_affected()), set(expected))

        # [1, 0, 0]
        # [1, 1, 1]
        # [1, 0, 0]
        move = blokus.Move(board, piece, (5, 9), orientation=2)
        expected = [
            board.get_block((5, 9)),
            board.get_block((5, 10)),
            board.get_block((6, 10)),
            board.get_block((7, 10)),
            board.get_block((5, 11))
        ]

        self.assertEqual(set(move.get_blocks_affected()), set(expected))

        move = blokus.Move(board, piece, (-1, 0))
        expected = [
            None,
            board.get_block((0, 0)),
            board.get_block((1, 0)),
            board.get_block((0, 1)),
            board.get_block((0, 2))
        ]

        self.assertEqual(set(move.get_blocks_affected()), set(expected))
コード例 #5
0
    def test_is_valid(self):
        '''
        A valid move is a move where:
            1. At least 1 block for the move is an anchor for the player
            2. All blocks allow the player
            3. The piece isn't falling out of bounds
        '''
        board = blokus.Board()
        player = board.players[0]

        piece = blokus.Piece(np.array([
            [1, 1],
            [1, 0]
        ]), player)

        player.unplayed_pieces.append(piece)

        move = blokus.Move(board, piece, (0, 0))
        self.assertTrue(move.is_valid())

        # Invalid orientation, does not line up with anchor
        # [0, 1]
        # [1, 1]
        move = blokus.Move(board, piece, (0, 0), orientation=2)
        self.assertFalse(move.is_valid())

        # Piece is falling off the board
        move = blokus.Move(board, piece, (0, -1))
        self.assertFalse(move.is_valid())
        move = blokus.Move(board, piece, (-1, 0))
        self.assertFalse(move.is_valid())

        board.get_block((1, 0)).disallow_player(player)

        # Piece covers a block where the player is not allowed
        move = blokus.Move(board, piece, (0, 0))
        self.assertFalse(move.is_valid())

        # Piece has already been played
        with patch('blokus.Piece') as played_piece:
            played_piece.is_played = True
            move = blokus.Move(board, played_piece, (0, 0))
            self.assertFalse(move.is_valid())
コード例 #6
0
    def test_make_move(self):
        board = blokus.Board()

        with patch('blokus.Move') as invalid_move:
            invalid_move.is_valid.return_value = False

            with self.assertRaises(RuntimeError):
                board.make_move(invalid_move)

        player = board.players[2]
        piece = blokus.Piece(np.array([
            [1, 1, 1],
            [0, 1, 0],
            [0, 1, 0]
        ]), player)

        player.unplayed_pieces = [ piece ]

        # Player 2's start position is (19, 19)
        # [0, 0, 1]
        # [1, 1, 1]
        # [0, 0, 1]
        move = blokus.Move(board, piece, (17, 17), orientation=1)
        board.make_move(move)

        self.assertNotIn(move._piece, player.unplayed_pieces)

        self._verify_make_move(
            board=board,
            player=player,
            expected_assigned=set([ (19, 17), (19, 18), (19, 19), (17, 18), (18, 18) ]),
            expected_anchors=set([ (18, 16), (16, 17), (16, 19) ]),
            expected_disallowed=set([ (19, 16), (18, 17), (17, 17), (18, 19), (17, 19), (16, 18) ])
        )

        piece_2 = blokus.Piece(np.array([
            [1, 1],
            [1, 0],
            [1, 1]
        ]), player)

        player.unplayed_pieces = [ piece_2 ]

        move = blokus.Move(board, piece_2, (15, 17))
        board.make_move(move)

        self._verify_make_move(
            board=board,
            player=player,
            expected_assigned=set([
                (19, 17), (19, 18), (19, 19), (17, 18), (18, 18),
                (16, 17), (15, 17), (15, 18), (15, 19), (16, 19)
            ]),
            expected_anchors=set([
                (18, 16), (17, 16), (14, 16)
            ]),
            expected_disallowed=set([
                (19, 16), (18, 17), (17, 17), (18, 19), (17, 19), (16, 18),
                (14, 19), (14, 18), (14, 17), (15, 16), (16, 16)
            ])
        )
コード例 #7
0
 def __init__(self):
     self.board = blokus.Board()
     self.turn_count = 0
     self.players_remaining = len(self.board.players)
     self.is_complete = False