Level 3Fargespill

Skrevet av: Oversatt fra usingpython.com

Oversatt av: Steffen Granberg

Kurs: Python
Tema: Tekstbasert, Spill
Fag: Programmering
Klassetrinn: 8.-10. klasse, Videregående skole

Introduksjon

Hjernen vår lar seg lett lure, og det kan av og til være vanskelig for den å tolke forskjellig inntrykk samtidig. I det spillet vi nå skal lage vil du både få testet hjernen og skrivehastigheten. Vi skal lage et fargespill!

Illustrasjon av et ferdig fargespill

Steg 1: Klargjør og importerer bilioteker

I dette spillet skal vi lage et grafisk brukergrensesnitt (et GUI). Til dette bruker vi et bibliotek som heter tkinter. Vi trenger også hjelp for å generere tilfeldige tall.

checkSjekkliste

  • import tkinter
    from random import randint
    
  • #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    import tkinter
    from random import randint
    

Kommentering av kode

For å gjøre koden lettere å forstå kan vi legge inn kommentarer som ikke påvirker programmet. Dette gjør vi ved å skrive inn tegnet #. All tekst som kommer på samme linje etter dette tegnet vil bli ignorert av datamaskinen, men er veldig fint for å hjelpe oss mennesker. Heretter bruker jeg dette for å forklare hva som skjer, du trenger ikke å skrive inn kommentarene hvis du ikke vil!

Steg 2: Lage grafisk brukergrensesnitt

Nå skal vi begynne på GUI. Les kommentarene for å forstå hva som skjer.

checkSjekkliste

  • root = tkinter.Tk()
    
    root.title("Fargespill")
    root.geometry("475x300")
    
    root.mainloop()
    
  • #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    import tkinter
    from random import randint
    
    root = tkinter.Tk()
    
    root.title("Fargespill")
    root.geometry("475x300")
    
    # Lager en label kalt instructions  med tekst:
    instructions = tkinter.Label(root,
                                 text="Skriv inn fargen PÅ ordet, ikke selve ordet!",
                                 font=('Helvetica', 15))
    instructions.pack()
    
    points_label = tkinter.Label(root,
                                 text="Trykk enter for å starte.",
                                 font=('Helvetica', 30))
    points_label.pack()
    
    label = tkinter.Label(root, font=('Helvetica', 100))
    label.pack()
    
    box = tkinter.Entry(root)
    
    root.mainloop()
    

I koden over skjer det mye, la oss se på noen deler

tkinter.Label lager et felt i vinduet vårt. I disse feltene kan vi putte blant annet tekst eller tall. .pack forteller programmet vårt at den skal "tegne" disse feltene slik at de synes for oss, og hvor den skal tegne de. tkinter.Entry(root) lager et tekstfelt som spilleren kan skrive i.

flagTest prosjektet

Steg 3: Vi lager tidskontroll

checkSjekkliste

  • def countdown():
        global time_left
    
        if time_left > 0:
            # Tell ned ett sekund
            time_left = time_left - 1
            time_label.config(text="Tid igjen: " + str(time_left))
    
            # Denne kjører automatisk countdown() igjen etter 1 sekund
            time_label.after(1000, countdown)
        else:
            time_label.pack_forget()
            label.pack_forget()
            box.pack_forget()
    
  • #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    import tkinter
    from random import randint
    
    time_left = 30
    
    def countdown():
        global time_left
    
        if time_left > 0:
            time_left = time_left - 1
            time_label.config(text="Tid igjen: " + str(time_left))
            time_label.after(1000, countdown)
        else:
            time_label.pack_forget()
            label.pack_forget()
            box.pack_forget()
    
    root = tkinter.Tk()
    
    root.title("Fargespill")
    root.geometry("475x300")
    
    # Lager en label kalt instructions  med tekst:
    instructions = tkinter.Label(root,
                                 text="Skriv inn fargen PÅ ordet, ikke selve ordet!",
                                 font=('Helvetica', 15))
    instructions.pack()
    
    points_label = tkinter.Label(root,
                                 text="Trykk enter for å starte.",
                                 font=('Helvetica', 30))
    points_label.pack()
    
    
    label = tkinter.Label(root, font=('Helvetica', 100))
    label.pack()
    
    box = tkinter.Entry(root)
    
    root.mainloop()
    

Steg 4: Definere fargene.

Nå må vi definere fargene som programmet skal bruke.

