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.

Понг

Једна од првих популарних игара на рачунарима била је игра Понг у којој се врши једноставна симулација партије стоног тениса. Напиши програм који имплементира ову игру.

 
1
import random
2
import pygame as pg
3
import pygamebg
4
5
(sirina, visina) = (700, 400) # otvaramo prozor
6
prozor = pygamebg.open_window(sirina, visina, "Понг")
7
8
pg.key.set_repeat(10, 10)   # podešavamo događaje tastature
9
10
# funkcija ispisuje dati tekst date veličine, tako da mu je centar u datoj tački
11
def tekst_centar(x, y, tekst, velicina):
12
    font = pg.font.SysFont("Arial", velicina)
13
    tekst = font.render(tekst, True, pg.Color("white"))
14
    (sirina_teksta, visina_teksta) = (tekst.get_width(), tekst.get_height())
15
    (x, y) = (x - sirina_teksta / 2, y - visina_teksta / 2)
16
    prozor.blit(tekst, (x, y))
17
18
19
# nasimično određena brzina po x-koordinati
20
def nasumicna_brzina_x():
21
    return random.choice([-2, 2])
22
23
# nasimično određena brzina po y-koordinati
24
def nasumicna_brzina_y():
25
    return random.randint(-3, 3)
26
27
# nasimično određena brzina po obe koordinate
28
def nasumicna_brzina():
29
    vx = nasumicna_brzina_x()
30
    vy = nasumicna_brzina_y()
31
    return (vx, vy)
32
33
margina = 100                                          # udaljenost reketa od leve tj. desne ivice prozora
34
debljina_reketa = 10                                   # debljina reketa
35
duzinaL = 50                                           # dužina levog reketa
36
(xL, yL) = (margina, visina // 2)                      # pozicija centra levog reketa
37
brzinaL = 5                                            # brzina levog reketa
38
duzinaD = 50                                           # dužina desnog reketa
39
(xD, yD) = (sirina - margina, visina // 2)             # pozicija centra desnog reketa
40
brzinaD = 5                                            # brzina desnog reketa
41
(loptica_x, loptica_y) = (sirina // 2, visina // 2)    # pozicija centra loptice
42
(vx, vy) = nasumicna_brzina()                          # brzina loptice (u smeru x i y ose)
43
44
poeniL = 0                                             # broj poena levog igrača
45
poeniD = 0                                             # broj poena desnog igrača
46
47
def crtaj():
48
    prozor.fill(pg.Color("black"))                                                     # bojimo pozadinu u crno
49
    pg.draw.line(prozor, pg.Color("white"),                                            
50
                 (xL, yL - duzinaL // 2), (xL, yL + duzinaL // 2), debljina_reketa)    # crtamo levi reket
51
    pg.draw.line(prozor, pg.Color("white"),
52
                 (xD, yD - duzinaD // 2), (xD, yD + duzinaD // 2), debljina_reketa)    # crtamo desni reket
53
54
    pg.draw.circle(prozor, pg.Color("white"), (round(loptica_x), round(loptica_y)), 5) # crtamo lopticu
55
56
    # crtamo mrežicu
57
    x = sirina // 2
58
    y = 0
59
    duzina_linijice = 30
60
    while y < visina:
61
        pg.draw.line(prozor, pg.Color("white"),
62
                     (x, y), (x, y + duzina_linijice), 2)
63
        y += 1.5 * duzina_linijice
64
65
    tekst_centar(sirina // 2 - 50, 50, str(poeniL), 40)       # ispisujemo broj poena levog igrača
66
    tekst_centar(sirina // 2 + 50, 50, str(poeniD), 40)       # ispisujemo broj poena desnog igrača
67
68
def obradi_dogadjaj(dogadjaj):
69
    global yL, yD
70
    if dogadjaj.type == pg.KEYDOWN:       # pritisnut je taster na tastaturi
71
        if dogadjaj.key == pg.K_p:        #   taster p diže desni reket
72
            yD -= brzinaD
73
        elif dogadjaj.key == pg.K_l:      #   taster l spušta desni reket
74
            yD += brzinaD
75
        elif dogadjaj.key == pg.K_q:      #   taster q diže levi reket
76
            yL -= brzinaL
77
        elif dogadjaj.key == pg.K_a:      #   taster a spušta levi reket
78
            yL += brzinaL
79
80
# provera da li tačka (x, y) pripada pravougaoniku sa centrom u (cx, cy), širine s i visine v
81
def tacka_u_pravougaoniku(x, y, cx, cy, s, v):
82
    return (cx - s // 2 <= x and x <= cx + s // 2 and
83
            cy - v // 2 <= y and y <= cy + v // 2)
84
85
def novi_frejm():
86
    global loptica_x, loptica_y, vx, vy, poeniL, poeniD
87
88
    # pomeramo lopticu
89
    loptica_x += vx
90
    loptica_y += vy
91
92
    # odbijanje od gornje i donje ivice prozora
93
    if loptica_y >= visina or loptica_y <= 0:
94
        vy = -vy
95
96
    # provera sudara sa levim reketom
97
    if tacka_u_pravougaoniku(loptica_x, loptica_y, xL, yL, debljina_reketa, duzinaL):
98
        vx = -vx                               # loptica horizontalno menja smer, a vertikalno se odbija nasumično
99
        vy = nasumicna_brzina_y()
100
        loptica_x = xL + debljina_reketa // 2  # izbacujemo je van reketa
101
102
    # provera sudara sa desnim reketom
103
    if tacka_u_pravougaoniku(loptica_x, loptica_y, xD, yD, debljina_reketa, duzinaD):
104
        vx = -vx                               # loptica horizontalno menja smer, a vertikalno se odbija nasumično
105
        vy = nasumicna_brzina_y()
106
        loptica_x = xD - debljina_reketa // 2  # izbacujemo je van reketa
107
108
    # provera da li je loptica ispala iza levog reketa
109
    if loptica_x < xL - margina // 2:
110
        loptica_x = sirina // 2            # vraćamo je na sredinu
111
        (vx, vy) = nasumicna_brzina()      # i nasumično joj određujemo brzinu
112
        poeniD += 1                        # uvećavamo poene desnog igrača
113
114
    # provera da li je loptica ispala iza desnog reketa
115
    if loptica_x > xD + margina // 2:
116
        loptica_x = sirina // 2            # vraćamo je na sredinu
117
        (vx, vy) = nasumicna_brzina()      # i nasumično joj određujemo brzinu
118
        poeniL += 1                        # uvećavamo poene levog igrača
119
120
    crtaj()  # iscrtavamo scenu
121
    
122
123
pygamebg.frame_loop(25, novi_frejm, obradi_dogadjaj)
124

(pong)