Igra spomina

Naslednji GUI program bo igra spomina. Ta program bo služil kot zgled, kako uporabljamo rokovalnik dogodka miškin klik, ki se zgodi, ko z miško kliknemo na določeno mesto na platnu.

Ogledali si bomo, kako ugotovimo na katero mesto na platnu smo kliknili ter kako ta podatek uporabimo za ustrezno delovanje oziroma odzivanje programa.

Program bomo poenostavili do te mere, da bodo na ploščicah posamezne številke. Par bosta predstavljali ploščici, ki bosta vsebovali isto številko. Šteli pa bomo tudi skupno število potez, ki jih bo naredil uporabnik.

Za radovedne

Pomembna podrobnost bo tudi v tem, da bomo morali ploščice naključno premešati. Ta program bo torej služil tudi kot zgled, kako uporabljamo modul random.

Izgled GUI vmesnika našega programa bo podoben spodnjemu modelu, le da bo vseboval 16 ploščic (namesto 8, kot je prikazano spodaj).


Izvedi Počisti


  1 # encoding: utf-8
  2 import tkinter as tk
  3 import random
  4 
  5 # Definicija globalnih spremenljivk
  6 VEL = 48   # velikost ploščice (npr. 48x48)
  7 ROB = 8    # rob/obroba med ploščicami
  8 stanje = 0 # globalno stanje igre
  9 poteza = 0 # globalni števec potez
 10 
 11 SIRINA = (ROB+VEL) * 16 + ROB
 12 VISINA = (ROB+VEL) * 2
 13 
 14 # Nariše zakrite in odkrite ploščice
 15 def narisi(platno):
 16   global VEL, ROB
 17   global komplet, odkrito
 18   for i in range(16):
 19     KORAK = ROB // 4 + (ROB+VEL) * i
 20     platno.create_polygon(
 21       [(KORAK+ROB, ROB),
 22        (KORAK+ROB+VEL, ROB),
 23        (KORAK+ROB+VEL, ROB+VEL),
 24        (KORAK+ROB, ROB+VEL)
 25       ], width=VEL // 2, fill="darkgreen")
 26     if (odkrito[i]):
 27       polozaj = (KORAK+ROB+VEL // 2, ROB+VEL // 2)
 28       platno.create_text(polozaj, fill="white", \
 29         text=str(komplet[i]), font=("Times", VEL // 2))
 30 
 31 # Rokovalnik za klik miške na gumb 'Znova'
 32 def znova():
 33   global komplet, odkrito, stanje
 34   global poteza, prva, druga
 35   stanje = 0  # Ponastavi globalno stanje igre
 36   poteza = 0  # Ponastavi globalni števec potez
 37   napis.configure(text="Št. potez = 0") # Ponastavi napis
 38   odkrito = [False]*16 # Vse ploščice so neodkrite
 39   ploscice = list(range(8))
 40   # Komplet sestavljata dve množici ploščic
 41   komplet = ploscice + ploscice
 42   random.shuffle(komplet) # Premešaj komplet
 43   prva = -1  # Prva izbrana ploščica
 44   druga = -1 # Druga izbrana ploščica
 45   narisi(platno)
 46 
 47 # Rokovalnik za klik miške na ploščico
 48 def klik(polozaj):
 49   global komplet, odkrito, stanje
 50   global poteza, prva, druga
 51   global VEL, ROB, platno
 52   # Preveri, katera ploščica je bila kliknjena
 53   if (polozaj.y > ROB and polozaj.y <= ROB+VEL):
 54     trenutna = polozaj.x // (ROB+VEL)
 55     if (not odkrito[trenutna]):
 56       odkrito[trenutna] = True
 57       if stanje == 0:
 58         stanje = 1
 59         prva = trenutna
 60       elif stanje == 1:
 61         stanje = 2
 62         druga = trenutna
 63         poteza += 1 # Posodobi števec potez
 64         napis.configure(text="Št. potez = " + str(poteza))
 65       else:
 66         stanje = 1
 67         if (komplet[prva] != komplet[druga]):
 68           odkrito[prva] = False
 69           odkrito[druga] = False
 70         prva = trenutna
 71     narisi(platno)
 72 
 73 # Ustvari okno, okvir in platno
 74 okno = tk.Tk()
 75 okno.title("Spomin")
 76 okno.geometry(str(SIRINA + 190) + "x" + str(VISINA + 40))
 77 
 78 okvir = tk.Frame(okno)
 79 okvir.grid(row=0, column=0, pady=20)
 80 
 81 # Poveži funkcije z dogodkovnimi rokovalniki
 82 platno = tk.Canvas(okno, width=SIRINA, height=VISINA)
 83 platno.configure(bg="black")
 84 platno.bind("<Button-1>", klik) # Klik na levi gumb miške
 85 platno.grid(row=0, column=1, pady=20)
 86 
 87 gumb = tk.Button(okvir, text="Znova", command=znova)
 88 gumb.configure(width=10)
 89 gumb.grid(row=0, column=0, padx=45)
 90 
 91 napis = tk.Label(okvir, text="Št. potez = 0")
 92 napis.grid(row=1, column=0)
 93 
 94 # Poženi celotno zadevo
 95 znova()
 96 okno.mainloop()
 97 

Izvorna koda