'''
AIM: 
2 palyes should be able to play the game(both sitting in same computer)
The board should be printed out every time a player makes a move
You should be able to accept input of the player position and then place a symbol on the board
We will use the "numpad" to match numbers to the grid on a tic toe board

To design the tic-tok game we have devide the big program into multiple steps like below

a) Draw function for display board
b) Take palyer input.
c) Place input to board
d) Check the game is won,tied,last or wrong
e) Repeat c and d untill game has been won or tied
f) Ask player want to play again
'''

import random

#Drawing board
test_board = [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ']

def display_board(board):
    # clear_output()  # Remember, this only works in jupyter!
    
    print('   |   |')
    print(' ' + board[7] + ' | ' + board[8] + ' | ' + board[9])
    print('   |   |')
    print('-----------')
    print('   |   |')
    print(' ' + board[4] + ' | ' + board[5] + ' | ' + board[6])
    print('   |   |')
    print('-----------')
    print('   |   |')
    print(' ' + board[1] + ' | ' + board[2] + ' | ' + board[3])
    print('   |   |')
    
    
def player_input():
    marker = ''
    
    while not (marker == 'X' or marker == 'O'):
        marker = input('Player 1: Do you want to be X or O ?').upper()
        
        if marker == 'X':
            return ('X', 'O')
        else:
            return ('O', 'X')
        
 #Place input to board       
def place_marker(board, marker, position):
    board[position] = marker

#Check the game is won,tied,last or wrong
def win_check(board,mark):
    
    return ((board[7] == mark and board[8] == mark and board[9] == mark) or # across the top
    (board[4] == mark and board[5] == mark and board[6] == mark) or # across the middle
    (board[1] == mark and board[2] == mark and board[3] == mark) or # across the bottom
    (board[7] == mark and board[4] == mark and board[1] == mark) or # down the middle
    (board[8] == mark and board[5] == mark and board[2] == mark) or # down the middle
    (board[9] == mark and board[6] == mark and board[3] == mark) or # down the right side
    (board[7] == mark and board[5] == mark and board[3] == mark) or # diagonal
    (board[9] == mark and board[5] == mark and board[1] == mark)) # diagonal

# choose who go first
def choose_first():
    if random.randint(0,1) == 0:  # Radom assignment will happens
        return "Player 2"   
    else:
        return "Player 1"  
    
#check the space on the board wether freely available or not
def space_check(board, position):
    return board[position] == ' '

# check if the board is full or not
def full_board_check(board):
    for i in range(1,10):
        if space_check(board, i):
            return False
        
    return True

#Asks for a player's next position (as a number 1-9) and then uses the function from step 6 to check if its a free position. If it is, then return the position for later use.
def player_choice(board):
    position = 0
    while position not in [1,2,3,4,5,6,7,8,9] or not space_check(board, position):
        position = int(input("Choose your next position: (1-9) "))

    return position
    
#Write a function that asks the player if they want to play again and returns a boolean True if they do want to play again.
def replay():
    
    return input('Do you want to play again? Enter Yes or No: ').lower().startswith('y') 
    
#Use while loops and the functions you've made to run the game!
print('Welcome to Tic Tac Toe!')

while True:
    #Reset the board
    theBoard = [' '] * 10
    player1_marker, player2_marker = player_input()
    turn = choose_first()
    print(turn + ' will go first.')
    
    play_game = input('Are you ready to play? Enter Yes or No.')
    if play_game.lower()[0] == 'y':
        game_on = True
    else:
        game_on = False
        
    while game_on:
        #player 1 turn
        if turn == 'Player 1':
            display_board(theBoard)
            position = player_choice(theBoard)
            place_marker(theBoard, player1_marker, position)
            
            if win_check(theBoard, player1_marker):
                display_board(theBoard)
                print('Congratulations! You have won the game!')
                game_on = False
            else:
                if full_board_check(theBoard):
                    display_board(theBoard)
                    print('The game is a draw!')
                    break
                else:
                    turn = 'Player 2'

        else:
            # Player2's turn.
            
            display_board(theBoard)
            position = player_choice(theBoard)
            place_marker(theBoard, player2_marker, position)

            if win_check(theBoard, player2_marker):
                display_board(theBoard)
                print('Player 2 has won!')
                game_on = False
            else:
                if full_board_check(theBoard):
                    display_board(theBoard)
                    print('The game is a draw!')
                    break
                else:
                    turn = 'Player 1'

    if not replay():
        break