2

I am writing a simple Tic-Tac-Toe game that is a player vs computer game, and I keep getting the "TypeError: 'bool' object is not callable" Error, and I do not understand why I am getting these errors. I have gone through both the formatting and the syntax multiple times and I can't see anything wrong with my code but I keep getting a few errors. Here is my code.

import random


def drawBoard(board):
    #This function prints out the board that it was passed.

    #board" is a list of 10 strings representing the board (ignore index 0).
    print(board[7] + '| ' + board[8] + '| ' + board[9])
    print('-+-+-')
    print(board[4] + '| ' + board[5] + '| ' + board[6])
    print('-+-+-')
    print(board[1] + '| ' + board[2] + '| ' + board[3])

def inputPlayerLetter():
    letter = ''
    while not (letter == 'X' or letter == '0'):
        print('Do you want to be X or O?')
        letter = input().upper()
    if letter == 'X':
        return ['X', '0']
    else:
        return ['0', 'X']

def whoGoesFirst():
    if random.randint(0,1) == 0:
        return ' computer'
    else:
        return ' player'

def makeMove(board, letter, move):
    board[move] = letter

def isWinner(bo, le):
    return ((bo[7] == le and bo[8] == le and bo [9] == le) or 
    (bo[4] == le and bo[5] == le and bo [6] == le)
    (bo[1] == le and bo[2] == le and bo [3] == le)
    (bo[7] == le and bo[4] == le and bo [1] == le)
    (bo[8] == le and bo[5] == le and bo [2] == le)
    (bo[9] == le and bo[6] == le and bo [3] == le)
    (bo[7] == le and bo[5] == le and bo [3] == le)
    (bo[9] == le and bo[5] == le and bo [1] == le))

def getBoardCopy(board):
    boardCopy = []
    for i in board:
        boardCopy.append(i)
    return boardCopy

def isSpaceFree(board, move):
    return board[move] == ' '

def getPlayerMove(board):
    move = ' '
    while move not in '1 2 3 4 5 6 7 8 9'.split() or not isSpaceFree(board, int(move)):
        print('What is your next move? (1-9)')
        move = input()
    return int(move)

def chooseRandomMoveFromList(board, movesList):
    possibleMoves = []
    for i in movesList:
        if isSpaceFree(board, i):
            possibleMoves.append(i)

    if len(possibleMoves) !=0:
        return random.choice(possibleMoves)
    else:
        return None

def getComputerMove(board, computerLetter):
    if computerLetter == 'X':
        playerLetter = '0'
    else:
        playerLetter = 'X'

    for i in range(1, 10):
        boardCopy = getBoardCopy(board)
        if isSpaceFree (boardCopy, i):
            makeMove(boardCopy, computerLetter, i)
            if isWinner(boardCopy, computerLetter):
                return i

    for i in range(1,10):
        boardCopy = getBoardCopy(board)
        if isSpaceFree(boardCopy, i):
            makeMove(boardCopy, playerLetter, i)
            if isWinner(boardCopy, playerLetter):
                return i

    move = chooseRandomMoveFromList (board, [1, 3, 7, 9])
    if move !=None:
        return move

    if isSpaceFree(board, 5):
        return 5

    return chooseRandomMoveFromList(board, [2, 4, 6, 8])

def isBoardFull(board):
    for i in range(1,10):
        if isSpaceFree(board, i):
            return False
        return True


print('Welcome to Tic-Tac-Toe!')

while True:
    theBoard = [' '] * 10
    playerLetter, computerLetter = inputPlayerLetter()
    turn = whoGoesFirst()
    print('The' +turn+ ' will go first.')
    gameIsPlaying = True

    while gameIsPlaying:
        if turn == 'player':
            drawBoard(theBoard)
            move = getPlayerMove(theBoard)
            makeMove(theBoard, playerLetter, move)

            if isWinner(theBoard, playerLetter):
                drawBoard(theBoard)
                print('Horray! You have won the game!')
                gameIsPlaying = False
            else:
                if isBoardFull(theBoard):
                    drawBoard(theBoard)
                    print('The game is a tie!')
                    break
                else:
                    turn = 'computer'

        else:
            move = getComputerMove(theBoard, computerLetter)
            makeMove(theBoard, computerLetter, move)

            if isWinner(theBoard, computerLetter):
                drawBoard(theBoard)
                print('The computer has beaten you! You lose.')
                gameIsPlaying = False
            else:
                if isBoardFull(theBoard):
                    drawBoard(theBoard)
                    print('The game is a tie!')
                    break
                else:
                    turn = 'player'

    print('Do you want to play again? (yes or no)')
    if not input().lower().startswith('y'):
        break
1
  • 2
    Welcome to stack overflow! Please edit to include the full error traceback as that will tell where the error is occurring Commented Feb 17, 2020 at 16:54

3 Answers 3

1

The problem is in this function:

def isWinner(bo, le):
    return ((bo[7] == le and bo[8] == le and bo [9] == le) or
    (bo[4] == le and bo[5] == le and bo [6] == le)
    (bo[1] == le and bo[2] == le and bo [3] == le)
    (bo[7] == le and bo[4] == le and bo [1] == le)
    (bo[8] == le and bo[5] == le and bo [2] == le)
    (bo[9] == le and bo[6] == le and bo [3] == le)
    (bo[7] == le and bo[5] == le and bo [3] == le)
    (bo[9] == le and bo[5] == le and bo [1] == le))

You have an or after the first line, but it's missing on all the other lines.

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

Comments

1

This is the proper way of writing isWinner:

def isWinner(bo, le):
    return ((bo[7] == le and bo[8] == le and bo[9] == le) or
            (bo[4] == le and bo[5] == le and bo[6] == le) or
            (bo[1] == le and bo[2] == le and bo[3] == le) or
            (bo[7] == le and bo[4] == le and bo[1] == le) or
            (bo[8] == le and bo[5] == le and bo[2] == le) or
            (bo[9] == le and bo[6] == le and bo[3] == le) or
            (bo[7] == le and bo[5] == le and bo[3] == le) or
            (bo[9] == le and bo[5] == le and bo[1] == le))

Comments

0

1) There is logical error in the return condition of function isWinner. Try to debug the function isWinner separately.

2) You can include some comments to your code to make it more readable. Include also a main function with the command:

if __name__ = "__main__":
    # main body

to make your code run faster. As you have it now, you have many global variables that take more time to run/execute.

Comments

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.