0

I am writing a code for tic-tac-toe and am a bit stuck! The user inputs a position and if the position inputed is empty (there is a number in its place) I would like to change the number to either X or O.

In my code below I have created a dictionary with a key representing the position on the board.

Can I call the content of the value of the key in my dictionary instead of the actual value; e.g. if the input is 0 I would like to use 'display_list[0][0]' instead of the value of display_list[0][0] which in this instance is 0.

row_1 = [0,1,2]
row_2 = [3,4,5]
row_3 = [6,7,8]
display_list = [row_1, row_2, row_3]

def valid_position():
    positions = {'0':display_list[0][0],
                 '1':display_list[0][1],
                 '2':display_list[0][2],
                 '3':display_list[1][0],
                 '4':display_list[1][1],
                 '5':display_list[1][2],
                 '6':display_list[2][0],
                 '7':display_list[2][1],
                 '8':display_list[2][2]
                }
    x = str(user_input())      # This is a user input from 0-8

    if x == str(positions[x]):
        display_list[..][..] = 'X'

Thanks

unaied
  • 197
  • 11
  • There's [python - How to pass a list element as reference? - Stack Overflow](https://stackoverflow.com/questions/15774584/how-to-pass-a-list-element-as-reference), and answers there can be adapted to this case without too much difficulty (if you understand it) – user202729 Jan 09 '21 at 12:10
  • Also it's best if you make the code a [example] -- in this case, you can replace `user_input()` with `0`. – user202729 Jan 09 '21 at 12:12

2 Answers2

0

if you want to go arround, you may add another dictionary to get the output you want like:

    positions_labels = {'0':'display_list[0][0]',
                 '1':'display_list[0][1]',
                 '2':'display_list[0][2]',
                 '3':'display_list[1][0]',
                 '4':'display_list[1][1]',
                 '5':'display_list[1][2]',
                 '6':'display_list[2][0]',
                 '7':'display_list[2][1]',
                 '8':'display_list[2][2]'
                }

so wherever you want the location use positions_labels[x]

Addition upon comment: If you want to evaluate the string content (get its value) you can do that as in the link

How to evaluate a math expression given in string form?

Nour-Allah Hussein
  • 1,439
  • 1
  • 8
  • 17
-1

Personally, this isn't a good way of writing tic tac toe. If I were you, I would use a different method consisting of arrays and if statements.

Here is how I would do it (feel free to continue your way! :)

# Function to print Tic Tac Toe
def print_tic_tac_toe(values):
    print("\n")
    print("\t     |     |")
    print("\t  {}  |  {}  |  {}".format(values[0], values[1], values[2]))
    print('\t_____|_____|_____')
 
    print("\t     |     |")
    print("\t  {}  |  {}  |  {}".format(values[3], values[4], values[5]))
    print('\t_____|_____|_____')
 
    print("\t     |     |")
 
    print("\t  {}  |  {}  |  {}".format(values[6], values[7], values[8]))
    print("\t     |     |")
    print("\n")
 
 
# Function to print the score-board
def print_scoreboard(score_board):
    print("\t--------------------------------")
    print("\t              SCOREBOARD       ")
    print("\t--------------------------------")
 
    players = list(score_board.keys())
    print("\t   ", players[0], "\t    ", score_board[players[0]])
    print("\t   ", players[1], "\t    ", score_board[players[1]])
 
    print("\t--------------------------------\n")
 
# Function to check if any player has won
def check_win(player_pos, cur_player):
 
    # All possible winning combinations
    soln = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 4, 7], [2, 5, 8], [3, 6, 9], [1, 5, 9], [3, 5, 7]]
 
    # Loop to check if any winning combination is satisfied
    for x in soln:
        if all(y in player_pos[cur_player] for y in x):
 
            # Return True if any winning combination satisfies
            return True
    # Return False if no combination is satisfied       
    return False       
 
# Function to check if the game is drawn
def check_draw(player_pos):
    if len(player_pos['X']) + len(player_pos['O']) == 9:
        return True
    return False       
 
# Function for a single game of Tic Tac Toe
def single_game(cur_player):
 
    # Represents the Tic Tac Toe
    values = [' ' for x in range(9)]
     
    # Stores the positions occupied by X and O
    player_pos = {'X':[], 'O':[]}
     
    # Game Loop for a single game of Tic Tac Toe
    while True:
        print_tic_tac_toe(values)
         
        # Try exception block for MOVE input
        try:
            print("Player ", cur_player, " turn. Which box? : ", end="")
            move = int(input()) 
        except ValueError:
            print("Wrong Input!!! Try Again")
            continue
 
        # Sanity check for MOVE inout
        if move < 1 or move > 9:
            print("Wrong Input!!! Try Again")
            continue
 
        # Check if the box is not occupied already
        if values[move-1] != ' ':
            print("Place already filled. Try again!!")
            continue
 
        # Update game information
 
        # Updating grid status 
        values[move-1] = cur_player
 
        # Updating player positions
        player_pos[cur_player].append(move)
 
        # Function call for checking win
        if check_win(player_pos, cur_player):
            print_tic_tac_toe(values)
            print("Player ", cur_player, " has won the game!!")     
            print("\n")
            return cur_player
 
        # Function call for checking draw game
        if check_draw(player_pos):
            print_tic_tac_toe(values)
            print("Game Drawn")
            print("\n")
            return 'D'
 
        # Switch player moves
        if cur_player == 'X':
            cur_player = 'O'
        else:
            cur_player = 'X'
 
if __name__ == "__main__":
 
    print("Player 1")
    player1 = input("Enter the name : ")
    print("\n")
 
    print("Player 2")
    player2 = input("Enter the name : ")
    print("\n")
     
    # Stores the player who chooses X and O
    cur_player = player1
 
    # Stores the choice of players
    player_choice = {'X' : "", 'O' : ""}
 
    # Stores the options
    options = ['X', 'O']
 
    # Stores the scoreboard
    score_board = {player1: 0, player2: 0}
    print_scoreboard(score_board)
 
    # Game Loop for a series of Tic Tac Toe
    # The loop runs until the players quit 
    while True:
 
        # Player choice Menu
        print("Turn to choose for", cur_player)
        print("Enter 1 for X")
        print("Enter 2 for O")
        print("Enter 3 to Quit")
 
        # Try exception for CHOICE input
        try:
            choice = int(input())   
        except ValueError:
            print("Wrong Input!!! Try Again\n")
            continue
 
        # Conditions for player choice  
        if choice == 1:
            player_choice['X'] = cur_player
            if cur_player == player1:
                player_choice['O'] = player2
            else:
                player_choice['O'] = player1
 
        elif choice == 2:
            player_choice['O'] = cur_player
            if cur_player == player1:
                player_choice['X'] = player2
            else:
                player_choice['X'] = player1
         
        elif choice == 3:
            print("Final Scores")
            print_scoreboard(score_board)
            break  
 
        else:
            print("Wrong Choice!!!! Try Again\n")
 
        # Stores the winner in a single game of Tic Tac Toe
        winner = single_game(options[choice-1])
         
        # Edits the scoreboard according to the winner
        if winner != 'D' :
            player_won = player_choice[winner]
            score_board[player_won] = score_board[player_won] + 1
 
        print_scoreboard(score_board)
        # Switch player who chooses X or O
        if cur_player == player1:
            cur_player = player2
        else:
            cur_player = player1

Hope this gives you some sort of idea as of how to do tic tac toe with arrays

The Pilot Dude
  • 2,091
  • 2
  • 6
  • 24