예제 #1
0
def provide_game_info():
    try:
        out = WebOut()
        resp_string = out.display_greetings_and_game_info().replace(
            "\n", "<br>")

        conn = sqlite3.connect('game.db')
        cur = conn.cursor()

        cur.execute("SELECT * FROM game_state")
        game_data = cur.fetchone()

        current_turn_squares = list(game_data[4])

        board = Board()
        board.set_all_squares(current_turn_squares)

        resp_string += "<br>" + \
                       out.display_board(board.squares, 9 - len(board.get_empty_square_positions())).replace("\n", "<br>")

        resp = make_response(resp_string, 200)

        return resp
    except Exception as e:
        print(e)
    finally:
        conn.close()
예제 #2
0
 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
예제 #3
0
    def test_getting_empty_positions(self):
        squares = ['X', '-', '-', 'X', '-', '-', 'O', '-', '-']
        board = Board()
        board.set_all_squares(squares)

        expected_empty_squares = [1, 2, 4, 5, 7, 8]

        self.assertEqual(expected_empty_squares,
                         board.get_empty_square_positions())
예제 #4
0
def handle_move():
    conn = sqlite3.connect('game.db')
    cur = conn.cursor()
    try:
        # {'token': 'O', 'square': '3'}
        data_dict = request.get_json()

        if 'reset' in data_dict:
            cur.execute(
                "UPDATE game_state SET current_turn_token='O', current_board_squares='---------'"
            )
            conn.commit()
            return 'Board reset'

        token = data_dict['token']
        square = int(data_dict['square'])

        # INITIAL GAME STATE
        # sqlite> select * from game_state;
        # game_id     player_one_token  player_two_token  current_turn_token  current_board_squares
        # ----------  ----------------  ----------------  ------------------  ---------------------
        # 1           O                 X                 O                   ---------
        cur.execute("SELECT * FROM game_state")
        game_data = cur.fetchone()
        current_turn_token = game_data[3]

        if token != current_turn_token:
            return 'Not your turn yet'

        opponent_token = X_TOKEN if token == O_TOKEN else O_TOKEN
        current_turn_squares = list(game_data[4])

        board = Board()
        board.set_all_squares(current_turn_squares)
        if square not in board.get_empty_square_positions():
            return 'Square taken'

        referee = Referee()
        if referee.is_winner(board, token) or referee.is_winner(
                board, opponent_token):
            return 'Game over, send reset'

        current_turn_squares[square] = token

        # can add WHERE game_id=1
        cur.execute("UPDATE game_state SET current_board_squares='" +
                    ''.join(current_turn_squares) + "'")
        cur.execute("UPDATE game_state SET current_turn_token='" +
                    opponent_token + "'")

        conn.commit()
        return 'Move accepted'
    except Exception as e:
        traceback.print_exc()
    finally:
        conn.close()
예제 #5
0
    def test_board_partially_full(self):
        squares = ['X', '-', '-', 'O', '-', '-', '-', '-', '-']
        board = Board()
        board.set_all_squares(squares)

        self.assertFalse(board.is_board_empty())
        self.assertFalse(board.is_board_full())
예제 #6
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.")
예제 #7
0
    def test_squares_attribute_in_board_is_a_list_of_nine_elements(self):
        board = Board()

        self.assertEqual(9, len(board.get_squares()))
예제 #8
0
    def test_board_empty(self):
        squares = ['-', '-', '-', '-', '-', '-', '-', '-', '-']
        board = Board()
        board.set_all_squares(squares)

        self.assertTrue(board.is_board_empty())
예제 #9
0
    def test_board_full(self):
        squares = ['X', 'X', 'O', 'X', 'O', 'O', 'O', 'X', 'X']
        board = Board()
        board.set_all_squares(squares)

        self.assertTrue(board.is_board_full())
예제 #10
0
 def setUp(self):
     self.board = Board()
     self.referee = Referee()
