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