Untitled

Anonymous
plain_text
09/02/2026 4:37 PM
9.6 KB
4
Indexable
from typing import Any
from pygame import *
from random import randint, random

font.init()

WINDOW_WIDTH = 700
WINDOW_HEIGHT = 500

BACKGROUND_IMAGE = "background_galaxy.jpg"
MUSIC = "space.ogg"
PLAYER_IMAGE = "rocket.png"
ASTEROID_IMAGE = "asteroid.png"

FPS = 60

SECOND = FPS

COLOR_LOSE_LABEL = (255, 0, 0)
COLOR_WIN_LABEL = (0, 255, 0)

mixer.init()
mixer.music.load(MUSIC)
mixer.music.set_volume(0.1)
mixer.music.play()

screen = display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))

background = image.load(BACKGROUND_IMAGE)
background = transform.scale(background, (WINDOW_WIDTH, WINDOW_HEIGHT))


class GameSprite(sprite.Sprite):
    def __init__(self, player_image, player_x, player_y, width,height, player_speed):
        super().__init__()
        self.image = transform.scale(image.load(player_image), (width, height))
        self.speed = player_speed
        self.rect = self.image.get_rect()
        self.rect.x = player_x
        self.rect.y = player_y

    def reset(self):
        screen.blit(self.image, (self.rect.x, self.rect.y))

class Player(GameSprite):
    def __init__(self, player_image, player_x, player_y, width,height, player_speed):
        super().__init__(player_image, player_x, player_y, width,height, player_speed)

    def update(self):
        keys = key.get_pressed()
        
        if keys[K_d]:
            self.rect.x += self.speed
            
        if keys[K_a]:
            self.rect.x -= self.speed
        self.fire()

    def fire(self):
        keys = key.get_just_pressed()
    
        if keys[K_SPACE]:
            b = Bullet("bullet.png",self.rect.centerx, self.rect.top,20,40,5)
            b.rect.centerx = self.rect.centerx
            bullets.add(b)

class Enemy(GameSprite):
    def __init__(self, player_image, player_x, player_y, width,height, player_speed):
        super().__init__(player_image, player_x, player_y, width,height, player_speed)

    def update(self):
        self.rect.y += self.speed

        if self.rect.y > WINDOW_HEIGHT:
            self.rect.x = randint(0, WINDOW_WIDTH - 80)
            self.rect.y = 0

class Bullet(GameSprite):
    def update(self):
        self.rect.y -= self.speed

        if self.rect.y < 0:
            self.kill()

class Asteroid(GameSprite):
    def __init__(self, player_image,health_points, player_x, player_y, size, player_speed):
        
        self.health_points = health_points
        self.size = randint(size-25, size+25)
      
        self.velocity = randint(-1,1) + random()
        
        self.rotation_speed = randint(1,2)
        
        super().__init__(player_image, player_x, player_y,  self.size,  self.size, player_speed)
        
        self.original_image = self.image.copy()
        self.angle = 0
        
    def update(self):
        self.rect.y += self.speed
        self.rect.x += self.velocity 
            
        
        if self.rect.y > WINDOW_HEIGHT +200 or self.health_points <= 0:
            self.kill()
            
        old_center = self.rect.center
        
        self.image = transform.rotate(self.original_image, self.angle)
        self.angle += self.rotation_speed
        
        
        self.rect = self.image.get_rect(center = old_center)
    
    def take_damage(self,damage):
        self.health_points -= damage


player = Player(PLAYER_IMAGE, 300, 400, 80, 100, 5)
my_font = font.Font(None, 36)

bullets = sprite.Group()
enemies = sprite.Group()
asteroids = sprite.Group()

for i in range(3):

    enemy = Enemy(
    "ufo.png",
    randint(0, WINDOW_WIDTH - 80),
    randint(-100, -40),
    80,
    60,
    randint(2,3)
    )

    enemies.add(enemy)

clock = time.Clock()

run = True

game_finish = False
won = False
lose = False

score = 0
lost_score = 0

wait_for_start = SECOND * 4

label_points = my_font.render("Points: 0", True, (255, 255, 255))
label_lost_points = my_font.render("Lost: 0", True, (255, 255, 255))

while run == True:
    clock.tick(FPS)

    for e in event.get():
        if e.type == QUIT:
            run = False

    if not game_finish :

        screen.blit(background, (0, 0))

        if wait_for_start <= 0:

            if score >= 10:
                game_finish = True
                won = True

            elif lost_score >= 5:
                game_finish = True
                lose = True

            screen.blit(label_points, (10, 10))
            screen.blit(label_lost_points, (600, 10))

            player.fire()

            player.update()
            player.reset()

            bullets.draw(screen)
            bullets.update()

            enemies.update()
            enemies.draw(screen)

            asteroids.update()
            asteroids.draw(screen)

            downed_enemies = sprite.groupcollide(bullets, enemies, True, True)

            hit_asteroids = sprite.groupcollide(bullets, asteroids, True, False)

            for bullet, asteroid_list in  hit_asteroids.items():
                for asteroid in asteroid_list:
                    asteroid.take_damage(1)
            
            if len(asteroids) < 1:
                asteroid = Asteroid(ASTEROID_IMAGE, 3, randint(0,WINDOW_WIDTH-50), -100, 75,2 )
                asteroids.add(asteroid)

            for downed in downed_enemies:
                enemy = Enemy("ufo.png", randint(0,WINDOW_WIDTH-50), randint(-300,-100), 75,50,2)
                enemies.add(enemy)
                
                score += 1
                
                label_points = my_font.render(f"score: {score}", True, (255,255,255))

            missed_enemies = sprite.spritecollide(player, enemies, True)

            for miss in missed_enemies:
                enemy = Enemy("ufo.png", randint(0,WINDOW_WIDTH-50), randint(-300,-100), 75,50,2)
                enemies.add(enemy)
                
                lost_score += 1
                
                label_lost_points = my_font.render(f"Lost: {lost_score}", True, (255,255,255))

        if won:
            my_font = font. Font(None, 64)
            label_win = my_font.render("YOU WON!", True, (255,255,255))

            screen.blit(background,(0,0))
            screen.blit(label_win, (WINDOW_WIDTH//2-115, WINDOW_HEIGHT//2))

        if lose:
            my_font = font. Font(None, 64)
            label_lose = my_font.render("YOU LOSE!", True, (255,255,255))

            screen.blit(background,(0,0))
            screen.blit(label_lose, (WINDOW_WIDTH//2-115, WINDOW_HEIGHT//2))

        if len(enemies) < 3:
            enemy = Enemy(
                "ufo.png",
                randint(0, WINDOW_WIDTH - 80),
                randint(-100, -40),
                80,
                60,
                randint(2,3)
            )
            enemies.add(enemy)
        else:
            keys = key.get_just_pressed()

            if keys [K_s]:
                if wait_for_start > 0:
                    wait_for_start -= 1
                    wait_label = my_font.render(f"Game starts in: {wait_for_start//SECOND}", True, (255,255,255))
                    screen.blit(wait_label, (WINDOW_WIDTH//2-115, WINDOW_HEIGHT//2))
            else:
                if wait_for_start > 0:
                    wait_for_press_label = my_font.render("Press S to start the game", True, (255,255,255))
                    screen.blit(wait_for_press_label, (WINDOW_WIDTH//2-115, WINDOW_HEIGHT//2))
    display.update()
Editor is loading...
Leave a Comment