Esempio n. 1
0
class Jogo:
    def __init__(self, qtd_inimigos=3, width=WIDTH, height=HEIGHT):
        pygame.init()
        self.display = Display(width=WIDTH, height=HEIGHT)
        self.clock = pygame.time.Clock()
        self.jogador = BlocoPrincipal(self.display, width=width, height=height)
        self.qtd_inimigos = qtd_inimigos
        self.enemys = []
        self.score = 0

    def _check_event(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return True
            elif event.type == pygame.KEYDOWN:
                self.jogador.move(event.key)
        return False

    def init(self, color_fill=GREY):
        fechou = False
        self._create_neural_network()
        while not fechou:
            self.display.fill(color_fill)
            self._create_enemy()
            self._enemys_fall()
            self._check_fall_enemy()
            fechou = self._check_colision() or fechou
            fechou = self._check_event() or fechou
            self.jogador.set_bloco()
            self.display.write_score(self.score)
            self._get_move_rna()
            self.display.update()
            self.clock.tick(60)

        pygame.quit()

    def _create_enemy(self, qtd=None, width=WIDTH, height=HEIGHT):

        qtd = qtd or self.qtd_inimigos

        while len(self.enemys) < qtd:
            x = randint(0, WIDTH - WIDTH_BLOCO)
            self.enemys.append(
                BlocoInimigo(x=x,
                             speed=random() * 10,
                             display=self.display,
                             width=width,
                             height=height))

    def _enemys_fall(self):
        [self.enemys[i].fall() for i in range(len(self.enemys))]

    def _check_fall_enemy(self):
        for idx, enemy in enumerate(self.enemys):
            if enemy.y >= (HEIGHT + HEIGHT_BLOCO):
                del self.enemys[idx]
                self.score += 1
                self._create_enemy()

    def _check_colision(self):
        for enemy in self.enemys:
            if enemy.y >= HEIGHT - HEIGHT_BLOCO:
                x = enemy.x
                x_high = x + (HEIGHT_BLOCO)
                x_low = x - (HEIGHT_BLOCO)
                if x_low <= self.jogador.x <= x_high:
                    return True
        return False

    def _create_neural_network(self, qtd_camadas=2):
        self.rede = Rede(1 + (self.qtd_inimigos * 3))
        [self.rede.add_camada(10) for i in range(qtd_camadas)]
        self.rede.add_camada(3)

    def _get_move_rna(self):
        inputs = self._get_inputs()
        print(inputs)
        predicts = self.rede.predict(inputs)
        max_predict = max(predicts)
        if max_predict == predicts[0]:
            self.jogador._move_left()
        if max_predict == predicts[1]:
            self.jogador._move_right()
        if max_predict == predicts[2]:
            pass

    def _get_inputs(self):
        inputs = []
        inputs += [min_max_scaler(0, WIDTH, enemy.x) for enemy in self.enemys]
        inputs += [min_max_scaler(0, HEIGHT, enemy.y) for enemy in self.enemys]
        inputs += [min_max_scaler(0, 10, enemy.speed) for enemy in self.enemys]
        inputs += [min_max_scaler(0, WIDTH, self.jogador.x)]
        return inputs
Esempio n. 2
0
    def cria_redes(self):
        qtd_inputs = 1 + (self.qtd_inimigos * 3)
        rede = Rede(base)
        rede.add_camada(5)
        rede.add_camada(3)

        base = rede.sum_shapes

        lim_inf = [-2 for i in range(base)]
        lim_sup = [2 for i in range(base)]
        base = [10 for i in range(base)]

        p1 = Populacao(10, base, lim_inf, lim_sup, prob_mutacao=1)
        p1.gera_populacao_inicial()

        np.array(rede.camadas[0]).reshape(rede.shapes[0])

        aux = 0
        ind = p1[0].real
        ind2 = p1[1].real
        camadas = []
        camadas2 = []

        for idx, prod in enumerate(rede.prod_shapes):
            camadas.append(
                np.array(ind[aux:aux + prod]).reshape(rede.shapes[idx]))
            camadas2.append(
                np.array(ind2[aux:aux + prod]).reshape(rede.shapes[idx]))
            aux += prod

        np.append(camadas[0][:, 1].reshape(-1, 1),
                  camadas2[0][:, 2].reshape(-1, 1),
                  axis=1)

        novas_camadas = []
        for i in range(len(camadas)):
            camada1 = camadas[i]
            camada2 = camadas2[i]
            nova_camada = []
            for j in range(camada1.shape[1]):
                neuronio1 = np.array(camada1[:, j]).reshape(-1, 1)
                neuronio2 = np.array(camada2[:, j]).reshape(-1, 1)
                if random() < 0.5:
                    if len(nova_camada) == 0:
                        nova_camada = neuronio1
                    else:
                        nova_camada = np.append(nova_camada, neuronio1, axis=1)
                else:
                    if len(nova_camada) == 0:
                        nova_camada = neuronio2
                    else:
                        nova_camada = np.append(nova_camada, neuronio2, axis=1)
            novas_camadas.append(nova_camada)
            print('''
        Camada1:
        {}

        Camada2:
        {}

        Nova Camada:
        {}      
            '''.format(camada1, camada2, nova_camada))