Search code examples
pythonmenupygamepgzero

Creating Game with Python: How to add game menu?


I create a little game. I want to add a little Menu (START, QUIT, CREDITS). When the user clicks START the menu should disappear and the game should start. When the user clicks CREDITS a new screen with the credits should appear (see screenshot). I tried it, but i don't know really how to add this. Just the "QUIT" Button is working now. Here is my code:

from random import randint
import pygame

WIDTH   = 800
HEIGHT  = 800

apple = Actor("apple")
apple.pos = randint(0, 800), randint(-800, 0)

pear = Actor("pear")
pear.pos = randint(0, 800), randint(-800, 0)

plum = Actor("plum")
plum.pos = randint(0, 800), randint(-800, 0)

donut = Actor("donut")
donut.pos = randint(0, 800), randint(-800, 0)

ice = Actor("ice")
ice.pos = randint(0, 800), randint(-800, 0)

chips = Actor("chips")
chips.pos = randint(0, 800), randint(-800, 0)

happysmiley = Actor("happysmiley")
happysmiley.pos = 300, 750

start = Actor("start")
start.pos = 700,750

quitgame = Actor("quit")
quitgame.pos = 600, 750

creditsinfo = Actor("credits")
creditsinfo.pos = 485, 750

gameover = False
score = 0
gamemode = 1

background = pygame.image.load("images\\background.png")

pygame.mixer.init()
pygame.mixer.music.load("music\\funmusic.mp3")
pygame.mixer.music.play(-1)

def draw():
    screen.clear()
    if score >= 100:
        endoflevel1()
    else:
        drawgame()

def drawgame():
    global game_mode
    if gamemode == 1:  
        screen.clear
        screen.blit("background",(0,0))
        apple.draw()
        pear.draw()
        plum.draw()
        donut.draw()
        ice.draw()
        chips.draw()
        quitgame.draw()
        happysmiley.draw()
        start.draw()
        creditsinfo.draw()
        screen.draw.text("Punkte: " + str(score), (700, 5), color = "black")
    elif gamemode == 0:
        screen.clear
        screen.blit("background",(0,0))
        apple.draw()
        pear.draw()
        plum.draw()
        donut.draw()
        ice.draw()
        chips.draw()
        happysmiley.draw()
        screen.draw.text("Punkte: " + str(score), (700, 5), color = "black")
    elif game_mode == 2: 
        screen.clear()
        screen.fill("orange")       
        screen.draw.text("Credits", topleft=(10,10), fontsize=40)     
        pygame.display.flip()    


def update():
    global score

    if score >= 100:
        pygame.mixer.music.stop()
        return

    if apple.y < 800:
        apple.y = apple.y + 4
    else:
        apple.x = randint(0, 800)
        apple.y = randint(-800, 0)

    if pear.y < 800:
        pear.y = pear.y + 4
    else:
        pear.x = randint(0, 800)
        pear.y = randint(-800, 0)

    if plum.y < 800:
        plum.y = plum.y + 4
    else:
        plum.x = randint(0, 800)
        plum.y = randint(-800, 0)

    if donut.y < 800:
        donut.y = donut.y + 4
    else:
        donut.x = randint(0, 800)
        donut.y = randint(-800, 0)

    if ice.y < 800:
        ice.y = ice.y + 4
    else:
        ice.x = randint(0, 800)
        ice.y = randint(-800, 0)

    if chips.y < 800:
        chips.y = chips.y + 4
    else:
        chips.x = randint(0, 800)
        chips.y = randint(-800, 0)

    if keyboard.left:
        happysmiley.x = happysmiley.x - 5
    elif keyboard.right:
        happysmiley.x = happysmiley.x + 5

    if happysmiley.collidepoint (apple.x, apple.y):
        score = score + 2
        effect = pygame.mixer.Sound("sounds\\bonus.wav")
        effect.play()
    if happysmiley.collidepoint (pear.x, pear.y):
        score = score + 1
        effect = pygame.mixer.Sound("sounds\\bonus.wav")
        effect.play()
    if happysmiley.collidepoint (plum.x, plum.y):
        score = score + 1
        effect = pygame.mixer.Sound("sounds\\bonus.wav")
        effect.play()
    if happysmiley.collidepoint (donut.x, donut.y):
        score = score - 1
        effect = pygame.mixer.Sound("sounds\\no.wav")
        effect.play()
    if happysmiley.collidepoint (ice.x, ice.y):
        score = score - 1   
        effect = pygame.mixer.Sound("sounds\\no.wav")
        effect.play() 
    if happysmiley.collidepoint (chips.y, chips.y):
        score = score - 1  
        effect = pygame.mixer.Sound("sounds\\no.wav")
        effect.play()

    if score >= 100:
        endoflevel1()

