#! usr/bin/env python # Climber, a game about a box and fisheys. # Copyright (C) 2011 T. S. Hayden Dennison # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import random import pygame from sys import exit import pickle pygame.init() pygame.event.set_allowed([pygame.KEYDOWN, pygame.QUIT]) screen = pygame.display.set_mode([400, 500]) pygame.display.set_caption('Climber') score = 0 killers = pygame.sprite.Group() powerups = pygame.sprite.Group() clock = pygame.time.Clock() fps = 20 font = pygame.font.Font(None, 32) basekillers = 9 maxkillers = basekillers def reset(): global score score = 0 fps = 20 return def savescore(): global score try: sfile = open('scores.txt', 'r+') except: sfile = open('scores.txt', 'w') sfile.close() sfile = open('scores.txt', 'r+') if len(sfile.readlines()) == 0: pickle.dump([0, 0], sfile) sfile.seek(0) scores = pickle.load(sfile) if scores[1] <= score: scores[1] = score scores[0] = entername() sfile.seek(0) pickle.dump(scores, sfile) else: sfile.close() return def entername(): global screen, score, clock, font name = '' screen.blit(font.render(('You got the high score: '+ str(score)), True, [255, 255, 0]), [0, 300]) while True: pygame.draw.rect(screen, [0, 0, 0], [0, 350, 400, 32]) screen.blit(font.render(name, True, [0, 255, 0], [255, 0, 0]), [0, 350]) e = pygame.event.poll() if e.type == pygame.QUIT: return elif e.type == pygame.KEYDOWN: if e.key == pygame.K_q: name = name + 'Q' elif e.key == pygame.K_w: name = name + 'W' elif e.key == pygame.K_e: name = name + 'E' elif e.key == pygame.K_r: name = name + 'R' elif e.key == pygame.K_t: name = name + 'T' elif e.key == pygame.K_y: name = name + 'Y' elif e.key == pygame.K_u: name = name + 'U' elif e.key == pygame.K_i: name = name + 'I' elif e.key == pygame.K_o: name = name + 'O' elif e.key == pygame.K_p: name = name + 'P' elif e.key == pygame.K_a: name = name + 'A' elif e.key == pygame.K_s: name = name + 'S' elif e.key == pygame.K_d: name = name + 'D' elif e.key == pygame.K_f: name = name + 'F' elif e.key == pygame.K_g: name = name + 'G' elif e.key == pygame.K_h: name = name + 'H' elif e.key == pygame.K_j: name = name + 'J' elif e.key == pygame.K_k: name = name + 'K' elif e.key == pygame.K_l: name = name + 'L' elif e.key == pygame.K_z: name = name + 'Z' elif e.key == pygame.K_x: name = name + 'X' elif e.key == pygame.K_c: name = name + 'C' elif e.key == pygame.K_v: name = name + 'V' elif e.key == pygame.K_b: name = name + 'B' elif e.key == pygame.K_n: name = name + 'N' elif e.key == pygame.K_m: name = name + 'M' elif e.key == pygame.K_SPACE: name = name + ' ' elif e.key == pygame.K_RETURN: return name elif e.key == pygame.K_BACKSPACE: newname = name[:len(name)-1] name = newname[:] pygame.display.flip() clock.tick(10) return class Player(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.rect = pygame.Rect((0, 0), (40, 40)) self.speed = 15 self.life = 3 self.horizontaltimer = 0 self.poweruptimer = 0 self.powerup = None def update(self): global screen, score, powerups, fps, maxkillers, basekillers keys = pygame.key.get_pressed() if keys[pygame.K_RIGHT]: if self.horizontaltimer == 0: if self.rect.right < 400-self.rect.width: self.rect.right += 80 self.horizontaltimer = 2 elif keys[pygame.K_LEFT]: if self.horizontaltimer == 0: if self.rect.left > 0: self.rect.left -= 80 self.horizontaltimer = 2 else: if self.horizontaltimer > 0: self.horizontaltimer -= 1 if keys[pygame.K_UP]: if self.rect.top > 0: self.rect.top -= self.speed if keys[pygame.K_DOWN]: if self.rect.bottom < 500: self.rect.bottom += self.speed collide = pygame.sprite.spritecollide(self, powerups, True) if len(collide) > 0: powerup = collide[0] if powerup.type == 'grow': self.poweruptimer = 30 self.rect.width = 50 self.rect.height = 50 self.powerup = 'grow' elif powerup.type == 'slow': self.poweruptimer = 30 fps = 5 self.powerup = 'slow' elif powerup.type == 'shield': self.poweruptimer = 50 self.powerup = 'shield' elif powerup.type == 'speed': self.poweruptimer = 27 self.speed = 20 self.powerup = 'speed' elif powerup.type == 'shrink': self.poweruptimer = 40 self.rect.width = 30 self.rect.height = 30 self.powerup = 'shrink' elif powerup.type == 'skinny': self.poweruptimer = 40 self.rect.height = 5 self.powerup = 'skinny' elif powerup.type == 'easy': self.poweruptimer = 60 maxkillers -= 4 self.powerup = 'easy' elif powerup.type == '100 points': score += 100 self.poweruptimer = 3 self.powerup = '100' elif powerup.type == '500 points': score += 500 self.poweruptimer = 3 self.powerup = '500' elif powerup.type == '1000 points': score += 1000 self.poweruptimer = 3 self.powerup = '1000' else: if self.poweruptimer > 0: self.poweruptimer -= 1 else: self.powerup = None fps = 20 self.speed = 15 self.rect.width, self.rect.height = 40, 40 maxkillers = basekillers pygame.draw.rect(screen, [0, 0, 255], self.rect) pygame.draw.rect(screen, [0, 255, 0], self.rect, 2) if self.powerup != None: screen.blit(font.render(self.powerup, True, [0, 0, 0]), self.rect.midtop) score += (self.rect.left/80)+1 return class Killer(pygame.sprite.Sprite): def __init__(self, speed): global killers pygame.sprite.Sprite.__init__(self) self.add(killers) self.rect = pygame.Rect((400, random.randint(0, 500)), (30, 40)) self.speed = speed def update(self): global screen, killers if self.rect.left > 0: self.rect.left -= self.speed else: self.remove(killers) pygame.draw.polygon(screen, [255, 0, 0], [self.rect.midtop, self.rect.midleft, self.rect.midbottom]) pygame.draw.polygon(screen, [0, 255, 0], [self.rect.topright, self.rect.center, self.rect.bottomright]) class Powerup(pygame.sprite.Sprite): def __init__(self, speed, powertype): global powerups pygame.sprite.Sprite.__init__(self) self.add(powerups) self.rect = pygame.Rect((400, random.randint(0, 500)), (30, 40)) self.speed = speed self.type = powertype def update(self): global screen, powerups if self.rect.left > 0: self.rect.left -= self.speed else: self.remove(powerups) pygame.draw.ellipse(screen, [0, 255, 0], self.rect) pygame.draw.ellipse(screen, [255, 255, 0], self.rect, 2) return def mainloop(player): global score, screen, killers, powerups, fps, font, maxkillers, scores bg = pygame.Surface([400, 500]).convert() color = [] for i in range(0,3): color.append(random.randint(100, 255)) bg.fill(color) pygame.display.flip() while player.life > -1: screen.blit(bg, [0, 0]) e = pygame.event.poll() if e.type == pygame.QUIT: pygame.quit() exit() elif e.type == pygame.KEYDOWN and e.key == pygame.K_ESCAPE: pygame.quit() exit() player.update() killers.update() powerups.update() if len(killers) < maxkillers: if score < 500: killer = Killer(random.randint(1, 7)) elif score < 1000: killer = Killer(random.randint(3, 9)) elif score < 2500: killer = Killer(random.randint(5, 11)) else: killer = Killer(random.randint(7, 13)) if random.randint(0, 25) == random.randint(0, 25) and player.powerup == None: powerup = Powerup(random.randint(2, 18), random.choice(['grow', 'slow', 'shield', 'speed', 'shrink', 'skinny', 'easy', '100 points', '500 points', '1000 points'])) if pygame.sprite.spritecollide(player, killers, True): if player.powerup != 'shield': player.life -= 1 scoretext = font.render(str(score), True, [0, 0, 0]) screen.blit(scoretext, (400-scoretext.get_width(), 0)) lifetext = font.render(str(player.life), True, [255, 0, 255]) screen.blit(lifetext, [0, 0]) clock.tick(fps) pygame.display.flip() bg.fill([0, 0, 0]) return def displayhelp(): global screen screen.fill([0, 0, 0]) playerpic = pygame.Rect((360, 0), (40, 40)) pygame.draw.rect(screen, [0, 0, 255], playerpic) pygame.draw.rect(screen, [0, 255, 0], playerpic, 2) font = pygame.font.Font(None, 30) youare = font.render('You are:', True, [255, 255, 0]) screen.blit(youare, (250, 0)) enemypic = pygame.Rect((370, 50), (30, 40)) pygame.draw.polygon(screen, [255, 0, 0], [enemypic.midtop, enemypic.midleft, enemypic.midbottom]) pygame.draw.polygon(screen, [0, 255, 0], [enemypic.topright, enemypic.center, enemypic.bottomright]) avoid = font.render('Avoid:', True, [255, 255, 0]) screen.blit(avoid, (250, 50)) powerups = font.render('Powerups:', True, [255, 255, 0]) powerup = pygame.Rect((370, 100), (30, 40)) pygame.draw.ellipse(screen, [0, 255, 0], powerup) pygame.draw.ellipse(screen, [255, 255, 0], powerup, 2) screen.blit(powerups, (250, 100)) oneandtwo = font.render('Press 1 for easy, 2 for medium,', True, [255, 0, 0]) threeandfour = font.render('3 for hard, 4 for insane.', True, [255, 0, 0]) usearrows = font.render('Use the arrow keys to move.', True, [255, 0, 0]) life1 = font.render('The number in the top-left corner', True, [255, 0, 0]) life2 = font.render('is your life. The one in the', True, [255, 0, 0]) score1 = font.render('topright is your score.', True, [255, 0, 0]) score2 = font.render('The closer you are to the', True, [255, 0, 0]) score3 = font.render('right side of the screen, the more points', True, [255, 0, 0]) score4 = font.render('you will get.', True, [255, 0, 0]) tip1 = font.render('If you time it right, you can', True, [255, 0, 0]) tip2 = font.render('go straight through a killer by pressing', True, [255, 0, 0]) tip3 = font.render('the right arrow key.', True, [255, 0, 0]) try: sfile = open('scores.txt', 'r+') scores = pickle.load(sfile) screen.blit(font.render('Highscore:', True, [0, 255, 0]), [0, 0]) screen.blit(font.render((scores[0] + ':'), True, [0, 255, 0]), [0, 32]) screen.blit(font.render(str(scores[1]), True, [0, 255, 0]), [0, 64]) sfile.close() except: pass screen.blit(oneandtwo, [0, 130]) screen.blit(threeandfour, [0, 160]) screen.blit(life1, [0, 190]) screen.blit(life2, [0, 220]) screen.blit(score1, [0, 250]) screen.blit(score2, [0, 280]) screen.blit(score3, [0, 310]) screen.blit(score4, [0, 340]) screen.blit(tip1, [0, 370]) screen.blit(tip2, [0, 400]) screen.blit(tip3, [0, 430]) pygame.display.flip() def main(): global screen, maxkillers, basekillers, scores displayhelp() while True: e = pygame.event.poll() if e.type == pygame.QUIT: pygame.quit() exit() elif e.type == pygame.KEYDOWN: if e.key == pygame.K_ESCAPE: pygame.quit() exit() elif e.key == pygame.K_1: basekillers = 4 maxkillers = basekillers mainloop(Player()) elif e.key == pygame.K_2: basekillers = 7 maxkillers = basekillers mainloop(Player()) elif e.key == pygame.K_3: basekillers = 9 maxkillers = basekillers mainloop(Player()) elif e.key == pygame.K_4: basekillers = 10 maxkillers = basekillers mainloop(Player()) savescore() reset() displayhelp() if __name__ == '__main__': main()