Python Forum
Pygame simple pong example
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Pygame simple pong example
#1
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()
Recommended Tutorials:
Reply
#2
Cool script, think there would be a way to port the keys to touches on an IPad for example?
Reply
#3
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
Recommended Tutorials:
Reply
#4
Interesting, great program though!
Reply
#5
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
Reply
#6
(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 ;)
The K Man.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Simple pygame input box with cursor and character count menator01 0 1,023 Oct-20-2023, 07:19 PM
Last Post: menator01
  Pygame Pong menator01 0 1,788 Dec-26-2022, 06:48 AM
Last Post: menator01
  Pong clone with classes OhNoSegFaultAgain 1 3,850 May-11-2019, 07:44 PM
Last Post: keames

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020