Harry Kitchener
Harry Kitchener

Reputation: 149

Why is the Python/ Pygame program not running?

So, i'm developing a game for a school project. I'm sort of new to Python/ Pygame so there's still some stuff I don't understand. I made my whole project, without defining functions, I then learned about them and added them in. Ever since I added them, the Pygame window doesn't even show up. What's wrong?

I'm new to StackOverflow and don't know how to add this to a code sample. Could someone please do this for me? Thanks.

import pygame, math, sys, random
pygame.init()

#Variables
darkYellow = 204,204,0
grey = 102, 102, 102
black = 0, 0, 0
white = 255, 255, 255
red = 255,0,0
marroon = 120, 0, 0
green = 0,255,0
blue = 0,0,255
darkBlue = 0,0,128

resolution = 650, 600
myFont = pygame.font.SysFont("Times New Roman", 30)
myFont2 = pygame.font.SysFont("Times New Roman", 15)
myFont3 = pygame.font.SysFont("Times New Roman", 60)

redLeft = 150, 575
redRight = 280, 575
blackLeft = 370, 575
blackRight = 500, 575
radius = 20

def main():
    global window
    window = pygame.display.set_mode(resolution)
    pygame.display.set_caption('Harrys Game')
    window.fill(grey)
    pygame.display.update()

#Main menu
def mainMenu():

    rectWidth = 150
    rectHeight = 40

    #Draw buttons
    pygame.draw.rect(window, (white),(250, 150, rectWidth, rectHeight),0)
    pygame.draw.rect(window, (white),(250, 225, rectWidth, rectHeight),0)
    pygame.draw.rect(window, (white),(250, 300, rectWidth, rectHeight),0)
    highlight = pygame.draw.rect(window, (darkYellow),(250, 150, rectWidth,             rectHeight),0)
    pygame.display.update()

    playGameText = myFont.render("Play Game", 1, red)
    window.blit(playGameText, (260, 150))
    optionsText = myFont.render("Options", 1, red)
    window.blit(optionsText, (275, 225))
    exitText = myFont.render("Exit", 1, red)
    window.blit(exitText, (300, 300))
    pygame.display.update()

def grid():
    startBar = pygame.draw.lines(window, black, False, [(0,545.46),(541.7,545.46)], 5)
    bar2 = pygame.draw.lines(window, black, False, [(0,490.92),(541.7,490.92)], 5)
    bar3 = pygame.draw.lines(window, black, False, [(0,436.38),(541.7,436.38)], 5)
    bar4 = pygame.draw.lines(window, black, False, [(0,381.84),(541.7,381.84)], 5)
    bar5 = pygame.draw.lines(window, black, False, [(0,327.3),(541.7,327.3)], 5)
    bar6 = pygame.draw.lines(window, black, False, [(0,272.76),(541.7,272.76)], 5)
    bar7 = pygame.draw.lines(window, black, False, [(0,218.22),(541.7,218.22)], 5)
    bar8 = pygame.draw.lines(window, black, False, [(0,163.68),(541.7,163.68)], 5)
    bar9 = pygame.draw.lines(window, black, False, [(0,109.14),(541.7,109.14)], 5)
    bar10 = pygame.draw.lines(window, black, False, [(0,54.6),(541.7,54.6)], 5)

    #Draw side columns
    rightBar = pygame.draw.lines(window, black, False, [(541.7,600),(541.7,0)], 5)
    leftBar = pygame.draw.lines(window, black, False, [(108.3,600),(108.3,0)], 5)
    centreBar = pygame.draw.lines(window, black, False, [(325,0),(325,600)], 5)

    #Right column text
    label1 = myFont2.render("You rolled a:", 1, black)
    window.blit(label1, (545, 20))
    rollLabel = myFont2.render("Hit space", 1, black)
    window.blit(rollLabel, (545, 100))
    rollLabel2 = myFont2.render("to roll again", 1, black)
    window.blit(rollLabel2, (545, 117))


    #Display column numbers
    start1 = myFont.render("START", 1, black)
    window.blit(start1, (8, 545.46))
    side2 = myFont.render("2", 1, black)
    window.blit(side2, (54.15, 490.92))
    side3 = myFont.render("3", 1, black)
    window.blit(side3, (54.15, 436.38))
    side4 = myFont.render("4", 1, black)
    window.blit(side4, (54.15, 381.84))
    side5 = myFont.render("SAFE 5", 1, black)
    side6 = myFont.render("6", 1, black)
    window.blit(side6, (54.15, 272.76))
    side7 = myFont.render("7", 1, black)
    window.blit(side7, (54.15, 218.22))
    side8 = myFont.render("8", 1, black)
    window.blit(side8, (54.15, 163.68))
    side9 = myFont.render("9", 1, black)
    window.blit(side9, (54.15, 109.14))
    side10 = myFont.render("10", 1, black)
    window.blit(side10, (54.15, 54.6))
    finish11 = myFont.render("FINISH", 1, black)
    window.blit(finish11, (8, 0))

def counters():
    redCountLeft = pygame.draw.circle(window, marroon, redLeft, radius)
    redCountRight = pygame.draw.circle(window, marroon, redRight, radius)
    blackCountLeft = pygame.draw.circle(window, black, blackLeft, radius)
    blackCountRight = pygame.draw.circle(window, black, blackRight, radius)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
             pygame.quit(); sys.exit();
        if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            #Dice roll
            diceRoll = random.randint(1, 4)
            diceRollLabel = myFont3.render(str(diceRoll), 1, black)
            window.blit(diceRollLabel, (580, 35))
            print("Dice roll test", diceRoll)
            pygame.display.update()

Upvotes: 0

Views: 580

Answers (2)

Peter Gibson
Peter Gibson

Reputation: 19574

You need to call your functions. When a function is defined, the interpreter does not execute that code. You need to call it later when you want that block of code to run, for example:

>>> def main():
...     print('hi')
... 
>>> # nothing printed
... 
>>> main()
hi

Typically in Python, you will have a statement like:

if __name__ == '__main__':
    main()

This means if this file is called as the main python module (passed to the python executable with python blah.py) then run the main() function. The main() function will contain the full program logic, calling out to other functions as needed.

For you code, you probably want something like (untested)

if __name__ == '__main__':
    main() # initialise the window
    while True:
        mainMenu() # draw the mainMenu
        grid()     # draw the grid
        counters() # draw the counters

        # process events in this loop
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                 pygame.quit(); sys.exit();
            if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
                #Dice roll
                diceRoll = random.randint(1, 4)
                diceRollLabel = myFont3.render(str(diceRoll), 1, black)
                window.blit(diceRollLabel, (580, 35))
                print("Dice roll test", diceRoll)
                pygame.display.update()

Upvotes: 2

kylieCatt
kylieCatt

Reputation: 11049

def grid() shouldn't be indented or the lines that should be a part of the grid() function need to be indented 4 spaces

Upvotes: 1

Related Questions