syntax error - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: General Coding Help (https://python-forum.io/forum-8.html) +--- Thread: syntax error (/thread-31792.html) |
syntax error - CompleteNewb - Jan-03-2021 Hello, I'm just starting coding and I had a syntax error that I don't understand. I'm copying from a book and I checked the code in different code checker online. I checked the indentation and I checked on the internet but I can't find an answer. Here's the code #Memory import random, pygame, sys from pygame.locals import * FPS = 30 WINDOWWIDTH = 640 WINDOWHEIGHT = 480 REVEALSPEED = 8 BOXSIZE = 40 GAPSIZE = 10 BOARDWIDTH = 10 BOARDHEIGHT = 7 assert(BOARDWIDTH * BOARDHEIGHT) % 2 == 0, 'Board needs to have an even number of boxes for pairs of matches.' XMARGIN = int((WINDOWWIDTH - (BOARDWIDTH * (BOXSIZE + GAPSIZE))) / 2) YMARGIN = int((WINDOWHEIGHT - (BOARDHEIGHT * (BOXSIZE + GAPSIZE))) / 2) GRAY = ( 100, 100, 100) NAVYBLUE = ( 60, 60, 100) WHITE = ( 255, 255, 255) RED = ( 255, 0, 0) GREEN = ( 0, 255, 0) BLUE = ( 0, 0, 255) YELLOW = ( 255, 255, 0) ORANGE = ( 255, 128, 0) PURPLE = ( 255, 0, 255) CYAN = ( 0, 255, 255) BGCOLOR = NAVYBLUE LIGHTBGCOLOR = GRAY BOXCOLOR = WHITE HIGHLIGHTCOLOR = BLUE DONUT = 'donut' SQUARE = 'square' DIAMOND = 'diamond' LINES = 'lines' OVAL = 'oval' ALLCOLORS = (RED, GREEN, BLUE, YELLOW, ORANGE, PURPLE, CYAN) ALLSHAPES = (DONUT, SQUARE, DIAMOND, LINES, OVAL) assert len(ALLCOLORS) * len(ALLSHAPES) * 2 >= BOARDWIDTH * BOARDHEIGHT, "Board is too big for the number of shapes/colors defined." def main(): global FPSCLOCK, DISPLAYSURF pygame.init() FPSCLOCK = pygame.time.Clock() DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT)) mousex = 0 mousey = 0 pygame.display.set_caption('Memory Game') mainBoard = getRandomizedBoard() revealedBoxes = generateRevealedBoxesData(False) mainBoard = [[(DONUT, BLUE), (LINES, BLUE), (SQUARE, ORANGE)], [(SQUARE, GREEN), (DONUT, BLUE), (DIAMOND, YELLOW)], [(SQUARE, GREEN), (OVAL, YELLOW), (SQUARE, ORANGE)], [(DIAMOND, YELLOW), (LINES, BLUE), (OVAL, YELLOW)]] firstSelection = NONE DISPLAYSURF.fill(BGCOLOR) startGameAnimation(mainBoard) while TRUE: mouseClicked = False DISPLAYSURF.fill(BGCOLOR) drawBoard(mainBoard, revealedBoxes) for event in pygame.event.get(): if event.type ==QUIT or (event.type == KEYUP and event.key == K_ESCAPE): pygame.quit() sys.exit() elif event.type == MOUSEMOTION: mousex, mousey = event.pos elif event.type == MOUSEBUTTONUP: mousex, mousey = event.pos mouseClicked = True boxx, boxy = getBoxAtPixel(mousex, mousey) if boxx != None and boxy !=None: if not revealedBoxes[boxx][boxy]: drawHighlightBox(boxx, boxy) if not revealedBoxes[boxx][boxy] and mouseClicked: revealBoxesAnimation(mainBoard,[(boxx, boxy)]) revealedBoxes[boxx][boxy] = True if firstSelection == None: firstSelection = (boxx, boxy) else: icon1shape, icon1color = getShapeAndColor(mainBoard, firstSelection[0], firstSelection[1]) icon2shape,icon2color = getShapeAndColor(mainBoard, boxx, boxy) if iconshape != icon2shape or icon1color != icon2color: pygame.time.wait(1000) coverBoxesAnimation(mainBoard,[(firstSelection[0], firstSelection[1]), (boxx, boxy)]) revealedBoxes[firstSelection[0]][firstSelection[1]] = False revealedBoxes[boxx][boxy] = False elif hasWon(revealedBoxes): gameWonAnimation(mainBoard) pygame.time.wait(2000) mainBoard = getRandomizedBoard() revealedBoxes = generateRevealedboxesData(False) drawBoard(mainBoard, revealedBoxes) pygame.display.update() pygame.time.wait(1000) startGameAnimation(mainBoard) firstSelection = None pygame.display.update() FPSCLOCK.tick(FPS) def generateRevealedBoxesData(val): revealedBoxes = [] for i in range(BOARDWIDTH): revealedBoxes.append([val] * BOARDHEIGHT) return revealedBoxes def getrandomizedBoard(): icons = [] for color in ALLCOLORS: for shape in ALLSHAPES: icons.append((shape, color)) random.shuffle(icons) numIconsUsed = int(BOARDWIDTH * BOARDHEIGHT/2) icons = icons[:numIconsUsed] * 2 random.shuffle(icons) board = [] for x in range(BOARDWIDTH): column = [] for y in range(BOARDHEIGHT): column.append(icons[0]) del icons[0] board.append(column) return board def splitIntoGroupsOf(groupSize, theList): result = [] for i in range(0, len(theList), groupSize): result.append(theList[i:i + groupSize]) return result def leftTopCoordsOfBox(boxx, boxy): left = boxx * (BOXSIZE + GAPSIZE) + XMARGIN top = Boxy * (BOXSIZE + GAPSIZE) + YMARGIN return(left, top) def getBoxAtPixel(x, y): for boxx in range(BOARDWIDTH): for boxy in range(BOARDHEIGHT): left, top = leftTopCoordsOfBox(boxx, boxy) boxRect = pygame.Rect(left, top, BOXSIZE, BOXESIZE) if boxRect.collidepoint(x, y): return (boxx, boxy) return (None, None) def drawIcon(shape, color, boxx, boxy): quarter = int(BOXSIZE * 0.25) half = int(BOXSIZE * 0.5) left, top = leftTopCoordsOfBox(boxx, boxy) if shape == DONUT: pygame.draw.circle(DISPLAYSURF, color, (left + half, top+ half), half = 5) pygame.draw.circle(DISPLAYSURF, BGCOLOR, (left + half, top + half), quarter - 5) elif shape == SQUARE: pygame.draw.rect(DISPLAYSURF, color, (left + quarter, top + quarter, BOXSIZE - half, BOXSIZE - half)) elif shape == DIAMOND: pygame.draw.polygone(DISPLAYSURF, color, ((left + half, top), (left + BOXSIZE - 1, top + half), (left + half, top + BOXSIZE - 1), (left, top + half))) elif shape == LINES: for i in range(0, BOXSIZE, 4): pygame.draw.line(DISPLAYSURF, color, (left, top + i), (left + i, top)) pygame.draw.line(DISPLAYSURF, color, (left + i, top + BOXSIZE - 1), (Left + BOXSIZE - 1, top + i)) elif shape == OVAL: pygame.draw.ellipse(DISPLAYSURF, color, (left, top + quarter, BOXSIZE, half)) def getShapeAndColor(board, boxx, boxy): return board[boxx][boxy[0], board[boxx][boxy][1] def drawBoxCovers(board, boxes, coverage): for box in boxes: left, top = leftTopCoordsOfBox(box[0], box[1]) pygame.draw.rect(DISPLAYSURF, BGCOLOR, (left, top, BOXSIZE, BOXSIZE)) shape, color = getShapeAndColor(board, box[0], box[1]) drawIcon(shape, color, box[0], box[1]) if coverage > 0: pygame.draw.rect(DISPLAYSURF, BOXCOLOR, (left, top, coverage, BOXSIZE)) pygame.display.update() FPSCLOCK.tick(FPS) def revealBoxesAnimation(board, boxesToReveal): for coverage in range(BOXSIZE, (-REVEALSPEED) -1, -REVEALSPEED): drawBoxCovers(board, boxesToReveal, coverage) def coverBoxesAnimation(board, boxesToCover): for coverage in range(0, BOXSIZE + REVEALSPEED, REVEALSPEED): drawBoxCovers(board, boxesToCover, coverage) def drawBoard(board, revealed): for boxx in range(BOARDWIDTH): for boxy in range(BOXHEIGHT): left, top = leftTopCoordsOfBox(boxx, boxy) if not revealed[boxx][boxy]: pygame.draw.rect(DISPLAYSURF, BOXCOLOR, (left, top, BOXSIZE, BOXSIZE)) else: shape, color = getShapeAndColor(board, boxx, boxy) drawIcon(shape, color, boxx, boxy) def drawHighlightBox(boxx, boxy): left, top = leftTopCoordsOfBox(boxx, boxy) pygame.draw.rect(DISPLAYSURF, HIGHLIGHTCOLOR, (left -5, top - 5, BOXSIZE + 10, BOXSIZE + 10), 4) def startgameAnimation(board): coveredBoxes = generateRevealedBoxesData(False) boxes = [] for x in range(BOARDWIDTH): for y in range(BOARDHEIGHT); boxes.append((x, y)) random.shuffle(boxes) boxeGroups = splitIntoGroupsOf(8, boxes) drawBoard(board, coveredBoxes) for boxgroup in boxGroups: revealBoxesAnimation(board, boxGroup) coverBoxesAnimation(board, boxgroup) def gameWonAnimation(board): coveredBoxes = generateRevealedBoxesData(True) color1 = LIGHTBGCOLOR color2-BGCOLOR do i in range(13): color1, color2 = color2, color1 DISPLAYSURF.fill(color1) drawBoard(board, coveredBoxes) pygame.display.update() pygame.time.wait(300) def hasWon(revealedBoxes): for i in revealedBoxes: if False in i: return False return True if __name__ == '__main__': main()And this is the error I have I'm working on Python 3.8.5 (default, Jul 28 2020, 12:59:40) [GCC 9.3.0] on linux Keep in mind that I have been coding for only a month thanks for your time RE: syntax error - bowlofred - Jan-03-2021 If you don't see any problem on that specific line, look at the code before it. In this case you don't have balanced brackets on the previous line. RE: syntax error - deanhystad - Jan-03-2021 return board[boxx][boxy^[0], board[boxx][boxy][1] Missing "]" where indicated. RE: syntax error - Axel_Erfurt - Jan-03-2021 maybe you forgot a bracket in Line 205? return board[boxx][boxy][0], board[boxx][boxy][1] RE: syntax error - CompleteNewb - Jan-04-2021 Thanks! but I have another problem... I went through the code and can't find anything that's wrong???Can you help again? RE: syntax error - Axel_Erfurt - Jan-04-2021 I think the len of board[boxx][boxy] is < 2 or has no values
RE: syntax error - deanhystad - Jan-04-2021 I'm guessing that boxx or boxy are out of range. I would add some print statements to help find the error. def getShapeAndColor(board, boxx, boxy): if boxx >= len(board) or boxy >= len(board[boxx]): print(f'getShapeAndColor(board, {boxx}, {boxy})') y_dimensions = [len(y) for y in board] print(f'board = {len(board)}x{y_dimensions}') return DONUT, BLUE if len(board[boxx][boxy]) < 2: print(f'getShapeAndColor(board, {boxx}, {boxy}) = {board[boxx][boxy]}') return DONUT, ORANGE return board[boxx][boxy][0], board[boxx][boxy][1] RE: syntax error - CompleteNewb - Jan-08-2021 I added the code you suggested(which I don't totally comprehend) and I received this error in return: Now like I said, I've just been coding for a couple of months. My understanding is pretty basic and I don't know what to do with this new information:getShapeAndColor(board, 1, 6) board = 4x[3, 3, 3, 3] RE: syntax error - deanhystad - Jan-08-2021 It means you have an error in your code. print(f'getShapeAndColor(board, {boxx}, {boxy})')is printing out which means boxx == 1 and boxy == 6We also know from this That boxx can be in the range 0..3 but boxy can only be in the range 0..2.Now you get to debug your code and find out where boxy is being set to an invalid index. I am glad that Python provides a traceback when an exception is thrown, but for me at least the line that throws the exception is not where the error occurred. Most errors occur long before they result in something that causes your program to crash. I have a feeling that this is the case for your error. You'll have to follow the code backward, find where you are setting boxy, and determine how boxy is getting set to an invalid index. |