Python Forum

Full Version: Pygame simple pong example
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I was going to break this apart and make a tutorial out of it....but im too lazy at this point. 

import pygame as pg
import random

screen = pg.display.set_mode((800,600))
screen_rect = screen.get_rect()
clock = pg.time.Clock()
done = False

class Ball:
    def __init__(self, screen_rect, size):
        self.screen_rect = screen_rect
        self.height, self.width = size
        self.image = pg.Surface(size).convert()
        self.image.fill((255,0,0))
        self.rect = self.image.get_rect()
        self.speed = 5
        self.set_ball()

    def get_random_float(self):
        '''get float for velocity of ball on starting direction'''
        while True:
            num = random.uniform(-1.0, 1.0)
            if num > -.5 and num < .5: #restrict ball direction to avoid infinity bounce
                continue
            else:
                return num
                
    def set_ball(self):
        '''get random starting direction and set ball to center screen'''
        x = self.get_random_float()
        y = self.get_random_float()
        self.vel = [x, y]
        self.rect.center = self.screen_rect.center
        self.true_pos = list(self.rect.center)
        
    def collide_walls(self):
        if self.rect.y < 0 or self.rect.y > self.screen_rect.bottom - self.height:
            self.vel[1] *= -1;
            
        if self.rect.x < 0 or self.rect.x > self.screen_rect.right- self.height:
            self.vel[0] *= -1;
            print('side wall hit, time to reset ball and give points')
            
    def collide_paddle(self, paddle_rect):
        if self.rect.colliderect(paddle_rect):
            self.vel[0] *= -1;
            
    def move(self):
        self.true_pos[0] += self.vel[0] * self.speed
        self.true_pos[1] += self.vel[1] * self.speed
        self.rect.center = self.true_pos
            
    def update(self, paddle_rect):
        self.collide_walls()
        self.collide_paddle(paddle_rect)
        self.move()

    def render(self, screen):
        screen.blit(self.image, self.rect)
        
class Paddle:
    def __init__(self, screen_rect, size):
        self.screen_rect = screen_rect
        self.image = pg.Surface(size).convert()
        self.image.fill((255,255,0))
        self.rect = self.image.get_rect()
        self.rect.x += 25 #spacer from wall
        self.speed = 5
        
    def move(self, x, y):
        self.rect[0] += x * self.speed
        self.rect[1] += y * self.speed
        
    def update(self, keys):
        self.rect.clamp_ip(self.screen_rect)
        if keys[pg.K_UP] or keys[pg.K_w]:
            self.move(0, -1)
        if keys[pg.K_DOWN] or keys[pg.K_s]:
            self.move(0, 1)
        
    def render(self, screen):
        screen.blit(self.image, self.rect)

paddle = Paddle(screen_rect, (25,100))
ball = Ball(screen_rect, (25,25))

while not done:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            done = True
    keys = pg.key.get_pressed()
    screen.fill((0,0,0))
    paddle.update(keys)
    ball.update(paddle.rect)
    paddle.render(screen)
    ball.render(screen)
    clock.tick(60)
    pg.display.update()
Cool script, think there would be a way to port the keys to touches on an IPad for example?
I know there is a way to map keys to android via something like with the android module
android.key_map(android.KEYCODE_BACK, pygame.K_ESCAPE)
But i dont own any Apple products thus i am not familiar with what the equivalent would be
Interesting, great program though!
Hello,

There's your challenge. Write one. To start, you can find several python
packages fro the touch screen part.
See: https://pypi.python.org/pypi?%3Aaction=s...mit=search
(Nov-07-2016, 06:30 PM)Larz60+ Wrote: [ -> ]Hello, There's your challenge. Write one. To start, you can find several python packages fro the touch screen part. See: https://pypi.python.org/pypi?%3Aaction=s...mit=search
Touché, I think I like you ;)