1
+ import pygame
2
+ import sys
3
+ import random
4
+ from math import *
5
+
6
+ pygame .init ()
7
+
8
+ width = 600
9
+ height = 400
10
+ display = pygame .display .set_mode ((width , height ))
11
+ pygame .display .set_caption ("Pong!" )
12
+ clock = pygame .time .Clock ()
13
+
14
+ background = (27 , 38 , 49 )
15
+ white = (236 , 240 , 241 )
16
+ red = (203 , 67 , 53 )
17
+ blue = (52 , 152 , 219 )
18
+ yellow = (244 , 208 , 63 )
19
+
20
+ top = white
21
+ bottom = white
22
+ left = white
23
+ right = white
24
+
25
+ margin = 4
26
+
27
+ scoreLeft = 0
28
+ scoreRight = 0
29
+ maxScore = 20
30
+
31
+ font = pygame .font .SysFont ("Small Fonts" , 30 )
32
+ largeFont = pygame .font .SysFont ("Small Fonts" , 60 )
33
+
34
+ # Draw the Boundary of Board
35
+ def boundary ():
36
+ global top , bottom , left , right
37
+ pygame .draw .rect (display , left , (0 , 0 , margin , height ))
38
+ pygame .draw .rect (display , top , (0 , 0 , width , margin ))
39
+ pygame .draw .rect (display , right , (width - margin , 0 , margin , height ))
40
+ pygame .draw .rect (display , bottom , (0 , height - margin , width , margin ))
41
+
42
+ l = 25
43
+
44
+ pygame .draw .rect (display , white , (width / 2 - margin / 2 , 10 , margin , l ))
45
+ pygame .draw .rect (display , white , (width / 2 - margin / 2 , 60 , margin , l ))
46
+ pygame .draw .rect (display , white , (width / 2 - margin / 2 , 110 , margin , l ))
47
+ pygame .draw .rect (display , white , (width / 2 - margin / 2 , 160 , margin , l ))
48
+ pygame .draw .rect (display , white , (width / 2 - margin / 2 , 210 , margin , l ))
49
+ pygame .draw .rect (display , white , (width / 2 - margin / 2 , 260 , margin , l ))
50
+ pygame .draw .rect (display , white , (width / 2 - margin / 2 , 310 , margin , l ))
51
+ pygame .draw .rect (display , white , (width / 2 - margin / 2 , 360 , margin , l ))
52
+
53
+ # Paddle Class
54
+ class Paddle :
55
+ def __init__ (self , position ):
56
+ self .w = 10
57
+ self .h = self .w * 8
58
+ self .paddleSpeed = 6
59
+
60
+ if position == - 1 :
61
+ self .x = 1.5 * margin
62
+ else :
63
+ self .x = width - 1.5 * margin - self .w
64
+
65
+ self .y = height / 2 - self .h / 2
66
+
67
+ # Show the Paddle
68
+ def show (self ):
69
+ pygame .draw .rect (display , white , (self .x , self .y , self .w , self .h ))
70
+
71
+ # Move the Paddle
72
+ def move (self , ydir ):
73
+ self .y += self .paddleSpeed * ydir
74
+ if self .y < 0 :
75
+ self .y -= self .paddleSpeed * ydir
76
+ elif self .y + self .h > height :
77
+ self .y -= self .paddleSpeed * ydir
78
+
79
+
80
+ leftPaddle = Paddle (- 1 )
81
+ rightPaddle = Paddle (1 )
82
+
83
+ # Ball Class
84
+ class Ball :
85
+ def __init__ (self , color ):
86
+ self .r = 20
87
+ self .x = width / 2 - self .r / 2
88
+ self .y = height / 2 - self .r / 2
89
+ self .color = color
90
+ self .angle = random .randint (- 75 , 75 )
91
+ if random .randint (0 , 1 ):
92
+ self .angle += 180
93
+
94
+ self .speed = 8
95
+
96
+ # Show the Ball
97
+ def show (self ):
98
+ pygame .draw .ellipse (display , self .color , (self .x , self .y , self .r , self .r ))
99
+
100
+ # Move the Ball
101
+ def move (self ):
102
+ global scoreLeft , scoreRight
103
+ self .x += self .speed * cos (radians (self .angle ))
104
+ self .y += self .speed * sin (radians (self .angle ))
105
+ if self .x + self .r > width - margin :
106
+ scoreLeft += 1
107
+ self .angle = 180 - self .angle
108
+ if self .x < margin :
109
+ scoreRight += 1
110
+ self .angle = 180 - self .angle
111
+ if self .y < margin :
112
+ self .angle = - self .angle
113
+ if self .y + self .r >= height - margin :
114
+ self .angle = - self .angle
115
+
116
+ # Check and Reflect the Ball when it hits the padddle
117
+ def checkForPaddle (self ):
118
+ if self .x < width / 2 :
119
+ if leftPaddle .x < self .x < leftPaddle .x + leftPaddle .w :
120
+ if leftPaddle .y < self .y < leftPaddle .y + 10 or leftPaddle .y < self .y + self .r < leftPaddle .y + 10 :
121
+ self .angle = - 45
122
+ if leftPaddle .y + 10 < self .y < leftPaddle .y + 20 or leftPaddle .y + 10 < self .y + self .r < leftPaddle .y + 20 :
123
+ self .angle = - 30
124
+ if leftPaddle .y + 20 < self .y < leftPaddle .y + 30 or leftPaddle .y + 20 < self .y + self .r < leftPaddle .y + 30 :
125
+ self .angle = - 15
126
+ if leftPaddle .y + 30 < self .y < leftPaddle .y + 40 or leftPaddle .y + 30 < self .y + self .r < leftPaddle .y + 40 :
127
+ self .angle = - 10
128
+ if leftPaddle .y + 40 < self .y < leftPaddle .y + 50 or leftPaddle .y + 40 < self .y + self .r < leftPaddle .y + 50 :
129
+ self .angle = 10
130
+ if leftPaddle .y + 50 < self .y < leftPaddle .y + 60 or leftPaddle .y + 50 < self .y + self .r < leftPaddle .y + 60 :
131
+ self .angle = 15
132
+ if leftPaddle .y + 60 < self .y < leftPaddle .y + 70 or leftPaddle .y + 60 < self .y + self .r < leftPaddle .y + 70 :
133
+ self .angle = 30
134
+ if leftPaddle .y + 70 < self .y < leftPaddle .y + 80 or leftPaddle .y + 70 < self .y + self .r < leftPaddle .y + 80 :
135
+ self .angle = 45
136
+ else :
137
+ if rightPaddle .x + rightPaddle .w > self .x + self .r > rightPaddle .x :
138
+ if rightPaddle .y < self .y < leftPaddle .y + 10 or leftPaddle .y < self .y + self .r < leftPaddle .y + 10 :
139
+ self .angle = - 135
140
+ if rightPaddle .y + 10 < self .y < rightPaddle .y + 20 or rightPaddle .y + 10 < self .y + self .r < rightPaddle .y + 20 :
141
+ self .angle = - 150
142
+ if rightPaddle .y + 20 < self .y < rightPaddle .y + 30 or rightPaddle .y + 20 < self .y + self .r < rightPaddle .y + 30 :
143
+ self .angle = - 165
144
+ if rightPaddle .y + 30 < self .y < rightPaddle .y + 40 or rightPaddle .y + 30 < self .y + self .r < rightPaddle .y + 40 :
145
+ self .angle = 170
146
+ if rightPaddle .y + 40 < self .y < rightPaddle .y + 50 or rightPaddle .y + 40 < self .y + self .r < rightPaddle .y + 50 :
147
+ self .angle = 190
148
+ if rightPaddle .y + 50 < self .y < rightPaddle .y + 60 or rightPaddle .y + 50 < self .y + self .r < rightPaddle .y + 60 :
149
+ self .angle = 165
150
+ if rightPaddle .y + 60 < self .y < rightPaddle .y + 70 or rightPaddle .y + 60 < self .y + self .r < rightPaddle .y + 70 :
151
+ self .angle = 150
152
+ if rightPaddle .y + 70 < self .y < rightPaddle .y + 80 or rightPaddle .y + 70 < self .y + self .r < rightPaddle .y + 80 :
153
+ self .angle = 135
154
+
155
+ # Show the Score
156
+ def showScore ():
157
+ leftScoreText = font .render ("Score : " + str (scoreLeft ), True , red )
158
+ rightScoreText = font .render ("Score : " + str (scoreRight ), True , blue )
159
+
160
+ display .blit (leftScoreText , (3 * margin , 3 * margin ))
161
+ display .blit (rightScoreText , (width / 2 + 3 * margin , 3 * margin ))
162
+
163
+ # Game Over
164
+ def gameOver ():
165
+ if scoreLeft == maxScore or scoreRight == maxScore :
166
+ while True :
167
+ for event in pygame .event .get ():
168
+ if event .type == pygame .QUIT :
169
+ close ()
170
+ if event .type == pygame .KEYDOWN :
171
+ if event .key == pygame .K_q :
172
+ close ()
173
+ if event .key == pygame .K_r :
174
+ reset ()
175
+ if scoreLeft == maxScore :
176
+ playerWins = largeFont .render ("Left Player Wins!" , True , red )
177
+ elif scoreRight == maxScore :
178
+ playerWins = largeFont .render ("Right Player Wins!" , True , blue )
179
+
180
+ display .blit (playerWins , (width / 2 - 100 , height / 2 ))
181
+ pygame .display .update ()
182
+
183
+ def reset ():
184
+ global scoreLeft , scoreRight
185
+ scoreLeft = 0
186
+ scoreRight = 0
187
+ board ()
188
+
189
+
190
+ def close ():
191
+ pygame .quit ()
192
+ sys .exit ()
193
+
194
+ def board ():
195
+ loop = True
196
+ leftChange = 0
197
+ rightChange = 0
198
+ ball = Ball (yellow )
199
+
200
+ while loop :
201
+ for event in pygame .event .get ():
202
+ if event .type == pygame .QUIT :
203
+ close ()
204
+ if event .type == pygame .KEYDOWN :
205
+ if event .key == pygame .K_q :
206
+ close ()
207
+ if event .key == pygame .K_SPACE or event .key == pygame .K_p :
208
+ Pause ()
209
+ if event .key == pygame .K_r :
210
+ reset ()
211
+ if event .key == pygame .K_w :
212
+ leftChange = - 1
213
+ if event .key == pygame .K_s :
214
+ leftChange = 1
215
+ if event .key == pygame .K_UP :
216
+ rightChange = - 1
217
+ if event .key == pygame .K_DOWN :
218
+ rightChange = 1
219
+ if event .type == pygame .KEYUP :
220
+ leftChange = 0
221
+ rightChange = 0
222
+
223
+ leftPaddle .move (leftChange )
224
+ rightPaddle .move (rightChange )
225
+ ball .move ()
226
+ ball .checkForPaddle ()
227
+
228
+ display .fill (background )
229
+ showScore ()
230
+
231
+ ball .show ()
232
+ leftPaddle .show ()
233
+ rightPaddle .show ()
234
+
235
+ boundary ()
236
+
237
+ gameOver ()
238
+
239
+ pygame .display .update ()
240
+ clock .tick (60 )
241
+
242
+ board ()
0 commit comments