import pygame, random class Player(object): img = pygame.image.load('l7_ship.ppm') img.set_colorkey([1, 1, 1]) def __init__(self, x, y): self.x = x self.y = y self.keys = {} self.crash = None self.score = 0 def run(self, screen): while 1: if self.crash: self.y += 1 else: if self.keys.get(pygame.K_LEFT): self.x -= 4 if self.keys.get(pygame.K_RIGHT): self.x += 4 screen.blit(self.img, (self.x, self.y)) yield None class FallingObject(object): def __init__(self, x, player): self.x = x self.y = -self.img.get_size()[1] self.dx = random.randrange(-2, 3) self.dy = random.randrange(3, 7) self.player = player def run(self, screen): for self.y in range(self.y, screen_dimensions[1], self.dy): self.x += self.dx screen.blit(self.img, (self.x, self.y)) if self.player.crash is None: distx = self.x - self.player.x disty = self.y - self.player.y if distx * distx + disty * disty < 25 * 25: if self.touched(): return yield None class Boulder(FallingObject): img = pygame.image.load('l7_boulder.ppm') img.set_colorkey([1, 1, 1]) def touched(self): self.player.crash = self return False class Star(FallingObject): imgs = pygame.image.load('l7_star.ppm') imgs.set_colorkey([1, 1, 1]) imgs = [imgs.subsurface(pygame.Rect(0, y*32, 32, 32)) for y in range(12)] def __init__(self, x, player): self.img = random.choice(self.imgs) FallingObject.__init__(self, x, player) def touched(self): self.player.score += 1 return True title = "My game" # The framerate of the game (in milliseconds) framerate = 60 screen_dimensions = (750, 500) def main(): # Initialize pygame elements screen, clock = init_screen() # Build the state player = Player(screen_dimensions[0] // 2, screen_dimensions[1] - 40) sprites = [player.run(screen)] difficulty = 0.97 font = pygame.font.Font('VeraMoBd.ttf', 24) # Even loop while True: # Add a boulder from time to time if random.random() > difficulty: if random.random() < 0.12: cls = Star else: cls = Boulder obj = cls(random.randrange(0, screen_dimensions[0]), player) sprites.append(obj.run(screen)) if player.crash is None: difficulty *= 0.9999 # Erase the drawing, by drawing a blank background screen y2 = 0 for fy in range(256): y1 = y2 y2 = int(screen_dimensions[1] * (fy + 1) / 256) screen.fill((0, 0, 255-fy), (0, y1, screen_dimensions[0], y2 - y1)) # Ask each sprite to move one step and draw itself for sprmover in sprites[:]: try: sprmover.next() except StopIteration: sprites.remove(sprmover) # Draw the score score = font.render(str(player.score), 1, (255, 255, 255)) screen.blit(score, (30, 20)) # Update the screen pygame.display.flip() clock.tick(framerate) # Look out for window close events: for e in pygame.event.get(): if e.type == pygame.KEYDOWN: player.keys[e.key] = True if e.type == pygame.KEYUP: player.keys[e.key] = False if e.type == pygame.QUIT: return def init_screen(): pygame.init() screen = pygame.display.set_mode(screen_dimensions) pygame.display.set_caption(title) clock = pygame.time.Clock() return screen, clock main()