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)
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() }