160 lines
4.0 KiB
Python
160 lines
4.0 KiB
Python
import pygame
|
|
import random
|
|
import time
|
|
|
|
running = False
|
|
gameover = False
|
|
|
|
|
|
def initScreen():
|
|
global black, red, white, screen, width, height
|
|
width = 640
|
|
height = 400
|
|
size = (width, height)
|
|
|
|
screen = pygame.display.set_mode(size)
|
|
|
|
white = (255, 255, 255)
|
|
black = (0,0,0)
|
|
red = (255,0,0)
|
|
|
|
pygame.display.set_caption("PONG!")
|
|
|
|
|
|
|
|
def initImage():
|
|
global image, image_rect
|
|
image = pygame.image.load("seehofer.png")
|
|
image_rect = image.get_rect()
|
|
image_rect.centerx = width/2
|
|
image_rect.centery = height/2
|
|
global size_image
|
|
size_image = image.get_rect().size
|
|
|
|
|
|
def initImageMovement():
|
|
random.seed(a=None, version=2)
|
|
rand_x = random.randint(1, 4)
|
|
random.seed(a=None, version=2)
|
|
rand_y = random.randint(1, 4)
|
|
global move_vector
|
|
move_vector = [ rand_x, rand_y ]
|
|
|
|
class Rectangle(pygame.Rect):
|
|
def __init__(self, rect_width, rect_height):
|
|
self.width = rect_width
|
|
self.height = rect_height
|
|
self.centerx = width/2
|
|
self.centery = height - (rect_height/2)
|
|
self.speed_x = 0
|
|
|
|
|
|
def initRedRectangle():
|
|
global red_rect
|
|
red_rect = Rectangle(100, 12)
|
|
|
|
|
|
def doMovement():
|
|
time.sleep(0.01)
|
|
image_rect.centerx += move_vector[0]
|
|
image_rect.centery += move_vector[1]
|
|
|
|
if size_image[0]/2 <= image_rect.centerx <= width-(size_image[0]/2) and size_image[1]/2 <= image_rect.centery <= height-(size_image[1]/2):
|
|
|
|
pass
|
|
else:
|
|
if image_rect.centerx >= width-size_image[0]/2 or image_rect.centerx <= size_image[0]/2:
|
|
# CASE 1: image bounces on the right/left wall
|
|
move_vector[0] = -(move_vector[0])
|
|
elif image_rect.centery <= size_image[1]/2:
|
|
# CASE 2: image bounces on the upper wall
|
|
move_vector[1] = -(move_vector[1])
|
|
elif image_rect.centery >= height-size_image[1]/2:
|
|
# CASE 3: image is about to pass the lower border of screen
|
|
if image_rect.colliderect(red_rect):
|
|
# CASE 3.1: image touches the red balk
|
|
move_vector[1] = -(move_vector[1])
|
|
if not image_rect.colliderect(red_rect):
|
|
# CASE 3.2: image does not touch the red balk
|
|
showGameOver()
|
|
global gameover
|
|
gameover = True
|
|
|
|
else:
|
|
# CASE 4: image bounces in one of the upper corners (right or left)
|
|
move_vector[0] = -(move_vector[0])
|
|
move_vector[1] = -(move_vector[1])
|
|
|
|
def moveRedBalk():
|
|
if (red_rect.width/2) <= red_rect.centerx <= width-(red_rect.width/2):
|
|
red_rect.centerx += red_rect.speed_x * 3
|
|
elif red_rect.centerx <= (red_rect.width/2) or red_rect.centerx >= width-(red_rect.width/2):
|
|
red_rect.speed_x = -(red_rect.speed_x)
|
|
red_rect.centerx += red_rect.speed_x * 3
|
|
|
|
def showGameOver():
|
|
global text, gameover_rect
|
|
font = pygame.font.Font(None, 38)
|
|
text = font.render("Game Over!", 1, white)
|
|
gameover_rect = text.get_rect()
|
|
|
|
gameover_rect.centerx = width/2
|
|
gameover_rect.centery = height/2
|
|
|
|
|
|
|
|
def input():
|
|
for event in pygame.event.get():
|
|
if event.type == pygame.QUIT:
|
|
return
|
|
if event.type == pygame.KEYDOWN:
|
|
if event.key == pygame.K_ESCAPE:
|
|
return False
|
|
if event.key == pygame.K_RIGHT:
|
|
red_rect.speed_x = 1
|
|
if event.key == pygame.K_LEFT:
|
|
red_rect.speed_x = -1
|
|
if event.type == pygame.KEYUP:
|
|
red_rect.speed_x = 0
|
|
return True
|
|
|
|
|
|
|
|
def update():
|
|
doMovement()
|
|
moveRedBalk()
|
|
|
|
|
|
|
|
def draw():
|
|
screen.fill(black)
|
|
if gameover:
|
|
screen.blit(text, gameover_rect)
|
|
else:
|
|
screen.blit(image, image_rect)
|
|
pygame.draw.rect(screen, red, red_rect)
|
|
pygame.display.flip()
|
|
|
|
|
|
|
|
#------------- MAIN PROGRAMM ----------------
|
|
|
|
pygame.init()
|
|
initScreen()
|
|
initImage()
|
|
initImageMovement()
|
|
initRedRectangle()
|
|
running = True
|
|
|
|
|
|
#---------------- GAME LOOP ------------------
|
|
|
|
while running:
|
|
running = input()
|
|
update()
|
|
draw()
|
|
|
|
|
|
|
|
|