Ejemplo n.º 1
0
class Game():
    def __init__(self):
        pygame.init()
        self.lifes = [
            pyg.image.load("lifes.png"),
            pyg.image.load("lifes.png"),
            pyg.image.load("lifes.png"),
            pyg.image.load("lifes.png"),
            pyg.image.load("lifes.png")
        ]
        self.isgame = True
        self.moving_flag = True
        self.win = pygame.display.set_mode((500, 600))
        pygame.display.set_caption("Space Invadors")
        self.ship = Ship(self.win)
        self.barrier_1 = Barrier(100, 450, self.win)
        self.barrier_2 = Barrier(300, 450, self.win)
        self.enemys = [Enemy(self.win, x, 100) for x in range(30, 425, 55)]
        self.enemys += [Enemy(self.win, x, 225) for x in range(20, 435, 45)]
        self.count = 0

    def get_min_y(self, barrier, xc):
        mas = [(y if xc == x else 700) for x, y in barrier]
        try:
            return min(mas)
        except Exception as e:
            print(e)

    def find_enemy(self, enemyes):
        mi = 550
        mx = 0
        for enemy in enemyes:
            if enemy.x > mx: mx = enemyes.index(enemy)
            if enemy.x < mi: mi = enemyes.index(enemy)
        return (mx, mi)

    def run(self):
        bullets = []
        ship_bullets = []
        while self.isgame:
            pygame.time.delay(70)
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    self.isgame = False

            keys = pygame.key.get_pressed()

            self.win.fill((0, 0, 0))
            tmp = self.ship.action(keys)
            self.barrier_1.draw()
            self.barrier_2.draw()
            font = pygame.font.SysFont(None, 40)
            text = font.render(f"Score: {self.count}", True, (255, 255, 255))
            self.win.blit(text, (160, 10))
            i = 0
            for x in range(5, (23 + 5) * len(self.lifes), 28):
                self.win.blit(self.lifes[i], (x, 2))
                i += 1
            max_en, min_en = self.find_enemy(self.enemys)
            if self.enemys[max_en].x + 5 < 450 and self.moving_flag:
                for enemy in self.enemys:
                    tmp_2 = enemy.move(5)
                    if tmp_2 and len(bullets) < 30:
                        bullets.append(tmp_2)
            elif self.enemys[min_en].x - 5 > 10:
                for enemy in self.enemys:
                    tmp_2 = enemy.move(-5)
                    if tmp_2 and len(bullets) < 30:

                        bullets.append(tmp_2)
                self.moving_flag = False
            else:
                self.moving_flag = True
                for enemy in self.enemys:
                    tmp_2 = enemy.move(0)
                    if tmp_2 and len(bullets) < 30:
                        bullets.append(tmp_2)
            if tmp and len(bullets) < 15:
                bullets.append(tmp)

            for bullet in bullets:
                try:
                    bullets.index(bullet)
                except:
                    continue
                bullet.shot(bullet.x, bullet.y)
                matrix = [self.barrier_1.pixels, self.barrier_2.pixels]
                for pix in range(len(matrix[0])):
                    min_y_1 = self.get_min_y(matrix[0], matrix[0][pix][0])
                    min_y_2 = self.get_min_y(matrix[1], matrix[1][pix][0])
                    try:
                        bullets.index(bullet)
                    except:
                        continue
                    if matrix[0][pix][0] == bullet.x and bullet.y in range(
                            450, 550) and bullet.speed < 0:
                        try:
                            bullets.pop(bullets.index(bullet))
                            self.barrier_1.pixels[self.barrier_1.pixels.index(
                                (matrix[0][pix][0], min_y_1))] = (-10, 650)
                        except:
                            pass
                    elif matrix[1][pix][0] == bullet.x and bullet.y in range(
                            450, 550) and bullet.speed < 0:
                        try:
                            bullets.pop(bullets.index(bullet))
                            self.barrier_2.pixels[self.barrier_2.pixels.index(
                                (matrix[1][pix][0], min_y_1))] = (-10, 650)
                        except:
                            pass

                for enemy in self.enemys:
                    if bullet.x in range(enemy.x,
                                         enemy.x + 26) and bullet.y in range(
                                             enemy.y, enemy.y + 26):
                        try:
                            index = bullets.index(bullet)
                        except:
                            continue
                        if bullet.speed > 0:
                            enemy.hit()
                            if enemy.live <= 0:
                                self.enemys.pop(self.enemys.index(enemy))
                                self.count += 1
                            bullets.pop(bullets.index(bullet))

                if self.count == 18:
                    self.end()

                if bullet.x in range(self.ship.x,
                                     self.ship.x + 37) and bullet.y in range(
                                         self.ship.y, self.ship.y + 52):
                    try:
                        index = bullets.index(bullet)
                    except:
                        continue
                    tmp = self.ship.hit()
                    self.lifes.pop(-1)
                    bullets.pop(bullets.index(bullet))
                    if tmp == "game over":
                        self.end()

                if bullet.y < 600 and bullet.y > 0:
                    bullet.y -= bullet.speed
                else:
                    bullets.pop(bullets.index(bullet))

            pygame.display.update()

    def end(self):
        self.win.fill((0, 0, 0))
        font = pygame.font.SysFont(None, 40)
        text = font.render("GAME OVER", True, (255, 50, 50))
        self.win.blit(text, (160, 300))
        pygame.display.update()
        pygame.time.wait(2000)
        pygame.quit()
