def main():
    b = Bird(230, 350)
    p = Pipe(550)
    s = Score()

    run = True
    while run:

        clock.tick(60)
        win.blit(bg, (0, 0))

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

        pressed = pygame.key.get_pressed()
        if pressed[pygame.K_SPACE]:
            b.jump()

        if p.collision(b):
            b.dead_bird()
            print("SCORE : " + str(s.count))
            break

        if p.cleared_pipe(b):
            p = Pipe(550)
            s.update_score()

        s.display_score(win)
        b.draw(win)
        p.draw(win)
        p.move()
        b.move()
        pygame.display.update()
Exemple #2
0
class FlappyScene(Scene):

    def __init__(self, screen, id=0):
        super().__init__(screen, id)
        self.highest_score = 0

    def load(self, flag, generation_number):
        
        self.backGround_1 = BackGround(self.screen, 0, 0, 0, 600, False)
        self.backGround_2 = BackGround(self.screen, 0, 0, 300, 600, False)
        self.backGround_1_inverted = BackGround(self.screen, 0, 0, 0, 0, True)
        self.backGround_2_inverted = BackGround(self.screen, 0, 0, 300, 0, True)
        self.landScape = LandScape(self.screen, 0, 0, 0, 0)
        self.frame_alive = 0
        self.birds_pool = []
        self.bird_score = []
        self.models_load = []
        self.load_nn = [] 
        self.population_size = 20
        self.generation_number = generation_number
        if flag:
            for idx in range(0, self.population_size):
                bird = Bird(self.screen, 300, 400, 300, 400)
                self.birds_pool.append(bird)
        else:
            for i in range(0, self.population_size):
                m = NeuralNetwork()
                self.load_nn.append(m)
                self.load_nn[i].get_model().load_weights("models/model" + str(i+1)+ ".keras")        
                bird = Bird(self.screen, 300, 400, 300, 400, self.load_nn[i])
                self.birds_pool.append(bird)


        y1 = random.randint(450, 500)
        y2 = random.randint(0, 100)
        
        self.pipe = Pipe(self.screen, 0, 0, 1200, y1, False)
        self.pipe_inverted = Pipe(self.screen, 0, 0, 1200, y2, True)
        self.landScape.load()
        self.backGround_1.load()
        self.backGround_2.load()
        self.backGround_1_inverted.load()
        self.backGround_2_inverted.load()
        
        self.nn = []
        for bird in self.birds_pool:
            bird.load()
        self.pipe.load()
        self.pipe_inverted.load()
        
        self.game_objects = [self.backGround_1, 
                                self.backGround_2, 
                                self.pipe, 
                                self.pipe_inverted,
                                self.backGround_1_inverted,
                                self.backGround_2_inverted] + self.birds_pool
        
        self.collision_handler = Collision(self.game_objects)
        
    def draw(self):
        self.landScape.draw()
        self.backGround_1.draw()
        self.backGround_2.draw()
        self.backGround_1_inverted.draw()
        self.backGround_2_inverted.draw()
        for bird in self.birds_pool:
            bird.draw()
        self.pipe.draw()
        self.pipe_inverted.draw()

    def update(self):
        if len(self.birds_pool) > 0:
            pipe_center = self.pipe.sprite.get_sprite_center()
            pipe_inverted_center = self.pipe_inverted.sprite.get_sprite_center()
            backgroud_1_center = self.backGround_1.sprite.get_sprite_center()
            background_2_center = self.backGround_2.sprite.get_sprite_center()
            backgroud_inverted_1_center = self.backGround_1_inverted.sprite.get_sprite_center()
            backgroud_inverted_2_center = self.backGround_2_inverted.sprite.get_sprite_center()
            
            self.backGround_1.update()
            self.backGround_2.update()
            self.backGround_2_inverted.update()
            self.backGround_1_inverted.update()
            self.landScape.update()    
            
            for bird in self.birds_pool:
                x, y = bird.get_position()
                bird.update([y, 
                            pipe_center[0] , 
                            pipe_center[1],
                            pipe_inverted_center[0],
                            pipe_inverted_center[1],
                            backgroud_1_center[0],
                            backgroud_1_center[1],
                            background_2_center[0],
                            background_2_center[1],
                            backgroud_inverted_1_center[0],
                            backgroud_inverted_1_center[1],
                            backgroud_inverted_2_center[0],
                            backgroud_inverted_2_center[1]
                            ])    
                bird_center = bird.sprite.get_sprite_center()
                line_pipe = Line(self.screen,  pipe_center[0], pipe_center[1], RED)
                line_pipe_inve = Line(self.screen, pipe_inverted_center[0], pipe_inverted_center[1], RED)
                line_backGround_1 = Line(self.screen, backgroud_1_center[0], backgroud_1_center[1], RED)
                line_backGround_2 = Line(self.screen, background_2_center[0], background_2_center[1], RED)

                line_backGround_inverted_1 = Line(self.screen, backgroud_inverted_1_center[0], backgroud_inverted_1_center[1], RED)
                line_backGround_inverted_2 = Line(self.screen, backgroud_inverted_2_center[0], backgroud_inverted_2_center[1], RED)

                line_pipe.draw((bird_center))
                line_pipe_inve.draw((bird_center))
                line_backGround_1.draw((bird_center))
                line_backGround_2.draw((bird_center))
                line_backGround_inverted_1.draw((bird_center))
                line_backGround_inverted_2.draw((bird_center))
                if (self.collision_handler.sprite_group_collide(self.backGround_1.group, bird.group)) or (self.collision_handler.sprite_group_collide(self.backGround_1_inverted.group, bird.group)) or (self.collision_handler.sprite_group_collide(self.backGround_2_inverted.group, bird.group)) or (self.collision_handler.sprite_group_collide(self.backGround_2.group, bird.group)) or (self.collision_handler.sprite_group_collide(bird.group, self.pipe.group)) or (self.collision_handler.sprite_group_collide(self.pipe_inverted.group, bird.group)):
                    self.nn.append(bird.get_neural_network())
                    self.bird_score.append(self.frame_alive)
                    self.birds_pool.remove(bird)
            
            self.pipe.update()
            self.pipe_inverted.update()

            y1 = random.randint(450, 500)
            y2 = random.randint(0, 100)
                
            if self.pipe.sprite.rect[0] < -self.pipe.sprite.rect[2]:
                del self.pipe
                self.pipe = Pipe(self.screen, 0, 0, 600, y1, False)
                self.pipe.load()

            if self.pipe_inverted.sprite.rect[0] < -self.pipe_inverted.sprite.rect[2]:
                del self.pipe_inverted
                self.pipe_inverted = Pipe(self.screen, 0, 0, 600, y2, True)
                self.pipe_inverted.load()
            self.frame_alive +=1
        else:
            new_birds = []
            self.geneticAlgorithmFlappy = GeneticAlgorithmFlappy(self.nn)
            self.geneticAlgorithmFlappy.template(self.bird_score)
            for idx in range(0, int(self.population_size/2)):
                bird = Bird(self.screen, 300, 400, 300, 400)
                new_birds.append(bird)
            self.geneticAlgorithmFlappy.new_population(new_birds)
            self.geneticAlgorithmFlappy.save()
            if self.highest_score < max(self.bird_score):
                self.highest_score = max(self.bird_score)
            raise BirdException
        
        
        font = pygame.font.Font('freesansbold.ttf', 11) 
        message = "Geração = " + str(self.generation_number) + " "\
                  "Quantidade de individuos vivos = " + str(len(self.birds_pool)) + " "  \
                  "Maior quantidade de frames vivos = " + str(self.highest_score) 
        text = font.render(message, True, (0, 0, 0))
        self.screen.blit(text, (25, 25))