montainz09
montainz09

Reputation: 335

How do I eliminate the "'str' object is not callable"?

I get the following error on the code below, and have no idea what is going on. I'm very much a beginner and need some help. I am trying to make a very basic game of tic-tac-toe in the console, and am having trouble.

Traceback (most recent call last):
File "D:/Eric/Projects/Tic Tac Toe/Tic Tac Toe.py", line 68, in <module>
printboard()
File "D:/Eric/Projects/Tic Tac Toe/Tic Tac Toe.py", line 15, in printboard
print("",c[0],"|",c[1],"|",c[2],"\n-----------\n",c[3],"|",c[4],"|",c[5],"\n-----------\n",c[6],"|",c[7],"|",c[8])
TypeError: 'str' object is not callable

Code:

import random, time

#Variables
c = [str(i) for i in range(1,10)] #Cells
cpuletter = "string input"
coinoptions = ["heads", "tails"]
coinflip = random.choice(coinoptions)
play = ""
playercell = 0

#Functions
def printboard():    #Prints the gameboard with the cell variables in the spaces
   print("",c[0],"|",c[1],"|",c[2],"\n-----------\n",c[3],"|",c[4],"|",c[5],"\n-----------\n",c[6],"|",c[7],"|",c[8])
   return

#Introduction
print("Welcome to Tic Tac Toe. Below is the playing table.") #Welcome + Explanation
printboard()
print("The playing spaces are numbered 1 through 9.\nYou will use these numbers to refer to the places you would like to play your piece.\n")

#X or O?
playerletter = input("Would you like to be X's or O's?\n")
playerletter = playerletter.capitalize()
playerletter = playerletter[0]

while playerletter not in ["X", "O"]:     #Confirm choice == "X" or "O." If not, ask again.
   playerletter = input("""Sorry, that's not a valid option. Please choose "X" or "O."\n""")
   playerletter = playerletter.capitalize()
   playerletter = playerletter[0]

if playerletter == "X":
    cpuletter = "O"

elif playerletter == "O":
    cpuletter = "X"


#Who goes first?
playercoin = input("Randomizing who goes first:\nDo you choose heads or tails?\n")      #Asking for "heads" or "tails"
playercoin = playercoin.lower()

while playercoin not in ["heads", "tails"]:     #Confirm choice == "Heads" or "Tails." If not, ask again.
   playercoin = input("""Sorry, that's not a valid option. Please choose "heads" or "tails."\n""")
   playercoin = playercoin.lower()

print("...")
time.sleep(1)       #Waits 1 seconds

if coinflip != playercoin:      #Tells player who goes first
    print("It landed " + coinflip + "! I will go first.")
    play = 0

elif coinflip == playercoin:
    print("It landed " + coinflip + "! You will go first.")
    play = 1



#Game
input("""Ready to play? Press "Enter" to begin!\n""")

if play == 0:
    random_index = random.randrange(9) #Randomly selects a cell to change to cpuletter
    c[random_index] = cpuletter
    print = ("Here is my move.")
    printboard()

elif play == 1: #Allows player to choose cell to change to playerletter
    printboard()
    playercell = int(input("It's your turn. Type a cell number to choose where you play.\n"))
    playercell = playercell - 1
    c[playercell] = playerletter
    printboard()

Edit: Forgot to say that this only happens when the computer goes first, and not the player. I fixed the print = ("Here is my move.") but am still having problems.

Upvotes: 0

Views: 119

Answers (3)

Jerrybibo
Jerrybibo

Reputation: 1325

I ran your code, but I did not get any errors. This particular TypeError is usually caused by programmers mistakenly switching out square brackets with parentheses (therefore "calling" it as if the string was a function, which it's not.). Please check and run your code again.

EDIT: Solution: Change the variable name of print = "Here is my move." on line 65 to something else, like movePrint = "Here is my move".

Upvotes: 0

abe
abe

Reputation: 504

Why make such a complex printing function? Format would come very handy right about now:

def printboard():    #Prints the gameboard with the cell variables in the spaces
    table = \
    '''
    {} | {} | {}
    ----------
    {} | {} | {}
    ----------
    {} | {} |
    '''
    print(table.format(c[1],c[2],c[3],c[4],c[5],c[6],c[7],c[8]))
    return

And finally to fix your error, change line 65:

move = ("Here is my move")

Upvotes: 2

roippi
roippi

Reputation: 25954

print = "Here is my move."

That line reassigns the builtin print function to a string. Don't do that.

Upvotes: 4

Related Questions