예제 #1
0
class Game:
    def __init__(self):
        self.board = Board()
        self.out = SimpleStdOut()
        self.input = SimpleStdIn()
        # In random against random, player 'O' moves first
        self.current_turn_token = O_TOKEN
        self.referee = Referee()
        self.round = None

    def switch_turns(self):
        if self.current_turn_token == O_TOKEN:
            self.current_turn_token = X_TOKEN
            return
        self.current_turn_token = O_TOKEN

    def is_game_over(self):
        return self.referee.is_winner(self.board, self.current_turn_token) or \
            self.board.is_board_full()

    def annouce_result(self):
        if self.referee.is_winner(self.board, self.current_turn_token):
            self.out.display_winner_announcement(self.current_turn_token)
        elif self.board.is_board_full():
            self.out.display_tie_annoucement()

    def run(self):
        try:
            print(self.out.display_greetings_and_game_info())
            print(self.out.current_game_header())

            self.out.display_choose_prompt("O")
            self.out.display_player_choices()
            chosenPlayer = -1
            while chosenPlayer == -1:
                chosenPlayer = self.input.choose(3)
            self.playerO = (RandomPlayer, InteractivePlayer,
                            MinimaxPlayer)[chosenPlayer](O_TOKEN)

            self.out.display_choose_prompt("X")
            self.out.display_player_choices()
            chosenPlayer = -1
            while chosenPlayer == -1:
                chosenPlayer = self.input.choose(3)
            self.playerX = (RandomPlayer, InteractivePlayer,
                            MinimaxPlayer)[chosenPlayer](X_TOKEN)

            self.out.announce_player(type(self.playerO).__name__, O_TOKEN)
            self.out.announce_player(type(self.playerX).__name__, X_TOKEN)
            self.out.announce_who_moves_first(O_TOKEN)
            self.round = 0

            while True:
                self.playerO.play(self.board)
                self.out.display_board(self.board.get_squares(), self.round)
                if self.is_game_over():
                    break
                self.round += 1
                self.switch_turns()
                self.playerX.play(self.board)
                self.out.display_board(self.board.get_squares(), self.round)
                if self.is_game_over():
                    break
                self.round += 1
                self.switch_turns()

            self.annouce_result()

        except KeyboardInterrupt:
            print("Bye.")
예제 #2
0
    def test_squares_attribute_in_board_is_a_list_of_nine_elements(self):
        board = Board()

        self.assertEqual(9, len(board.get_squares()))