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