Search code examples
pythontic-tac-toe

making tic tac toe, code is complete without error messages but wont run?


This is my first project, I used a lot of resources from others with the same project and this is what I have come up with. I am using Jupyter notebook. I am not getting any more error messages in my code, but for some reason I can't get it to run? Also, any advice or improvements in my code would also be appreciated.

I've tried to just call the tic_tac_toe() command but nothing comes up and I'm not sure why.

def tic_tac_toe():
    brd = [None] + list(range(1,10)) 
    end = False
    winner = ((1,2,3),(4,5,6),(7,8,9),(1,4,7),(2,5,8),(3,6,9),(1,5,9),    (3,5,7))
    from IPython.display import clear_output
    def show_board():
        print(brd[1]+'|'+brd[2]+'|'+brd[3])
        print(brd[4]+'|'+brd[5]+'|'+brd[6])
        print(brd[7]+'|'+brd[8]+'|'+brd[9])
        print()
    def player_input():
        marker = ''
        while marker != 'x' and marker != 'o':
            marker = input('Do you want to be x or o?: ')
        player1 = marker
        if player1 == 'x':
            player2 ='o'
        else:
            player2 = 'x'
        player_markers = [player1,player2]
    def choose_number():
         while True:
                try:
                    val = int(input())
                    if val in brd:
                        return val
                   else:
                        print('\n Please choose another number')
                except ValueError:
                    print('\n Please choose another number')
    def game_over():
        for a, b, c in winner:
            if brd[a] == brd[b] == brd[c]:
                print("{0} wins!\n".format(board[a]))
                print("Congrats\n")
                return True
        if 9 == sum((pos == 'x' or pos == 'o') for pos in board):
            print("The game ends in a tie\n")
            return True
        for player in 'x' or 'o' * 9:
            draw()
            if is_game_over():
                break
            print("{0} pick your move".format(player))
            brd[choose_number()] = player
            print()
    while True:
        tac_tac_toe()
        if input("Play again (y/n)\n") != "y":
            break

I'm not sure why it is not running normally.


Solution

  • There's a couple things wrong with your code here. Your indentation for one. Also wondering why your functions are all in another function. You also create a bunch of functions but never call most of them. And have some functions that do not seem to exist. There are also a lot of logic errors here and there.

    Try this instead:

    # numpy is a package that has a lot of helpful functions and lets you manipulate
    # numbers and arrays in many more useful ways than the standard Python list allows you to
    import numpy as np
    
    def show_board(brd):
        print(brd[0]+'|'+brd[1]+'|'+brd[2])
        print(brd[3]+'|'+brd[4]+'|'+brd[5])
        print(brd[6]+'|'+brd[7]+'|'+brd[8])
        print()
    
    def player_input():
        marker = ''
        while marker != 'x' and marker != 'o':
            marker = input('Do you want to be x or o?: ')
        player1 = marker
        if player1 == 'x':
            player2 ='o'
        else:
            player2 = 'x'
        player_markers = [player1,player2]
        return player_markers
    
    def choose_number(brd):
        while True:
            try:
                val = int(input())
                if brd[val-1] == "_":
                    return val
                else:
                    print('\nNumber already taken. Please choose another number:')
            except ValueError:
                print('\nYou did not enter a number. Please enter a valid number:')
    
    def is_game_over(winner, brd):
        for a, b, c in winner:
            if brd[a] != "_" and (brd[a] == brd[b] == brd[c]):
                print("{} wins!\n".format(brd[a]))
                print("Congrats\n")
                return True
        if 9 == sum((pos == 'x' or pos == 'o') for pos in brd):
            print("The game ends in a tie\n")
            return True
    
    # I split this function in two because the "is_game_over" code was included here
    # instead of being by itself.         
    def game_over(winner, brd, player_markers):
        last = 0
        # The first player is the one stored in "player_markers[0]"
        player = player_markers[0]
        # There are nine turns so that is what this is for. It has nothing to do with
        # 'x' or 'o'. And one more turn is added for the "is_game_over" to work in 
        # case of a tie.
        for i in range(10):
            if is_game_over(winner, brd):
                break
            print()
            print("{0} pick your move [1-9]:".format(player))
            brd[choose_number(brd)-1] = player
            show_board(brd)
            # This is added to change from one player to another 
            # by checking who was the last one (look up ternary operators)
            player = player_markers[1] if last==0 else player_markers[0]
            last = 1 if last==0 else 0
    
    def tic_tac_toe():
        brd = ["_"] * 9 
        end = False
        winner = ((1,2,3),(4,5,6),(7,8,9),(1,4,7),(2,5,8),(3,6,9),(1,5,9),(3,5,7))
        winner = np.array([list(elem) for elem in winner]) - 1
        player_markers = player_input()
        show_board(brd)
        game_over(winner, brd, player_markers)
    
    
    while True:
        tic_tac_toe()
        if input("Play again (y/n)\n") != "y":
            break