Понг¶
Једна од првих популарних игара на рачунарима била је игра Понг у којој се врши једноставна симулација партије стоног тениса. Напиши програм који имплементира ову игру.
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)