예제 #1
0
class TicTacToe:
    def __init__(self, player1, player2):
        self.board = Board()
        self.players = [player1, player2]
        self.current_player = random.randrange(0, len(self.players))
        print("Player", self.players[self.current_player].get_mark(), "starts")

    def do_move(self):
        if not self.check_someone_won():
            move = self.players[self.current_player].do_move(self.board)
            if self.check_legal(move) and not self.board_full():
                self.board.place_move(
                    move, self.players[self.current_player].get_mark())
                self.change_player()

    def check_someone_won(self):
        for player in self.players:
            if self.board.check_win(player.get_mark()):
                return True
        return False

    def check_legal(self, move):
        return self.board.move_is_legal(move)

    def check_win(self):
        marks = []
        for player in self.players:
            marks.append(player.getMark())
        win = self.board.check_win(marks)
        if win:
            self.update_table(self.board)
        return win

    def change_player(self):
        self.current_player = (self.current_player + 1) % len(self.players)

    def board_full(self):
        return self.board.board_full()

    def reset(self):
        self.board = Board()

    def get_board(self):
        return self.board.get_board()

    def row_length(self):
        return self.board.row_length

    def get_current_player(self):
        return self.current_player

    def game_ended(self):
        return self.check_win() or self.board_full()
예제 #2
0
class TestBoard(unittest.TestCase):
    def setUp(self):
        self.board = Board()
        self.board.registry('x')
        self.board.registry('o')

    def test_get_board(self):
        board_values = self.board.get_board()
        for line in board_values:
            for value in line:
                self.assertEqual(value, ' ')

    def test_set_valid_value(self):
        for i in range(3):
            for j in range(3):
                self.board.set_value('x', i, j)
                values = self.board.get_board()
                self.assertEqual(values[i][j], 'x')

    def test_set_invalid_value(self):
        self.board.set_value('x', 1, 1)
        with self.assertRaises(ValueError) as context:
            self.board.set_value('x', 1, 1)
        exc = context.exception
        self.assertTrue('position already filled' in str(exc))

    def test_check_no_winner(self):
        self.assertEqual(self.board.get_winner(), None)

    def assert_line_winner(self, letter, line):
        self.board.set_value(letter, line, 0)
        self.assertEqual(self.board.get_winner(), None)
        self.board.set_value(letter, line, 1)
        self.assertEqual(self.board.get_winner(), None)
        self.board.set_value(letter, line, 2)
        self.assertEqual(self.board.get_winner(), letter,
                         f'Should return {letter} as winner')

    def assert_column_winner(self, letter, column):
        self.board.set_value(letter, 0, column)
        self.assertEqual(self.board.get_winner(), None)
        self.board.set_value(letter, 1, column)
        self.assertEqual(self.board.get_winner(), None)
        self.board.set_value(letter, 2, column)
        self.assertEqual(self.board.get_winner(), letter,
                         f'Should return {letter} as winner')

    def test_check_winner_first_line(self):
        letter = 'x'
        self.assert_line_winner(letter, 0)

    def test_check_winner_second_line(self):
        letter = 'o'
        self.assert_line_winner(letter, 1)

    def test_check_winner_third_line(self):
        letter = 'x'
        self.assert_line_winner(letter, 2)

    def test_check_winner_first_column(self):
        letter = 'x'
        self.assert_column_winner(letter, 0)

    def test_check_winner_second_column(self):
        letter = 'x'
        self.assert_column_winner(letter, 1)

    def test_check_winner_third_column(self):
        letter = 'x'
        self.assert_column_winner(letter, 2)

    def test_check_winner_main_diagonal(self):
        letter = 'x'
        self.board.set_value(letter, 0, 0)
        self.assertEqual(self.board.get_winner(), None)
        self.board.set_value(letter, 1, 1)
        self.assertEqual(self.board.get_winner(), None)
        self.board.set_value(letter, 2, 2)
        self.assertEqual(self.board.get_winner(), letter,
                         f'Should return {letter} as winner')

    def test_check_winner_secondary_diagonal(self):
        letter = 'x'
        self.board.set_value(letter, 0, 2)
        self.assertEqual(self.board.get_winner(), None)
        self.board.set_value(letter, 1, 1)
        self.assertEqual(self.board.get_winner(), None)
        self.board.set_value(letter, 2, 0)
        self.assertEqual(self.board.get_winner(), letter,
                         f'Should return {letter} as winner')