class Game:
    def __init__(self):
        pg.init()
        self.settings = Settings()
        self.screen = pg.display.set_mode(size=(self.settings.screen_width,
                                                self.settings.screen_height))
        pg.display.set_caption("Alien Invasion")
        ship_image = pg.image.load('images/ship.bmp')
        self.ship_height = ship_image.get_rect().height
        self.hs = 0

        self.sound = Sound(bg_music="sounds/crazy-space.wav")
        title = pg.image.load('images/title.bmp')
        # alein1 = pg.image.load('images/'alien00.bmp'')
        x = 200
        y = 150
        self.screen.blit(title, (x, y))
        ali0 = pg.image.load('images/ali00.png')

        x = 500
        y = 330
        self.screen.blit(ali0, (x, y))
        myfont = pg.font.SysFont("monospace", 25)
        label1 = myfont.render("=10 PTS", 1, (230, 230, 230))
        self.screen.blit(label1, (560, 340))

        ali1 = pg.image.load('images/ali10.png')

        x = 500
        y = 380
        self.screen.blit(ali1, (x, y))
        myfont = pg.font.SysFont("monospace", 25)
        label1 = myfont.render("=20 PTS", 1, (230, 230, 230))
        self.screen.blit(label1, (560, 390))

        ali2 = pg.image.load('images/ali20.png')

        x = 500
        y = 430
        self.screen.blit(ali2, (x, y))
        myfont = pg.font.SysFont("monospace", 25)
        label1 = myfont.render("=40 PTS", 1, (230, 230, 230))
        self.screen.blit(label1, (560, 440))
        ufo = pg.image.load('images/ufo00.png')

        x = 500
        y = 480
        self.screen.blit(ufo, (x, y))
        myfont = pg.font.SysFont("monospace", 25)
        label1 = myfont.render("=???", 1, (230, 230, 230))
        self.screen.blit(label1, (560, 490))
        self.sound.play()
        self.sound.pause_bg()
        self.play_button = self.aliens = self.stats = self.sb = self.ship = None

        self.restart()

    def play2(self):
        pg.init()
        self.settings = Settings()
        self.screen = pg.display.set_mode(size=(self.settings.screen_width,
                                                self.settings.screen_height))
        pg.display.set_caption("Alien Invasion")

        title = pg.image.load('images/title.bmp')
        # alein1 = pg.image.load('images/'alien00.bmp'')
        x = 200
        y = 150
        self.screen.blit(title, (x, y))
        ali0 = pg.image.load('images/ali00.png')

        x = 500
        y = 330
        self.screen.blit(ali0, (x, y))
        myfont = pg.font.SysFont("monospace", 25)
        label1 = myfont.render("=10 PTS", 1, (230, 230, 230))
        self.screen.blit(label1, (560, 340))

        ali1 = pg.image.load('images/ali10.png')

        x = 500
        y = 380
        self.screen.blit(ali1, (x, y))
        myfont = pg.font.SysFont("monospace", 25)
        label1 = myfont.render("=20 PTS", 1, (230, 230, 230))
        self.screen.blit(label1, (560, 390))

        ali2 = pg.image.load('images/ali20.png')

        x = 500
        y = 430
        self.screen.blit(ali2, (x, y))
        myfont = pg.font.SysFont("monospace", 25)
        label1 = myfont.render("=40 PTS", 1, (230, 230, 230))
        self.screen.blit(label1, (560, 440))
        ufo = pg.image.load('images/ufo00.png')

        x = 500
        y = 480
        self.screen.blit(ufo, (x, y))
        myfont = pg.font.SysFont("monospace", 25)
        label1 = myfont.render("=???", 1, (230, 230, 230))
        self.screen.blit(label1, (560, 490))
        self.hs = self.stats.high_score
        self.sound = Sound(bg_music="sounds/crazy-space.wav")
        self.sound.play()
        self.sound.pause_bg()
        self.restart()

    def restart(self):

        self.play_button = Button(settings=self.settings,
                                  screen=self.screen,
                                  msg="Play")
        self.hs_button = scorebutton(settings=self.settings,
                                     screen=self.screen,
                                     msg="HIGH SCORES")
        self.stats = GameStats(settings=self.settings)
        self.sb = Scoreboard(game=self, sound=self.sound)
        self.settings.init_dynamic_settings()
        self.barrier = Barrier(ship_height=self.ship_height, game=self)
        self.ufo = Ufos(ship_height=self.ship_height, game=self)
        self.aliens = Aliens(ship_height=self.ship_height, game=self)
        self.ship = Ship(aliens=self.aliens,
                         sound=self.sound,
                         game=self,
                         ufo=self.ufo)

        self.aliens.add_ship(ship=self.ship)

        self.stats.high_score = self.hs
        self.sb.prep_high_score()

    def scores(self):
        myfont = pg.font.SysFont("monospace", 60)
        label = myfont.render("HIGH SCORES", 1, (171, 130, 255))
        self.screen.blit(label, (420, 50))
        score_display = myfont.render(str(self.hs), 1, (171, 130, 255))
        self.screen.blit(score_display, (570, 150))

    def play(self):

        while True:

            gf.check_events(stats=self.stats,
                            play_button=self.play_button,
                            ship=self.ship,
                            sound=self.sound,
                            hs_button=self.hs_button)
            if self.stats.game_active:
                self.ship.update()
                self.aliens.update()
                self.ufo.update()
                self.barrier.update()

            if not self.stats.hs_active:
                self.hs_button.draw_button()
            else:
                self.screen.fill(self.settings.bg_color)
                self.scores()

            if not self.stats.game_active:
                self.play_button.draw()
                self.hs_button.draw_button()
                self.sound.pause_bg()
            else:
                if not self.sound.playing_bg: self.sound.unpause_bg()
                self.screen.fill(self.settings.bg_color)
                self.ship.draw()
                self.aliens.draw()
                self.sb.show_score()
                self.ufo.draw()
                self.barrier.draw()

            pg.display.flip()

    def reset(self):
        if self.stats.ships_left > 0:
            self.stats.ships_left -= 1
            self.sb.prep_ships()
            self.aliens.empty()
            self.aliens.create_fleet()
            self.ufo.empty()
            self.ufo.create_fleet()
            self.ship.center_ship()
            time.sleep(0.5)
            self.ship.timer = Ship.timer
        else:
            self.stats.game_active = False
            self.sound.pause_bg()
            self.hs = self.stats.high_score
            self.play2()
        with open("score.txt", 'a') as f:
            f.write(f'The high score was {self.hs}\n')