|
|
|
|
|
|
|
|
|
|
|
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() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|