""" ------------------------------------------------- Project: Take-Away Game Standard: 91883 (AS1.7) v.1 School: Tauranga Boys' College Author: maxwell lee Date: 21/3/2025 Python: 3.5 ------------------------------------------------- """ import pygame from pygame.locals import * import sys import random #Initialize pygame pygame.init() #Define constants vec = pygame.math.Vector2 HEIGHT = 500 WIDTH = 350 ACC = 0.5 FRIC = -0.12 FPS = 60 #Set up the game window displaysurface = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Game") #Load images background_img = pygame.image.load("sky_1.png") background_img = pygame.transform.scale(background_img, (WIDTH, HEIGHT)) low_platform_img = pygame.image.load("airport_platform.png") low_platform_img = pygame.transform.scale(low_platform_img, (WIDTH, 80)) player_img_right = pygame.image.load("player_sprite1.png").convert_alpha() player_img_right = pygame.transform.scale(player_img_right, (65, 35)) player_img_left = pygame.transform.flip(player_img_right, True, False) cloud_img = pygame.image.load("cloud_platform1.png") cloud_img = pygame.transform.scale(cloud_img, (60, 40)) d_cloud_img = pygame.image.load("bad_sprite.png") d_cloud_img = pygame.transform.scale(d_cloud_img, (70, 40)) FramePerSec = pygame.time.Clock() def show_start_screen(): title_font = pygame.font.SysFont("verdana", 25) subtitle_font = pygame.font.SysFont("verdana", 22) instr_font = pygame.font.SysFont("verdana", 16) while True: displaysurface.fill((128, 0, 128)) title = title_font.render("Fly Out The Vale", True, (255, 255, 255)) title_rect = title.get_rect(center=(WIDTH//2, 80)) displaysurface.blit(title, title_rect) subtitle = subtitle_font.render("PLATFORMER", True, (255, 255, 255)) subtitle_rect = subtitle.get_rect(center=(WIDTH//2, title_rect.bottom + 25)) displaysurface.blit(subtitle, subtitle_rect) instructions = [ "Use LEFT and RIGHT arrow keys to move.", "Press UP arrow to jump.", "Jump on platforms to earn points.", "Don't fall off the screen!", "Press SPACE to start the game."] for i, line in enumerate(instructions): text = instr_font.render(line, True, (255, 255, 255)) displaysurface.blit(text, (WIDTH//2 - text.get_width()//2, subtitle_rect.bottom + 35 + i*30)) pygame.display.update() for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() if event.type == KEYDOWN and event.key == K_SPACE: return def show_game_over_screen(score): font = pygame.font.SysFont("verdana", 30) small_font = pygame.font.SysFont("verdana", 16) while True: displaysurface.fill((0,0,0)) game_over_text = font.render("Game Over", True, (255,0,0)) score_text = small_font.render("Your Score: " + str(score), True, (255, 255, 255)) restart_text = small_font.render("Would You Like To Play Again? Y/N", True, (255,255,255)) displaysurface.blit(game_over_text, (WIDTH/2 - game_over_text.get_width()/2, 150)) displaysurface.blit(score_text, (WIDTH/2 - score_text.get_width()/2, 200)) displaysurface.blit(restart_text, (WIDTH/2 - restart_text.get_width()/2, 250)) pygame.display.update() for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() if event.type == KEYDOWN: if event.key == K_y: return True elif event.key == K_n: pygame.quit() sys.exit() def show_winning_screen(): font = pygame.font.SysFont("verdana", 30) small_font = pygame.font.SysFont("verdana", 16) while True: displaysurface.fill((0, 128, 0)) congrats_text = font.render("Congratulations!", True, (255, 255, 255)) beat_game_text = small_font.render("You have beaten the game!", True, (255, 255, 255)) exit_text = small_font.render("Press Q to quit or R to restart.", True, (255, 255, 255)) displaysurface.blit(congrats_text, (WIDTH/2 - congrats_text.get_width()/2, 150)) displaysurface.blit(beat_game_text, (WIDTH/2 - beat_game_text.get_width()/2, 200)) displaysurface.blit(exit_text, (WIDTH/2 - exit_text.get_width()/2, 250)) pygame.display.update() for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() if event.type == KEYDOWN: if event.key == K_r: return True elif event.key == K_q: pygame.quit() sys.exit() class Player(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image_right = player_img_right self.image_left = player_img_left self.facing_right = True self.image = self.image_right self.rect = self.image.get_rect() self.pos = vec(10, 360) self.vel = vec(0, 0) self.acc = vec(0, 0) self.jumping = False self.score = 0 def move(self): self.acc = vec(0, 0.5) pressed_keys = pygame.key.get_pressed() if pressed_keys[K_LEFT]: self.acc.x = -ACC self.facing_right = False if pressed_keys[K_RIGHT]: self.acc.x = ACC self.facing_right = True self.acc.x += self.vel.x * FRIC self.vel += self.acc self.pos += self.vel + 0.5 * self.acc if self.pos.x > WIDTH: self.pos.x = 0 if self.pos.x < 0: self.pos.x = WIDTH self.image = self.image_right if self.facing_right else self.image_left self.rect.midbottom = self.pos def jump(self): hits = pygame.sprite.spritecollide(self, platforms, False) if hits and not self.jumping: self.jumping = True self.vel.y = -15 def cancel_jump(self): if self.jumping and self.vel.y < -3: self.vel.y = -3 def update(self): hits = pygame.sprite.spritecollide(self, platforms, False) if self.vel.y > 0 and hits: if self.pos.y < hits[0].rect.bottom: if hits[0].point: hits[0].point = False self.score += 1 self.pos.y = hits[0].rect.top self.vel.y = 0 self.jumping = False class Platform(pygame.sprite.Sprite): def __init__(self): super().__init__() width = random.randint(50, 100) self.image = pygame.transform.scale(cloud_img, (width, 40)) self.rect = self.image.get_rect(center=( random.randint(0, WIDTH - width), random.randint(0, HEIGHT - 30))) self.point = True self.speed = random.choice([-1, 0, 1]) self.moving = self.speed != 0 def update(self): if self.moving: self.rect.move_ip(self.speed, 0) if self.rect.colliderect(P1.rect): P1.pos.x += self.speed if self.speed > 0 and self.rect.left > WIDTH: self.rect.right = 0 if self.speed < 0 and self.rect.right < 0: self.rect.left = WIDTH if self.rect.top > HEIGHT: self.kill() def check(platform_obj, groupies): if pygame.sprite.spritecollideany(platform_obj, groupies): return True for entity in groupies: if entity == platform_obj: continue if abs(platform_obj.rect.top - entity.rect.bottom) < 50 and abs(platform_obj.rect.bottom - entity.rect.top) < 50: return True return False def plat_gen(): while len(platforms) < 6: width = random.randrange(50,100) p = Platform() C = True while C: p = Platform() p.rect.center = (random.randrange(0, WIDTH-width), random.randrange(-50,0)) C = check(p, platforms) platforms.add(p) all_sprites.add(p) def reset_level(): global platforms, all_sprites, P1 platforms.empty() all_sprites.empty() PT1 = Platform() PT1.image = low_platform_img PT1.rect = PT1.image.get_rect(center=(WIDTH//2, HEIGHT-10)) PT1.point = False PT1.moving = False platforms.add(PT1) all_sprites.add(PT1) P1.pos = vec(PT1.rect.centerx, PT1.rect.top) P1.vel = vec(0, 0) P1.acc = vec(0, 0) P1.jumping = False all_sprites.add(P1) for _ in range(random.randint(4,5)): pl = Platform() while check(pl, platforms): pl = Platform() platforms.add(pl) all_sprites.add(pl) def game_loop(): global current_level, last_score_for_level_up current_level = 1 last_score_for_level_up = 0 points_per_level = 10 reset_level() running = True while running: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() if event.type == KEYDOWN: if event.key == K_UP: P1.jump() if event.key == K_SPACE: P1.cancel_jump() P1.update() P1.move() for plat in platforms: plat.update() if P1.rect.top > HEIGHT: running = False break if P1.rect.top <= HEIGHT // 3: P1.pos.y += abs(P1.vel.y) for plat in platforms: plat.rect.y += abs(P1.vel.y) if plat.rect.top >= HEIGHT: plat.kill() plat_gen() if P1.score - last_score_for_level_up >= points_per_level: current_level += 1 last_score_for_level_up = P1.score reset_level() if current_level == 5: restart = show_winning_screen() if restart: return True else: pygame.quit() sys.exit() displaysurface.blit(background_img, (0, 0)) score_text = pygame.font.SysFont("Verdana", 20).render(f"Score: {P1.score}", True, (64,64,64)) displaysurface.blit(score_text, (WIDTH//2 - score_text.get_width()//2, 10)) level_text = pygame.font.SysFont("Verdana", 20).render(f"Level: {current_level}", True, (64,64,64)) displaysurface.blit(level_text, (10, 10)) for entity in all_sprites: displaysurface.blit(entity.image, entity.rect) pygame.display.update() FramePerSec.tick(FPS) P1 = Player() all_sprites = pygame.sprite.Group() platforms = pygame.sprite.Group() show_start_screen() while True: P1.score = 0 P1.pos = vec(10, 360) P1.vel = vec(0, 0) P1.acc = vec(0, 0) P1.jumping = False restart = game_loop() if not restart: restart = show_game_over_screen(P1.score) if not restart: break