Processing math: 100%

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

Клизна слагалица

Напиши програм који омогућава слагање клизне слагалице. У пољу димензије 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)