#
import pygame
from pygame.locals import *
from random import randint
import math
class Paddle(pygame.sprite.Sprite):
WIDTH, HEIGHT = 15, 300
SPEED = 20.
def __init__(self, pos):
pygame.sprite.Sprite.__init__(self)
self.rect = Rect(0,0, Paddle.WIDTH, Paddle.HEIGHT)
self.rect.center = pos
self.image = pygame.Surface(self.rect.size)
self.image.fill(Color("gray80"))
def handle_keystate(self, keys):
if keys[pygame.K_w]:
self.rect.top -= self.SPEED
elif keys[pygame.K_s]:
self.rect.top += self.SPEED
class Ball(pygame.sprite.Sprite):
SPEED = 10.
def __init__(self, game):
pygame.sprite.Sprite.__init__(self)
self.game = game
self.rect = Rect(0,0,20,20)
self.image = pygame.Surface(self.rect.size)
self.image.fill(Color("gray20"))
self.velx, self.vely = self.SPEED, self.SPEED
def draw(self):
self.game.screen.blit(self.image, self.rect)
def reset(self):
# to center
self.rect.center = self.game.screen.get_rect().center
# random direction, with same initial speed
angle = math.radians(randint(0,360))
self.velx = math.cos(angle) * self.SPEED
self.vely = math.sin(angle) * self.SPEED
def update(self):
# move
self.rect.x += self.velx
self.rect.y += self.vely
# bounce walls
if self.rect.top <= 0:
self.vely *= -1
if self.rect.bottom >= self.game.screen.get_rect().bottom:
self.vely *= -1
# offscreen
if not self.rect.colliderect(self.game.screen.get_rect()):
if self.rect.left <= 0:
print "ai scores"
else:
print "human scores"
self.reset()
def handle_collision(self, other):
self.velx *= -1
self.vely *= -1
class GameMain():
"""game Main. entry point. handles intialization of game and graphics, as well as game loop."""
done = False
color_bg = Color('gray30') # or also: Color(50,50,50) , or: Color('#fefefe')
def __init__(self, width=800, height=600):
"""
"""
pygame.init()
self.width, self.height = width, height
self.screen = pygame.display.set_mode(( self.width, self.height ))
self.clock = pygame.time.Clock()
self.player = Paddle(( 50 ,300))
self.ai = Paddle(( self.screen.get_rect().right - 50,300))
self.paddles = pygame.sprite.Group()
self.ball = Ball(self)
self.paddles.add( self.player, self.ai)
def main_loop(self):
"""Game() main loop."""
while not self.done:
self.handle_events()
# move ball
self.ball.update()
for p in self.paddles:
if self.ball.rect.colliderect(p.rect):
self.ball.handle_collision(p)
self.draw()
self.clock.tick(60)
def draw(self):
"""draw screen"""
self.screen.fill( self.color_bg )
self.paddles.draw(self.screen)
self.ball.draw()
pygame.display.flip()
def handle_events(self):
"""handle events: keyboard, mouse, etc."""
events = pygame.event.get()
# keystates
keys = pygame.key.get_pressed()
self.player.handle_keystate(keys)
# events
for event in events:
if event.type == pygame.QUIT: self.done = True
# event: keydown
elif event.type == KEYDOWN:
if event.key == K_ESCAPE: self.done = True
elif event.key == K_SPACE:
self.ball.reset()
if __name__ == "__main__":
game = GameMain()
game.main_loop()