예제 #11
0
class TestTTT(unittest.TestCase):
    def setUp(self):
        self.board = Board()
        self.referee = Referee()

    def test_X_is_winner_in_first_horizontal(self):
        current_turn_token = 'X'
        opposite_turn_token = 'O'
        squares = ['X', 'X', 'X', 'O', 'O', '-', '-', '-', '-']
        self.board.set_all_squares(squares)

        self.assertTrue(self.referee.is_winner(self.board, current_turn_token))
        self.assertFalse(
            self.referee.is_winner(self.board, opposite_turn_token))

    def test_O_is_winner_in_first_horizontal(self):
        current_turn_token = 'O'
        opposite_turn_token = 'X'
        squares = ['O', 'O', 'O', 'X', 'X', '-', '-', '-', '-']
        self.board.set_all_squares(squares)

        self.assertTrue(self.referee.is_winner(self.board, current_turn_token))
        self.assertFalse(
            self.referee.is_winner(self.board, opposite_turn_token))

    def test_X_is_winner_in_second_horizontal(self):
        current_turn_token = 'X'
        opposite_turn_token = 'O'
        squares = ['O', 'O', '-', 'X', 'X', 'X', '-', '-', '-']
        self.board.set_all_squares(squares)

        self.assertTrue(self.referee.is_winner(self.board, current_turn_token))
        self.assertFalse(
            self.referee.is_winner(self.board, opposite_turn_token))

    def test_O_is_winner_in_second_horizontal(self):
        current_turn_token = 'O'
        opposite_turn_token = 'X'
        squares = ['X', 'X', '-', 'O', 'O', 'O', '-', '-', '-']
        self.board.set_all_squares(squares)

        self.assertTrue(self.referee.is_winner(self.board, current_turn_token))
        self.assertFalse(
            self.referee.is_winner(self.board, opposite_turn_token))

    def test_X_is_winner_in_first_vertical(self):
        current_turn_token = 'X'
        opposite_turn_token = 'O'
        squares = ['X', 'O', '-', 'X', 'O', '-', 'X', '-', '-']
        self.board.set_all_squares(squares)

        self.assertTrue(self.referee.is_winner(self.board, current_turn_token))
        self.assertFalse(
            self.referee.is_winner(self.board, opposite_turn_token))

    def test_O_is_winner_in_first_vertical(self):
        current_turn_token = 'O'
        opposite_turn_token = 'X'
        squares = ['O', 'X', '-', 'O', 'X', '-', 'O', '-', '-']
        self.board.set_all_squares(squares)

        self.assertTrue(self.referee.is_winner(self.board, current_turn_token))
        self.assertFalse(
            self.referee.is_winner(self.board, opposite_turn_token))

    def test_X_is_winner_in_left_diagonal(self):
        current_turn_token = 'X'
        opposite_turn_token = 'O'
        squares = ['X', '-', 'O', '-', 'X', 'O', '-', '-', 'X']
        self.board.set_all_squares(squares)

        self.assertTrue(self.referee.is_winner(self.board, current_turn_token))
        self.assertFalse(
            self.referee.is_winner(self.board, opposite_turn_token))

    def test_O_is_winner_in_left_diagonal(self):
        current_turn_token = 'O'
        opposite_turn_token = 'X'
        squares = ['O', '-', 'X', '-', 'O', 'X', '-', '-', 'O']
        self.board.set_all_squares(squares)

        self.assertTrue(self.referee.is_winner(self.board, current_turn_token))
        self.assertFalse(
            self.referee.is_winner(self.board, opposite_turn_token))

    def test_X_is_winner_in_right_diagonal(self):
        current_turn_token = 'X'
        opposite_turn_token = 'O'
        squares = ['-', '-', 'X', '-', 'X', 'O', 'X', '-', 'O']
        self.board.set_all_squares(squares)

        self.assertTrue(self.referee.is_winner(self.board, current_turn_token))
        self.assertFalse(
            self.referee.is_winner(self.board, opposite_turn_token))

    def test_O_is_winner_in_right_diagonal(self):
        current_turn_token = 'O'
        opposite_turn_token = 'X'
        squares = ['-', '-', 'O', '-', 'O', 'X', 'O', '-', 'X']
        self.board.set_all_squares(squares)

        self.assertTrue(self.referee.is_winner(self.board, current_turn_token))
        self.assertFalse(
            self.referee.is_winner(self.board, opposite_turn_token))