mario.py
import pygame import sys pygame.init() WINDOW_WIDTH = 1200 WINDOW_HEIGHT = 600 FPS = 20 BLACK = (0, 0, 0) GREEN = (0, 255, 0) ADD_NEW_FLAME_RATE = 25 cactus_img = pygame.image.load('cactus_bricks.png') cactus_img_rect = cactus_img.get_rect() cactus_img_rect.left = 0 fire_img = pygame.image.load('fire_bricks.png') fire_img_rect = fire_img.get_rect() fire_img_rect.left = 0 CLOCK = pygame.time.Clock() font = pygame.font.SysFont('forte', 20) canvas = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption('Mario') class Topscore: def __init__(self): self.high_score = 0 def top_score(self, score): if score > self.high_score: self.high_score = score return self.high_score topscore = Topscore() class Dragon: dragon_velocity = 10 def __init__(self): self.dragon_img = pygame.image.load('dragon.png') self.dragon_img_rect = self.dragon_img.get_rect() self.dragon_img_rect.width -= 10 self.dragon_img_rect.height -= 10 self.dragon_img_rect.top = WINDOW_HEIGHT/2 self.dragon_img_rect.right = WINDOW_WIDTH self.up = True self.down = False def update(self): canvas.blit(self.dragon_img, self.dragon_img_rect) if self.dragon_img_rect.top <= cactus_img_rect.bottom: self.up = False self.down = True elif self.dragon_img_rect.bottom >= fire_img_rect.top: self.up = True self.down = False if self.up: self.dragon_img_rect.top -= self.dragon_velocity elif self.down: self.dragon_img_rect.top += self.dragon_velocity class Flames: flames_velocity = 20 def __init__(self): self.flames = pygame.image.load('fireball.png') self.flames_img = pygame.transform.scale(self.flames, (20, 20)) self.flames_img_rect = self.flames_img.get_rect() self.flames_img_rect.right = dragon.dragon_img_rect.left self.flames_img_rect.top = dragon.dragon_img_rect.top + 30 def update(self): canvas.blit(self.flames_img, self.flames_img_rect) if self.flames_img_rect.left > 0: self.flames_img_rect.left -= self.flames_velocity class Mario: velocity = 10 def __init__(self): self.mario_img = pygame.image.load('maryo.png') self.mario_img_rect = self.mario_img.get_rect() self.mario_img_rect.left = 20 self.mario_img_rect.top = WINDOW_HEIGHT/2 - 100 self.down = True self.up = False def update(self): canvas.blit(self.mario_img, self.mario_img_rect) if self.mario_img_rect.top <= cactus_img_rect.bottom: game_over() if SCORE > self.mario_score: self.mario_score = SCORE if self.mario_img_rect.bottom >= fire_img_rect.top: game_over() if SCORE > self.mario_score: self.mario_score = SCORE if self.up: self.mario_img_rect.top -= 10 if self.down: self.mario_img_rect.bottom += 10 def game_over(): pygame.mixer.music.stop() music = pygame.mixer.Sound('mario_dies.wav') music.play() topscore.top_score(SCORE) game_over_img = pygame.image.load('end.png') game_over_img_rect = game_over_img.get_rect() game_over_img_rect.center = (WINDOW_WIDTH/2, WINDOW_HEIGHT/2) canvas.blit(game_over_img, game_over_img_rect) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: pygame.quit() sys.exit() music.stop() game_loop() pygame.display.update() def start_game(): canvas.fill(BLACK) start_img = pygame.image.load('start.png') start_img_rect = start_img.get_rect() start_img_rect.center = (WINDOW_WIDTH/2, WINDOW_HEIGHT/2) canvas.blit(start_img, start_img_rect) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: pygame.quit() sys.exit() game_loop() pygame.display.update() def check_level(SCORE): global LEVEL if SCORE in range(0, 10): cactus_img_rect.bottom = 50 fire_img_rect.top = WINDOW_HEIGHT - 50 LEVEL = 1 elif SCORE in range(10, 20): cactus_img_rect.bottom = 100 fire_img_rect.top = WINDOW_HEIGHT - 100 LEVEL = 2 elif SCORE in range(20, 30): cactus_img_rect.bottom = 150 fire_img_rect.top = WINDOW_HEIGHT - 150 LEVEL = 3 elif SCORE > 30: cactus_img_rect.bottom = 200 fire_img_rect.top = WINDOW_HEIGHT - 200 LEVEL = 4 def game_loop(): while True: global dragon dragon = Dragon() flames = Flames() mario = Mario() add_new_flame_counter = 0 global SCORE SCORE = 0 global HIGH_SCORE flames_list = [] pygame.mixer.music.load('mario_theme.wav') pygame.mixer.music.play(-1, 0.0) while True: canvas.fill(BLACK) check_level(SCORE) dragon.update() add_new_flame_counter += 1 if add_new_flame_counter == ADD_NEW_FLAME_RATE: add_new_flame_counter = 0 new_flame = Flames() flames_list.append(new_flame) for f in flames_list: if f.flames_img_rect.left <= 0: flames_list.remove(f) SCORE += 1 f.update() for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: mario.up = True mario.down = False elif event.key == pygame.K_DOWN: mario.down = True mario.up = False if event.type == pygame.KEYUP: if event.key == pygame.K_UP: mario.up = False mario.down = True elif event.key == pygame.K_DOWN: mario.down = True mario.up = False score_font = font.render('Score:'+str(SCORE), True, GREEN) score_font_rect = score_font.get_rect() score_font_rect.center = (200, cactus_img_rect.bottom + score_font_rect.height/2) canvas.blit(score_font, score_font_rect) level_font = font.render('Level:'+str(LEVEL), True, GREEN) level_font_rect = level_font.get_rect() level_font_rect.center = (500, cactus_img_rect.bottom + score_font_rect.height/2) canvas.blit(level_font, level_font_rect) top_score_font = font.render('Top Score:'+str(topscore.high_score),True,GREEN) top_score_font_rect = top_score_font.get_rect() top_score_font_rect.center = (800, cactus_img_rect.bottom + score_font_rect.height/2) canvas.blit(top_score_font, top_score_font_rect) canvas.blit(cactus_img, cactus_img_rect) canvas.blit(fire_img, fire_img_rect) mario.update() for f in flames_list: if f.flames_img_rect.colliderect(mario.mario_img_rect): game_over() if SCORE > mario.mario_score: mario.mario_score = SCORE pygame.display.update() CLOCK.tick(FPS) start_game()