I need to get the black hole in the middle to be able to collide with the ball and end the game, but I am unsure on how to do this.
Tried a few things in the past, but I have forgot what to do, I am coming back to this task at the end of the year.
I am expecting the ball to collide with the hole and close or freeze the game to signify that it has ended.
I tried a few things a couple months ago, but I am returning to this task at the end of the year and need some help finishing it.
import random
import sys
import pygame
hole = pygame.image.load('hole.png')
class Paddle(pygame.Rect):
def __init__(self, velocity, up_key, down_key, *args, **kwargs):
self.velocity = velocity
self.up_key = up_key
self.down_key = down_key
super().__init__(*args, **kwargs)
def move_paddle(self, board_height):
keys_pressed = pygame.key.get_pressed()
if keys_pressed[self.up_key]:
if self.y - self.velocity > 0:
self.y -= self.velocity
if keys_pressed[self.down_key]:
if self.y + self.velocity < board_height - self.height:
self.y += self.velocity
class Ball(pygame.Rect):
def __init__(self, velocity, *args, **kwargs):
self.velocity = velocity
self.angle = 0
super().__init__(*args, **kwargs)
def move_ball(self):
self.x += self.velocity
self.y += self.angle
class Pong:
HEIGHT = 400
WIDTH = 600
PADDLE_WIDTH = 10
PADDLE_HEIGHT = 100
BALL_WIDTH = 10
BALL_VELOCITY = 10
BALL_ANGLE = 0
COLOUR = (255, 255, 255)
def __init__(self):
pygame.init() # Start the pygame instance.
# Setup the screen
self.screen = pygame.display.set_mode((self.WIDTH, self.HEIGHT))
self.clock = pygame.time.Clock()
# Create the player objects.
self.paddles = []
self.balls = []
self.paddles.append(Paddle( # The left paddle
self.BALL_VELOCITY,
pygame.K_w,
pygame.K_s,
0,
self.HEIGHT / 2 - self.PADDLE_HEIGHT / 2,
self.PADDLE_WIDTH,
self.PADDLE_HEIGHT
))
self.paddles.append(Paddle( # The right paddle
self.BALL_VELOCITY,
pygame.K_UP,
pygame.K_DOWN,
self.WIDTH - self.PADDLE_WIDTH,
self.HEIGHT / 2 - self.PADDLE_HEIGHT / 2,
self.PADDLE_WIDTH,
self.PADDLE_HEIGHT
))
self.balls.append(Ball(
self.BALL_VELOCITY,
self.WIDTH / 2 - self.BALL_WIDTH / 2,
self.HEIGHT / 2 - self.BALL_WIDTH / 2,
self.BALL_WIDTH,
self.BALL_WIDTH
))
self.central_line = pygame.Rect(self.WIDTH/2, 0, 1, self.HEIGHT)
def check_ball_hits_wall(self):
for ball in self.balls:
if ball.x > self.WIDTH or ball.x < 0:
sys.exit(1)
if ball.y > self.HEIGHT - self.BALL_WIDTH or ball.y < 0:
ball.angle = -ball.angle
def check_ball_hits_paddle(self):
for ball in self.balls:
for paddle in self.paddles:
if ball.colliderect(paddle):
ball.velocity = -ball.velocity
ball.angle = random.randint(-10, 10)
break
def game_loop(self):
while True:
for event in pygame.event.get():
# Add some extra ways to exit the game.
if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
return
self.check_ball_hits_paddle()
self.check_ball_hits_wall()
# Redraw the screen.
self.screen.fill((0, 0, 0))
self.screen.blit(hole,(235, 150))
for paddle in self.paddles:
paddle.move_paddle(self.HEIGHT)
pygame.draw.rect(self.screen, self.COLOUR, paddle)
# We know we're not ending the game so lets move the ball here.
for ball in self.balls:
ball.move_ball()
pygame.draw.rect(self.screen, self.COLOUR, ball)
pygame.draw.rect(self.screen, self.COLOUR, self.central_line)
pygame.display.flip()
self.clock.tick(60)
if __name__ == '__main__':
pong = Pong()
pong.game_loop()
The expected result is that when the ball collides with the black hole in the middle the game will end either by freezing or closing the game.Black hole being used as image. named hole.png