Клизна слагалица¶
Напиши програм који омогућава слагање клизне слагалице. У пољу димензије 4x4 распоређени су бројеви од 1 до 15, а једно је поље празно. Потребно је бројеве сложити тако да иду редом од 1 до 15, а да се празно поље нађе у доњем десном углу.
1
import random
2
import pygame as pg
3
import pygamebg
4
5
(sirina, visina) = (400, 400)
6
prozor = pygamebg.open_window(sirina, visina, "Клизна слагалица")
7
8
9
# pokušavamo da pomerimo rupu na polje_v, polje_k
10
def pomeri_rupu(polje_v, polje_k):
11
global rupa_v, rupa_k, slagalica # globalne promenljive koje ćemo modifikovati
12
if (0 <= polje_v and polje_v < DIM and
13
0 <= polje_k and polje_k < DIM): # polje mora biti unutar slagalice
14
(dv, dk) = (abs(polje_v - rupa_v), abs(polje_k - rupa_k)) # polje mora biti susedno rupi
15
if (dv == 1 and dk == 0) or (dv == 0 and dk == 1):
16
(slagalica[rupa_v][rupa_k], slagalica[polje_v][polje_k]) = (slagalica[polje_v][polje_k], slagalica[rupa_v][rupa_k]) # razmenjujemo broj na polju i broj na rupi
17
(rupa_v, rupa_k) = (polje_v, polje_k) # pomeramo rupu
18
return True # uspešno smo pomerili rupu
19
return False # nismo uspeli da pomerimo rupu
20
21
# nasumično mešamo slagalicu
22
def promesaj_slagalicu():
23
global rupa_v, rupa_k, slagalica # globalne promenljive koje ćemo modifikovati
24
smerovi = [(-1, 0), (1, 0), (0, -1), (0, 1)] # četiri moguća smera pomeranja
25
max_broj_pomeranja = 100 # mešamo tako što rupu pomerimo 100 puta
26
broj_pomeranja = 0 # broj izvršenih pomeranja
27
while broj_pomeranja < max_broj_pomeranja: # dok je broj izvršenih pomeranja manji od maksimalnog
28
(smer_v, smer_k) = smerovi[random.randint(0, 3)] # nasumično biramo smer u kojem se pomera rupa
29
(polje_v, polje_k) = (rupa_v + smer_v, rupa_k + smer_k) # određujemo novu potencijalnu poziciju rupe
30
if pomeri_rupu(polje_v, polje_k): # pokušavamo da pomerimo rupu na novo polje
31
broj_pomeranja += 1 # ako smo uspeli, uvecavamo broj pomeranja
32
33
# provera da li je slagalica složena ispravno
34
def slagalica_slozena():
35
# proveravamo da li postoji polje na kom se nalazi pogrešan broj
36
for v in range(DIM):
37
for k in range(DIM):
38
if slagalica[v][k] != v*DIM+k+1:
39
return False # broj na polju[v][k] je pogrešan
40
return True # nismo naišli na pogrešan broj
41
42
DIM = 4 # dimenzija slagalice je 4x4
43
SIRINA_KOLONE = sirina // DIM # širina kolone u pikselima
44
VISINA_VRSTE = visina // DIM # širina vrste u pikselima
45
46
slagalica = [[DIM*v + k + 1 for k in range(DIM)] for v in range(DIM)] # inicijalno slagalicu popunjavamo redom brojevima od 1 do n*n
47
(rupa_v, rupa_k) = (DIM-1, DIM-1) # prazno polje je u donjem desnom uglu
48
promesaj_slagalicu() # pre početka igre mešamo slagalicu
49
50
51
def prikazi_slagalicu():
52
prozor.fill(pg.Color("white")) # bojimo pozadinu u belo
53
font = pg.font.SysFont("Arial", 40) # font kojim će biti ispisani brojevi
54
# prolazimo redom kroz sva polja
55
for v in range(DIM):
56
for k in range(DIM):
57
rect = (k*SIRINA_KOLONE, v*VISINA_VRSTE, SIRINA_KOLONE, VISINA_VRSTE) # okružujući pravougaonik tekućeg polja
58
if v == rupa_v and k == rupa_k: # ako je na tekućem polju rupa
59
pg.draw.rect(prozor, pg.Color("black"), rect) # iscrtavamo je pomoću potpuno crnog kvadrata
60
else:
61
pg.draw.rect(prozor, pg.Color("black"), rect, 1) # iscrtavamo okvir polja
62
(xc, yc) = (k*SIRINA_KOLONE + SIRINA_KOLONE/2, v*VISINA_VRSTE + VISINA_VRSTE/2) # centar okvira polja
63
tekst = font.render(str(slagalica[v][k]), True, pg.Color("black")) # ispisujemo centriran tekst
64
(sirina_teksta, visina_teksta) = (tekst.get_width(), tekst.get_height())
65
prozor.blit(tekst, (xc - sirina_teksta/2, yc - visina_teksta/2))
66
67
def prikazi_cestitku():
68
prozor.fill(pg.Color("white")) # bojimo pozadinu prozora u belo
69
font = pg.font.SysFont("Arial", 60) # font kojim će biti prikazan tekst
70
poruka = "Браво!" # poruka koja će se ispisivati
71
tekst = font.render(poruka, True, pg.Color("black")) # sličica koja predstavlja tu poruku ispisanu crnom bojom
72
(sirina_teksta, visina_teksta) = (tekst.get_width(), tekst.get_height()) # određujemo veličinu tog teksta
73
(x, y) = ((sirina - sirina_teksta) / 2, (visina - visina_teksta) / 2) # položaj određujemo tako da tekst bude centriran
74
prozor.blit(tekst, (x, y)) # prikazujemo sličicu na odgovarajućem mestu na ekranu
75
76
def crtaj():
77
if not slagalica_slozena(): # slagalica još nije složena, pa je prikazujemo
78
prikazi_slagalicu()
79
else: # slagalica je složena uspešnо, pa čestitamo igraču
80
prikazi_cestitku()
81
82
def obradi_dogadjaj(dogadjaj):
83
global v, k, slagalica
84
if slagalica_slozena(): # ako je slagalica složena, ne obrađujemo više događaje
85
return
86
if dogadjaj.type == pg.MOUSEBUTTONDOWN: # klik dugmeta miša
87
(x, y) = dogadjaj.pos # koordinate na koje je kliknuto
88
v = y // VISINA_VRSTE # vrsta na koju je kliknuto
89
k = x // SIRINA_KOLONE # kolona na koju je kliknuto
90
if pomeri_rupu(v, k): # ako uspemo da pomerimo rupu na to polje
91
return True # treba ponovo da crtamo
92
return False # ne treba ponovo da crtamo
93
94
95
pygamebg.event_loop(crtaj, obradi_dogadjaj)
96
(klizna_slagalica)