0

I jumped into some Python courses a little while ago and have gotten to a milestone project to make a simple tic-tac-toe game.

But I am running into a bit of a wall due to an index error that keeps happening and I cannot figure out why.

The code is the following:


    #Tic Tac Toe
    game_list = [' '] * 10
    turn_counter = 0
    game_on = True
    
    def show_game(game_list): 
    
        print('   |   |')
        print(' ' + game_list[7] + ' | ' + game_list[8] + ' | ' + game_list[9])
        print('   |   |')
        print('-----------')
        print('   |   |')
        print(' ' + game_list[4] + ' | ' + game_list[5] + ' | ' + game_list[6])
        print('   |   |')
        print('-----------')
        print('   |   |')
        print(' ' + game_list[1] + ' | ' + game_list[2] + ' | ' + game_list[3])
        print('   |   |')
    
    def choose_position():
        
        # Initial Variables
        within_range = False
        acceptable_values = [1,2,3,4,5,6,7,8,9]
        choice = 'WRONG'
    
        # While loop that keeps asking for input
        while choice.isdigit() == False or within_range == False:
        
            choice = input("Please choose a number between 1-9 like a numpad: ")
        
        # DIGIT CHECK
            if choice.isdigit() == False:
                print("Sorry, that is not a digit!")
                
        # RANGE CHECK
            if choice.isdigit() == True:
                if int(choice) in acceptable_values:
                    within_range = True
                else:
                    print("Sorry, you are out of the acceptable range (1-9)")
                    
        return int(choice)
    
    def insert_choice(game_list, position, turn_counter):
        print(type(position))
        print(position)
        # Place the character in the game_list
        if turn_counter%2 == 0 or turn_counter == 0:
            game_list[position] = 'X'
        else:
            game_list[position] = 'O'
    
        return (game_list, position)
    
    def gameon_choice():
        choice = 'wrong'
        while choice not in ['Y', 'N']:
            choice = input("Keep playing? (Y or N) ")
            
            if choice not in ['Y', 'N', 'R']:
                print("sorry, I don't understand, please choose Y or N ")
        
        if choice == 'Y':
            return True
        else:
            return False
    
    while game_on:
        
        show_game(game_list)
        
        position = choose_position()
    
        game_list = insert_choice(game_list,position,turn_counter)
        
        turn_counter += turn_counter
    
        show_game(game_list)
        
        game_on = gameon_choice()

And the error I get is:

Exception has occurred: IndexError
tuple index out of range
  File "Desktop/Tictactoe.py", line 9, in show_game
    print(' ' + game_list[7] + ' | ' + game_list[8] + ' | ' + game_list[9])
  File "Desktop/Tictactoe.py", line 79, in <module>
    show_game(game_list)

What I think is happening is that during the assignment in the insert_choice function:

game_list[position] = 'X' 

the list is somehow converted to a tuple and the variables are appended instead of assigned, and then when trying to display the list again it only has two elements leading to an index error, but I cannot figure out /why/.

I hope someone can help.

Sincerely,

1 Answer 1

0

The insert_choice() method returns a tuple of your game_list and position:

return (game_list, position)

Thus, during your main loop, you store this tuple as the new game_list and try to access indices greater than 1 which leads to this index error.

You can either only return game_list or unpack the returned tuple as:

game_list, position = insert_choice(game_list,position,turn_counter)

Since you don't change the value of position, you probably want to do the former.

Sign up to request clarification or add additional context in comments.

2 Comments

Aha, that makes good sense! Returning only game_list fixed it... Can you explain why return (game_list, position) returns a tuple? Is it because only one value can be returned?
A comma-separated statement of values is Python syntax for creating tuples (with or without parentheses). E.g., val = "a", "b" type(val) -> <class 'tuple'>

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.