def on_mouse_down(pos): # wurde Maustaste gedrückt?
    global score       
    global game_mode   
    if start.collidepoint(pos):
        game_mode = 0   
    if quitgame.collidepoint(pos):
        exit()
    if creditsinfo.collidepoint(pos):
        game_mode = 2

def endoflevel1():
    screen.clear()
    global score
    screen.fill("green")
    screen.draw.text("Congratulations! You have successfully completed the 1st level!", topleft=(100,350), fontsize=30)
    pygame.display.flip()

enter image description here


Solution

  • Yes, i made it! :) I included a variable named "gamestart" and added in the on_mouse_down(pos) function a query to check if the "START" Button was clicked. If so, i included a query in the update function to start "falling" the sweets and fruists only if gamestart == 1. So i dont't added another gamemode. It is complicate to explain it, here is the code:

    def update():
        global score, gamestart
    
        if gamestart == 1:
    
            if score >= 200:
                pygame.mixer.music.stop()
                return
    
            if apple.y < 800:
                apple.y = apple.y + 4
            else:
                apple.x = randint(0, 800)
                apple.y = randint(-800, 0)
    
            if pear.y < 800:
                pear.y = pear.y + 4
            else:
                pear.x = randint(0, 800)
                pear.y = randint(-800, 0)
    
            if plum.y < 800:
                plum.y = plum.y + 4
            else:
                plum.x = randint(0, 800)
                plum.y = randint(-800, 0)
    
            if donut.y < 800:
                donut.y = donut.y + 4
            else:
                donut.x = randint(0, 800)
                donut.y = randint(-800, 0)
    
            if ice.y < 800:
                ice.y = ice.y + 4
            else:
                ice.x = randint(0, 800)
                ice.y = randint(-800, 0)
    
            if chips.y < 800:
                chips.y = chips.y + 4
            else:
                chips.x = randint(0, 800)
                chips.y = randint(-800, 0)
    
            if keyboard.left:
                happysmiley.x = happysmiley.x - 5
            elif keyboard.right:
                happysmiley.x = happysmiley.x + 5
    
            if happysmiley.collidepoint (apple.x, apple.y):
                score = score + 2
                effect = pygame.mixer.Sound("sounds\\bonus.wav")
                effect.play()
            if happysmiley.collidepoint (pear.x, pear.y):
                score = score + 1
                effect = pygame.mixer.Sound("sounds\\bonus.wav")
                effect.play()
            if happysmiley.collidepoint (plum.x, plum.y):
                score = score + 1
                effect = pygame.mixer.Sound("sounds\\bonus.wav")
                effect.play()
            if happysmiley.collidepoint (donut.x, donut.y):
                score = score - 1
                effect = pygame.mixer.Sound("sounds\\no.wav")
                effect.play()
            if happysmiley.collidepoint (ice.x, ice.y):
                score = score - 1
                effect = pygame.mixer.Sound("sounds\\no.wav")
                effect.play()
            if happysmiley.collidepoint (chips.x, chips.y):
                score = score - 1
                effect = pygame.mixer.Sound("sounds\\no.wav")
                effect.play()
    
    
    def on_mouse_down(pos): # wurde Maustaste gedrückt?
        global score
        global gamestart
        global gamemode
        if start.collidepoint(pos):
            gamestart = 1
            gamemode = 0
        if quitgame.collidepoint(pos):
            exit()
        if creditsinfo.collidepoint(pos):
            gamemode = 2
        if back.collidepoint(pos):
            gamemode = 1