This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Unhelpful SyntaxError
Type: Stage: resolved
Components: Parser Versions: Python 3.9
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: eric.smith, lys.nikolaou, pablogsal, terry.reedy
Priority: normal Keywords:

Created on 2022-01-16 20:12 by 1071754, last changed 2022-04-11 14:59 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
tic_tac_toe.py 1071754, 2022-01-16 20:12 tic tac toe in python
Messages (6)
msg410720 - (view) Author: HAYDEN NGUYEN (1071754) Date: 2022-01-16 20:12
Here is my code:
import random
def drawBoard(board):
    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=="O"):
        print('Do you want to be X or O?')
        letter=input.upper()
        if letter =='X':
            return['X','O']
        else:
            return['O','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) 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))
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=='O'
    else:
        playerLetter=='X'

    for i in range(1,10):
        boardCopy=getBoardCopy(board)
        if isSpaceFree(boardCopy,i):
            makeMove(boardCopy,computerLetter,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 
        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('Hooray! 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 beat 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
On def getBoardCopy(board):, it says "SyntaxError:invalid syntax". I looked through the code and found nothing wrong. Why is this?
msg410721 - (view) Author: Eric V. Smith (eric.smith) * (Python committer) Date: 2022-01-16 20:29
This is not the appropriate place to ask for help in debugging your code. I suggest you ask on the python-list mailing list.

The error is that you're missing a bunch of right parenthesis in the isWinner() function.

I do think "Syntax Error" isn't the best error message, though.

Here's a simplified reproducer:
---------------
def f():
     return ((1==2)
x
---------------

Note that in 3.11 (the only other version I have handy), the error is:

  File "foo.py", line 2
    return ((1==2)
           ^
SyntaxError: '(' was never closed

I suspect that we won't fix this in old versions of python.
msg410722 - (view) Author: Eric V. Smith (eric.smith) * (Python committer) Date: 2022-01-16 20:30
[Numeric id's automatically get dropped from the nosy list: trying to add it back]
msg410723 - (view) Author: Eric V. Smith (eric.smith) * (Python committer) Date: 2022-01-16 20:31
[And I was unable to add the numeric id as nosy. Apologies to the OP, who probably will never see this! It's a bug in the bpo software.]
msg410741 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2022-01-17 05:23
For non-coredevs, 'not a bug' means not a bug in the CPython interpreter, as opposed to user code, which here has bugs.

People asking questions (preferably in a more appropriate place) should read, for instance, 
https://stackoverflow.com/help/minimal-reproducible-example
How to create a Minimal, Reproducible Example

A minimal reproducer is '('.  In 3.9, the message is 'unexpected EOF while parsing'.  It is not unusual for beginners to leave out the message when reporting an exception in text rather than copy-pasting the last few lines of the traceback (which indicates exactly where the error is caught).

[bpo software should be rejecting number IDs]

I sent an email to Hayden.
msg410742 - (view) Author: Terry J. Reedy (terry.reedy) * (Python committer) Date: 2022-01-17 05:26
Email bounced.
History
Date User Action Args
2022-04-11 14:59:54adminsetgithub: 90561
2022-01-17 05:26:33terry.reedysetmessages: + msg410742
2022-01-17 05:23:27terry.reedysetstatus: open -> closed
messages: + msg410741

assignee: terry.reedy ->
resolution: not a bug
stage: resolved
2022-01-16 20:31:46eric.smithsetmessages: + msg410723
2022-01-16 20:30:15eric.smithsetmessages: + msg410722
2022-01-16 20:29:39eric.smithsettitle: SyntaxError for no reason -> Unhelpful SyntaxError
nosy: + pablogsal, eric.smith, lys.nikolaou, - 1071754

messages: + msg410721

components: + Parser, - IDLE
2022-01-16 20:12:331071754create