Simple games

Pong

../_images/pong1.png
import pygame
from pygame.locals import *
from pygamelib import *

class Ball:
    def __init__(self, pos, field, pad):
        self.pos = pos
        self.field = field
        self.pad = pad
        self.speed = [1, 1]
        self.color = RED
        self.rect = pygame.Rect(pos, (20, 20))

    def update(self):
        self.rect.move_ip(self.speed)

        if self.rect.left < self.field.rect.left:
            self.speed[0] = abs(self.speed[0])
        if self.rect.right > self.field.rect.right:
            self.speed[0] = -abs(self.speed[0])

        if self.rect.top < self.field.rect.top:
            self.speed[1] = abs(self.speed[1])
        if self.rect.bottom > self.field.rect.bottom:
            self.speed[1] = -abs(self.speed[1])

        if self.rect.colliderect(self.pad.rect):
            self.speed[0] = abs(self.speed[0])

    def draw(self):
        pygame.draw.rect(App.screen, self.color, self.rect, 0)

class Pad:
    def __init__(self, keys, field):
        self.keys = keys
        self.field = field
        self.speed = [0, 0]
        self.v = 5
        self.color = GREEN
        self.rect = pygame.Rect(self.field.rect.topleft, (10, 50))
        self.rect.move_ip(10, 0)

    def do(self, event):
        if event.type == KEYDOWN:
            if event.key == self.keys[0]:
                self.speed[1] = -self.v
            if event.key == self.keys[1]:
                self.speed[1] = self.v

        elif event.type == KEYUP:
            self.speed[1] = 0
                

    def update(self):
        self.rect.move_ip(self.speed)

        if self.rect.top < self.field.rect.top:
            self.rect.top = self.field.rect.top
        if self.rect.bottom > self.field.rect.bottom:
            self.rect.bottom = self.field.rect.bottom

    def draw(self):
        pygame.draw.rect(App.screen, self.color, self.rect, 0)

class Field:
    def __init__(self, rect):
        self.color = WHITE
        self.bg_color = BLACK
        self.stroke = 10
        self.rect = pygame.Rect(rect)

    def draw(self):
        pygame.draw.rect(App.screen, self.color, self.rect, self.stroke)
        pygame.draw.rect(App.screen, self.bg_color, self.rect, 0)

class PongDemo(App):
    """Play the game of Pong."""
    def __init__(self):
        super().__init__()
        Text('Pong', size=48)

        self.field = Field((200, 10, 400, 200))
        self.pad = Pad((K_UP, K_DOWN), self.field)
        self.ball = Ball(self.field.rect.center, self.field, self.pad)
        self.bg_color = GRAY
 

    def run(self):
        while self.running:
            for event in pygame.event.get():
                if event.type == QUIT:
                    self.running = False
                    pygame.quit()

                self.pad.do(event)

            self.update()
            self.draw()

    def update(self):
        self.ball.update()
        self.pad.update()

    def draw(self):
        self.screen.fill(self.bg_color)
        self.field.draw()
        self.ball.draw()
        self.pad.draw()
        pygame.display.flip()
                
if __name__ == '__main__':
    PongDemo().run()

pong.py