import pygame
pygame.init()
# Font that is used to render the text
font20 = pygame.font.Font('freesansbold.ttf', 20)
# RGB values of standard colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
# Basic parameters of the screen
WIDTH, HEIGHT = 900, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Pong")
clock = pygame.time.Clock()
FPS = 30
# Striker class
class Striker:
# Take the initial position, dimensions, speed and color of the object
def __init__(self, posx, posy, width, height, speed, color):
self.posx = posx
self.posy = posy
self.width = width
self.height = height
self.speed = speed
self.color = color
# Rect that is used to control the position and collision of the object
self.geekRect = pygame.Rect(posx, posy, width, height)
# Object that is blit on the screen
self.geek = pygame.draw.rect(screen, self.color, self.geekRect)
# Used to display the object on the screen
def display(self):
self.geek = pygame.draw.rect(screen, self.color, self.geekRect)
def update(self, yFac):
self.posy = self.posy + self.speed*yFac
# Restricting the striker to be below the top surface of the screen
if self.posy <= 0:
self.posy = 0
# Restricting the striker to be above the bottom surface of the screen
elif self.posy + self.height >= HEIGHT:
self.posy = HEIGHT-self.height
# Updating the rect with the new values
self.geekRect = (self.posx, self.posy, self.width, self.height)
def displayScore(self, text, score, x, y, color):
text = font20.render(text+str(score), True, color)
textRect = text.get_rect()
textRect.center = (x, y)
screen.blit(text, textRect)
def getRect(self):
return self.geekRect
# Ball class
class Ball:
def __init__(self, posx, posy, radius, speed, color):
self.posx = posx
self.posy = posy
self.radius = radius
self.speed = speed
self.color = color
self.xFac = 1
self.yFac = -1
self.ball = pygame.draw.circle(
screen, self.color, (self.posx, self.posy), self.radius)
self.firstTime = 1
def display(self):
self.ball = pygame.draw.circle(
screen, self.color, (self.posx, self.posy), self.radius)
def update(self):
self.posx += self.speed*self.xFac
self.posy += self.speed*self.yFac
# If the ball hits the top or bottom surfaces,
# then the sign of yFac is changed and
# it results in a reflection
if self.posy <= 0 or self.posy >= HEIGHT:
self.yFac *= -1
if self.posx <= 0 and self.firstTime:
self.firstTime = 0
return 1
elif self.posx >= WIDTH and self.firstTime:
self.firstTime = 0
return -1
else:
return 0
def reset(self):
self.posx = WIDTH//2
self.posy = HEIGHT//2
self.xFac *= -1
self.firstTime = 1
# Used to reflect the ball along the X-axis
def hit(self):
self.xFac *= -1
def getRect(self):
return self.ball
# Game Manager
def main():
running = True
# Defining the objects
geek1 = Striker(20, 0, 10, 100, 10, GREEN)
geek2 = Striker(WIDTH-30, 0, 10, 100, 10, GREEN)
ball = Ball(WIDTH//2, HEIGHT//2, 7, 7, WHITE)
listOfGeeks = [geek1, geek2]
# Initial parameters of the players
geek1Score, geek2Score = 0, 0
geek1YFac, geek2YFac = 0, 0
while running:
screen.fill(BLACK)
# Event handling
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
geek2YFac = -1
if event.key == pygame.K_DOWN:
geek2YFac = 1
if event.key == pygame.K_w:
geek1YFac = -1
if event.key == pygame.K_s:
geek1YFac = 1
if event.type == pygame.KEYUP:
if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
geek2YFac = 0
if event.key == pygame.K_w or event.key == pygame.K_s:
geek1YFac = 0
# Collision detection
for geek in listOfGeeks:
if pygame.Rect.colliderect(ball.getRect(), geek.getRect()):
ball.hit()
# Updating the objects
geek1.update(geek1YFac)
geek2.update(geek2YFac)
point = ball.update()
# -1 -> Geek_1 has scored
# +1 -> Geek_2 has scored
# 0 -> None of them scored
if point == -1:
geek1Score += 1
elif point == 1:
geek2Score += 1
# Someone has scored
# a point and the ball is out of bounds.
# So, we reset it's position
if point:
ball.reset()
# Displaying the objects on the screen
geek1.display()
geek2.display()
ball.display()
# Displaying the scores of the players
geek1.displayScore("Geek_1 : ",
geek1Score, 100, 20, WHITE)
geek2.displayScore("Geek_2 : ",
geek2Score, WIDTH-100, 20, WHITE)
pygame.display.update()
clock.tick(FPS)
if __name__ == "__main__":
main()
pygame.quit()