checkSjekkliste

  • colours_eng = ['Red', 'Blue', 'Green', 'Pink', 'Black',
                   'Yellow', 'Orange', 'Purple', 'Brown']
    
  • colours = ['Rød', 'Blå', 'Grønn', 'Rosa', 'Svart',
               'Gul', 'Oransje', 'Lilla', 'Brun']
    
  • # Brukes til å velge tilfeldig farge
    colour = 0
    points = 0
    
  • def next_color():
        # Henter inn globale variabler:
        global points
        global colour
    
  • if time_left > 0:
        box.focus_set()
    
  • # Hvis det spilleren skrev er riktig farge.
    if box.get().lower() == colours[colour].lower():
        # Pluss på ett points
        points = points + 1
    
  • box.delete(0, tkinter.END)
    
  • # Lager tilfeldig tall mellom 0 og 8
    colour = randint(0, len(colours)-1)
    
    # Lager tilfeldig tall til teksten.
    text = randint(0, len(colours)-1)
    
  • def next_color():
        global points
        global colour
    
        if time_left > 0:
            box.focus_set()
    
        if box.get().lower() == colours[colour].lower():
            points = points + 1
    
        box.delete(0, tkinter.END)
    
        colour = randint(0, len(colours)-1)
        text = randint(0, len(colours)-1)
    
        # Oppdaterer labels
        label.config(fg=str(colours_eng[colour]), text=str(colours[text]))
        points_label.config(text="Poeng: " + str(points))
    

flagTest prosjektet

Steg 5: La oss starte programmet!

Det skjer fortsatt lite i spillet vårt, men det er fordi vi ikke har startet selve spilldelen. Det skal vi gjøre nå!

checkSjekkliste

  • def start_game(event):
        if time_left == 30:
            countdown()
        next_color()
    
  • # Kjører funksjonen start_game() når enter trykkes
    root.bind('<Return>', start_game)
    box.pack()
    box.focus_set()
    
  • #!/usr/bin/python # -*- coding: UTF-8 -*-
    import tkinter
    from random import randint
    
    
    colours_eng = ['Red', 'Blue', 'Green', 'Pink', 'Black',
                   'Yellow', 'Orange', 'Purple', 'Brown']
    colours = ['Rød', 'Blå', 'Grønn', 'Rosa', 'Svart',
               'Gul', 'Oransje', 'Lilla', 'Brun']
    colour = 0
    
    points = 0
    
    time_left = 30
    
    
    def start_game(event):
        if time_left == 30:
            countdown()
        next_color()
    
    
    def next_color():
        global points
        global colour
    
        if time_left > 0:
            box.focus_set()
    
        if box.get().lower() == colours[colour].lower():
            points = points + 1
    
        box.delete(0, tkinter.END)
    
        colour = randint(0, len(colours)-1)
        text = randint(0, len(colours)-1)
    
        label.config(fg=str(colours_eng[colour]), text=str(colours[text]))
        points_label.config(text="Poeng: " + str(points))
    
    
    def countdown():
        global time_left
    
        if time_left > 0:
            time_left = time_left - 1
            time_label.config(text="Tid igjen: " + str(time_left))
            time_label.after(1000, countdown)
        else:
            time_label.pack_forget()
            label.pack_forget()
            box.pack_forget()
    
    
    root = tkinter.Tk()
    
    root.title("Fargespill")
    root.geometry("475x300")
    
    instructions = tkinter.Label(root,
                                 text="Skriv inn fargen PÅ ordet, ikke selve ordet!",
                                 font=('Helvetica', 15))
    instructions.pack()
    
    points_label = tkinter.Label(root,
                                 text="Trykk enter for å starte.",
                                 font=('Helvetica', 30))
    points_label.pack()
    
    time_label = tkinter.Label(root,
                               text="Tid igjen: " + str(time_left),
                               font=('Helvetica', 30))
    time_label.pack()
    
    label = tkinter.Label(root, font=('Helvetica', 100))
    label.pack()
    
    box = tkinter.Entry(root)
    
    root.bind('<Return>', start_game)
    box.pack()
    box.focus_set()
    
    root.mainloop()
    

flagTest prosjektet

Lisens: CC BY-SA 4.0

Forbedre denne siden

Funnet en feil? Kunne noe vært bedre?
Hvis ja, vennligst gi oss tilbakemelding ved å lage en sak på Github eller fiks feilen selv om du kan. Vi er takknemlige for enhver tilbakemelding!