Ejemplo n.º 1
0
class TestBoard(unittest.TestCase):
    def setUp(self):
        self.board = Board()

    def test_default_board_size(self):
        self.assertEqual(SIZE, len(self.board.board))

    def test_num_spaces(self):
        self.assertEqual(self.board.num_spaces(),
                         self.board.size * self.board.size)

    def test_board_empty(self):
        for i in xrange(SIZE):
            for j in xrange(SIZE):
                self.assertEqual(self.board.board[i][j], EMPTY)

    def test_clear_board(self):
        self.board.board[0][1] = 1
        self.board.clear_board()
        self.assertEqual(self.board.board[0][1], EMPTY)

    def test_place_piece(self):
        self.board.place_piece('x', 1, 0)
        self.assertEqual(self.board.board[1][0], 'x')

    def test_blank_spaces(self):
        self.board.board[0][2] = 'x'
        self.assertEqual(len(self.board.blank_spaces()),
                         self.board.size*self.board.size-1)

    def test_piece_at_position(self):
        self.board.board[0][2] = 'x'
        self.assertEqual(self.board.piece_at_position(0, 2), 'x')

    def test_flatten_board(self):
        self.assertEqual(len(self.board.flatten_board()),
                         self.board.size*self.board.size)
Ejemplo n.º 2
0
class Game(object):
    def __init__(self, board=None, whose_turn=None):
        self.moves = []
        self.winner = None
        self.board = board
        self.whose_turn = whose_turn

        if board is None:
            self.board = Board()

        if whose_turn is None:
            self.whose_turn = Piece.X.name

    def change_turn(self):
        """Changes the turn from Piece X to Piece O or vice versa"""
        # Change whose turn from O to X
        if self.whose_turn == Piece.O.name:
            self.whose_turn = Piece.X.name
        # Change turn from X to O
        else:
            self.whose_turn = Piece.O.name

    def available_positions(self):
        """Returns a list of available positions in the form of [row, col]"""
        return self.board.blank_spaces()

    def position_available(self, row, col):
        """Returns True or False depending on whether a position is occupied"""
        return self.board.position_available(row, col)

    def game_over(self):
        if not self.board.blank_spaces() or self.winner:
            return True
        return False

    def perform_move(self, move):
        """Returns a new state of the game with the move applied."""
        if not referee.valid_move(self.board, move):
            raise InvalidMoveException()

        # each move creates a new state of the game
        new_state = copy(self)
        new_state.board = deepcopy(self.board)
        # new_state.moves = deepcopy(self.moves)
        new_state.board.place_piece(move.piece,
                                    move.row,
                                    move.column)
        new_state.moves.append(move)

        # Player won
        if referee.has_won(new_state.board, new_state.whose_turn):
            new_state.winner = new_state.whose_turn
        # Game tied
        elif not new_state.board.blank_spaces():
            new_state.winner = None
        # Game is on going, change turn
        else:
            new_state.change_turn()

        return new_state

    def won(self, piece):
        """Returns a boolean representing whether the piece provided won the game"""
        return piece == self.winner

    def lost(self, piece):
        """Returns a boolean representing whether the piece passed lost the game."""
        if not self.winner:
            return False
        return self.winner != piece

    def tie(self):
        """Returns True if the game ended in a tie, otherwise returns false"""
        return self.winner is None and not self.board.blank_spaces()

    def serialize(self):
        print(self.board.board)
        return {
            'board': self.board.board,
            'whose_turn': self.whose_turn,
            'winner': self.winner,
            'game_over': self.game_over()
        }