Exemple #1
0
 def __init__(self, number, game, isHuman=False, score=0):
     """
     Constructeur : Definit les caracteristiques du joueur IA
     isHuman : bool définit si le joueur est humain ou non
     clock   : float, temps de jeu courant du joueur
     score   : int, score du joueur
     number  : int, numero du joueur IA (0 ou 1)
     moves   : array de couples désigne les coups du joueur (lgn, col)
     """
     super().__init__(number, game, isHuman=False, score=score)
     self.quality = Quality(2, self.game, self)
Exemple #2
0
 def __init__(self, number, game, isHuman = False,score = 0):
     """
     Constructeur : Definit les caracteristiques du joueur IA
     isHuman : bool définit si le joueur est humain ou non
     clock   : float, temps de jeu courant du joueur
     score   : int, score du joueur
     number  : int, numero du joueur IA (0 ou 1)
     moves   : array de couples désigne les coups du joueur (lgn, col)
     """
     super().__init__(number, game, isHuman = False, score = score)
     self.quality = Quality(1, self.game, self)
Exemple #3
0
class Minimax2(Joueur):
    """ Modélise les caractéristiques du joueur IA Minimax2 """
    def __init__(self, number, game, isHuman=False, score=0):
        """
        Constructeur : Definit les caracteristiques du joueur IA
        isHuman : bool définit si le joueur est humain ou non
        clock   : float, temps de jeu courant du joueur
        score   : int, score du joueur
        number  : int, numero du joueur IA (0 ou 1)
        moves   : array de couples désigne les coups du joueur (lgn, col)
        """
        super().__init__(number, game, isHuman=False, score=score)
        self.quality = Quality(2, self.game, self)

    def copie_liste(self, L):
        n = len(L)
        rep = []
        for k in range(n):
            rep.append(L[k])

        return rep

    def choose_move_aleat(self):
        """
        Determine le mouvement de l'IA jusqu'à
        obtenir un coup possible
        
        return: les coordonnées entrées (col, lgn)
        """
        coord = "pass"
        for i in range(10000):  #on teste aléatoirement 10000 fois
            col = random.randint(0, self.game.goban.taille - 1)
            lgn = random.randint(0, self.game.goban.taille - 1)
            try:
                if self.game.goban.test_move(col, lgn, self) == False:
                    coord = (col, lgn)
                    sys.stdout.flush()
                    return coord
            except Forbidden_move as e:
                pass

        for col in range(self.game.goban.taille):
            for lgn in range(self.game.goban.taille):
                try:
                    if not self.game.goban.test_move(col, lgn, self) == False:
                        coord = (col, lgn)
                        return coord
                except:
                    pass

        return coord

    def copie_goban(self):
        """
        Fonction qui copie le goban actuel dans un goban a part
        """
        new_goban = []
        for old_lines in self.game.goban.cell:
            new_goban.append(list(old_lines))
        return (new_goban)

    def copie_bogan_ajout(self, emplacement):
        """
        Fonction qui copie le goban actuel et y insère une pierre
        """
        new_goban = self.copie_goban()
        new_goban[emplacement[0]][emplacement[1]] = self.number
        return (new_goban)

    def liste_coups_possibles(self):  # etape 1
        """
        Fonction qui renvoie la liste des coups possibles du goban
        """

        # On récupère toutes les cases vides
        coord_none = [(i, j) for i in range(self.game.goban.taille)
                      for j in range(self.game.goban.taille)
                      if self.game.goban.cell[i][j] == None]

        possible_moves = []

        for (i, j) in coord_none:
            try:
                if self.game.goban.test_move(i, j, self) == False:
                    possible_moves.append((i, j))
            except:
                pass

        return possible_moves

    def liste_importances_coups_possibles(self):  #etape  2
        """
        Fonction qui renvoie la liste des importances des coups possibles
        """
        L = self.liste_coups_possibles()
        #print(L)
        Res = [0 for i in range(len(L))]
        for i in range(len(L)):
            Res[i] += self.quality.importance(L[i][1], L[i][0])
        #print(Res)
        return Res

    def etape_3(self):
        """
        Fonction qui réalise l'étape 3
        """
        L = self.liste_coups_possibles()
        Liste_Gobans = []
        for element in L:
            Liste_Gobans.append(self.copie_bogan_ajout(element))
        return Liste_Gobans

    def etape_4_5(self, Liste_Gobans):
        """
        Fonction qui réalise les étapes 4 et 5
        La liste des gobans en paramètre est calculée à partir de la fonction
        étape_3
        """
        #copie du goban actuel"
        Liste_Goban_Actu = [
            self.copie_goban() for k in range(len(Liste_Gobans))
        ]
        Liste_Aux = self.copie_liste(self.game.goban.cell)  #DEBUG

        for k in range(len(Liste_Goban_Actu)):

            #le goban prend les valeurs des gobans possibles"
            self.game.goban.cell = Liste_Goban_Actu[k]

            #on choisit le coup du goban virtuel
            ia = IA_level1((1 + self.number) % 2, self.game)
            ia.game.goban = self.game.goban
            coup = ia.choose_move()

            #on ajoute ce coup au Bogan de la liste
            Liste_Gobans[k] = self.copie_bogan_ajout(coup)

            #on rend sa valeur initial au goban
            self.game.goban.cell = Liste_Aux

        return Liste_Gobans

    def etape_6(self, Liste_Gobans, Liste_Importances):
        """
        Fonction qui réalise l'étape 6
        """
        #Liste_Aux = [self.copie_goban()for k in range(len(Liste_Importances))] DEBUG
        Liste_Aux = self.copie_liste(self.game.goban.cell)
        imp = 0

        for k in range(len(Liste_Gobans)):

            self.game.goban.cell = Liste_Gobans[k]

            ia = IA_level1((1 + self.number) % 2, self.game)
            ia.game.goban = self.game.goban
            coup = ia.choose_move()
            #print(coup)
            imp = self.quality.importance(coup[1], coup[0])
            #print(imp)
            Liste_Importances[k] += imp

            self.game.goban.cell = Liste_Aux

            imp = 0

        return Liste_Importances

    def etape_7(self, Liste_Importances):
        """
        Fonction qui réalise l'étape 7
        """

        k = 0
        imp_max = 0
        for i in range(len(Liste_Importances)):
            if Liste_Importances[i] > imp_max:
                imp_max = Liste_Importances[i]
                k = i
        return k

    def etape_8(self, indice, liste_initiale):
        return (liste_initiale[indice])

    def choose_move(self):
        """
        Renvoie le coup choisi à partir de l'algorithme du minimax pour n=2
        """

        n = self.game.goban.taille
        lgn, col = 0, 0
        imp_tmp = 0
        num = 0
        L = self.quality.fuseki(num)
        Liste = []
        coord_none = [(i, j) for i in range(n) for j in range(n)
                      if self.game.goban.cell[i][j] == None]

        for i in range(len(L)):
            try:
                self.game.goban.test_move(L[i][1], L[i][0], self)
                return L[i][1], L[i][0]

            except Forbidden_move as e:
                pass

        #etape 1
        Liste_Initiale = self.liste_coups_possibles()
        if Liste_Initiale != []:
            #etape 2 :
            Liste_Importances = self.liste_importances_coups_possibles()
            #etape 3 :
            Liste_Gobans = self.etape_3()
            #etape 4_5 :
            Liste_Gobans2 = self.etape_4_5(Liste_Gobans)
            #etape 6 :
            Liste_Importances2 = self.etape_6(Liste_Gobans2, Liste_Importances)
            #etape 7_8 :
            #print(Liste_Importances)
            #print(Liste_Importances2)
            return (self.etape_8(self.etape_7(Liste_Importances2),
                                 Liste_Initiale))

        else:
            return 'pass'
Exemple #4
0
class IA_level1(Joueur):
    """ Modélise les caractéristiques du joueur IA level1 """

    def __init__(self, number, game, isHuman = False,score = 0):
        """
        Constructeur : Definit les caracteristiques du joueur IA
        isHuman : bool définit si le joueur est humain ou non
        clock   : float, temps de jeu courant du joueur
        score   : int, score du joueur
        number  : int, numero du joueur IA (0 ou 1)
        moves   : array de couples désigne les coups du joueur (lgn, col)
        """
        super().__init__(number, game, isHuman = False, score = score)
        self.quality = Quality(1, self.game, self)

   

    def choose_move(self):
        """
        Détermine la qualité du coup proposé selon les critères suivants:
        -> le coup est-t-il jouable ?
        -> le coup est-il bon pour capturer l'adversaire
        -> si oui, combien de cases ?
        -> suicide ? etc ..
        """
        # je met la valeur de taille en memoire (gain de complexité)
        n = self.game.goban.taille
        # j'initialise des valeurs de lignes et colonnes
        lgn, col = 0, 0
        # j'initialise mon importance maximale
        imp_tmp  = 0
        # num correspond à la solution choisi pour le debut de partie (cf Quality -> Fuseki (num) )
        num = 0
        # je calcule ma liste des coups de debut de partie
        L = self.quality.fuseki(num)
        
        # Debut de partie
        # tant que L n'est pas vide , si le coup est jouable, je le joue
        for (i, j) in L:
            try: 
                print(self.game.goban.test_move(j, i, self))
                return j, i

            except Forbidden_move as e:
                pass

        # je cree une liste des coups non joués
        coord_none = [(i, j) for i in range(n) for j in range(n) if self.game.goban.cell[i][j] == None]
        coup = "pass"
        
        # sinon, je parcours l'ensemble des coups non joués   
        for (i,j) in coord_none :
            importance = self.quality.importance(j, i)
            #print("importance", importance)
            if (importance > imp_tmp): # si le coup est le plus important on le choisit seul
                coup = (j, i)
                imp_tmp = importance
            #try: 
            #    if self.game.goban.test_move(j, i, self) == False:
            #        importance = self.quality.importance(j, i)
            #        if (importance > imp_tmp): # si le coup est le plus important on le choisit seul
            #            coup = (i,j)
            #            imp_tmp = importance
            #except Forbidden_move as e:
            #    pass

        #if imp_tmp != 0:
        #    print("coord 1", coup)
        #    return coup
        return coup
Exemple #5
0
class IA_level1(Joueur):
    """ Modélise les caractéristiques du joueur IA level1 """

    def __init__(self, number, game, isHuman = False,score = 0):
        """
        Constructeur : Definit les caracteristiques du joueur IA
        isHuman : bool définit si le joueur est humain ou non
        clock   : float, temps de jeu courant du joueur
        score   : int, score du joueur
        number  : int, numero du joueur IA (0 ou 1)
        moves   : array de couples désigne les coups du joueur (lgn, col)
        """
        super().__init__(number, game, isHuman = False, score = score)
        self.quality = Quality(1, self.game, self)

   

    def choose_move(self):
        """
        Détermine la qualité du coup proposé selon les critères suivants:
        -> le coup est-t-il jouable ?
        -> le coup est-il bon pour capturer l'adversaire
        -> si oui, combien de cases ?
        -> suicide ? etc ..
        """
        # je met la valeur de taille en memoire (gain de complexité)
        n = self.game.goban.taille
        # j'initialise des valeurs de lignes et colonnes
        lgn, col = 0, 0
        # j'initialise mon importance maximale
        imp_tmp  = 0
        # num correspond à la solution choisi pour le debut de partie (cf Quality -> Fuseki (num) )
        num = 0
        # je calcule ma liste des coups de debut de partie
        L = self.quality.fuseki(num)
        
        # Debut de partie
        # tant que L n'est pas vide , si le coup est jouable, je le joue
        for (i, j) in L:
            try: 
                print(self.game.goban.test_move(j, i, self))
                return j, i

            except Forbidden_move as e:
                pass

        # je cree une liste des coups non joués
        coord_none = [(i, j) for i in range(n) for j in range(n) if self.game.goban.cell[i][j] == None]
        coup = "pass"
        
        # sinon, je parcours l'ensemble des coups non joués   
        for (i,j) in coord_none :
            importance = self.quality.importance(j, i)
            #print("importance", importance)
            if (importance > imp_tmp): # si le coup est le plus important on le choisit seul
                coup = (j, i)
                imp_tmp = importance
            #try: 
            #    if self.game.goban.test_move(j, i, self) == False:
            #        importance = self.quality.importance(j, i)
            #        if (importance > imp_tmp): # si le coup est le plus important on le choisit seul
            #            coup = (i,j)
            #            imp_tmp = importance
            #except Forbidden_move as e:
            #    pass

        #if imp_tmp != 0:
        #    print("coord 1", coup)
        #    return coup
        return coup
        
        #si aucun coup n'est jouable je lance le programme IA_random
        #else :
        #    coord = "pass"
        #    for index in range(10000):                #on teste aléatoirement 10000 fois 
        #        col = random.randint(0, self.game.goban.taille - 1)
        #        lgn = random.randint(0, self.game.goban.taille - 1)
        #        try: 
        #            if self.game.goban.test_move(col, lgn, self) == False:
        #                coord = (col, lgn)
        #                print("coord 2", coord)
        #                return coord
        #        except Forbidden_move as e:
        #            pass

        #    for col in range(self.game.goban.taille):
        #        for lgn in range(self.game.goban.taille):
        #            try: 
        #                if not self.game.goban.test_move(col, lgn, self) == False:
        #                    coord = (col, lgn)
        #                    print("coord 3", coord)
        #                    return coord
        #            except:
        #                pass
        #    print("coord 4", coord)
        #    return coord
            
Exemple #6
0
class Minimax2(Joueur):
    """ Modélise les caractéristiques du joueur IA Minimax2 """

    def __init__(self, number, game, isHuman = False, score = 0):
        """
        Constructeur : Definit les caracteristiques du joueur IA
        isHuman : bool définit si le joueur est humain ou non
        clock   : float, temps de jeu courant du joueur
        score   : int, score du joueur
        number  : int, numero du joueur IA (0 ou 1)
        moves   : array de couples désigne les coups du joueur (lgn, col)
        """
        super().__init__(number, game, isHuman = False, score = score)
        self.quality = Quality(2, self.game, self)


    def copie_liste(self,L):
        n = len(L)
        rep = []
        for k in range (n):
            rep.append(L[k])
            
        return rep

    
    def choose_move_aleat(self):
        """
        Determine le mouvement de l'IA jusqu'à
        obtenir un coup possible
        
        return: les coordonnées entrées (col, lgn)
        """
        coord = "pass"
        for i in range(10000):                #on teste aléatoirement 10000 fois 
            col = random.randint(0, self.game.goban.taille - 1)
            lgn = random.randint(0, self.game.goban.taille - 1)
            try: 
                if self.game.goban.test_move(col, lgn, self) == False:
                    coord = (col, lgn)
                    sys.stdout.flush()
                    return coord
            except Forbidden_move as e:
                pass

        for col in range(self.game.goban.taille):
            for lgn in range(self.game.goban.taille):
                try: 
                    if not self.game.goban.test_move(col, lgn, self) == False:
                        coord = (col, lgn)
                        return coord
                except:
                    pass

        return coord

    def copie_goban(self):
        """
        Fonction qui copie le goban actuel dans un goban a part
        """
        new_goban = []
        for old_lines in self.game.goban.cell:
            new_goban.append(list(old_lines))
        return(new_goban)


    def copie_bogan_ajout(self,emplacement):
        """
        Fonction qui copie le goban actuel et y insère une pierre
        """
        new_goban = self.copie_goban()
        new_goban[emplacement[0]][emplacement[1]]= self.number
        return(new_goban)

    def liste_coups_possibles(self):             # etape 1
        """
        Fonction qui renvoie la liste des coups possibles du goban
        """

        # On récupère toutes les cases vides
        coord_none = [(i, j) for i in range(self.game.goban.taille) for j in range(self.game.goban.taille) if self.game.goban.cell[i][j] == None]

        possible_moves = []

        for (i, j) in coord_none:
            try:
                if self.game.goban.test_move(i, j, self) == False:
                    possible_moves.append((i, j))
            except:
                pass

        return possible_moves

    def liste_importances_coups_possibles(self):    #etape  2
        """
        Fonction qui renvoie la liste des importances des coups possibles
        """
        L = self.liste_coups_possibles()
        #print(L)
        Res = [0 for i in range(len(L))]
        for i in range(len(L)) :
            Res[i]+=self.quality.importance(L[i][1],L[i][0])
        #print(Res)
        return Res

    def etape_3 (self):
        """
        Fonction qui réalise l'étape 3
        """
        L = self.liste_coups_possibles()
        Liste_Gobans = []
        for element in L:
            Liste_Gobans.append(self.copie_bogan_ajout(element))
        return Liste_Gobans

                

    def etape_4_5 (self, Liste_Gobans):
        """
        Fonction qui réalise les étapes 4 et 5
        La liste des gobans en paramètre est calculée à partir de la fonction
        étape_3
        """
        #copie du goban actuel"
        Liste_Goban_Actu = [self.copie_goban() for k in range(len(Liste_Gobans))]
        Liste_Aux = self.copie_liste(self.game.goban.cell) #DEBUG

        for k in range(len(Liste_Goban_Actu)) :
                        
            #le goban prend les valeurs des gobans possibles"
            self.game.goban.cell = Liste_Goban_Actu[k]
            
            #on choisit le coup du goban virtuel
            ia = IA_level1((1+self.number)%2,self.game)
            ia.game.goban = self.game.goban
            coup = ia.choose_move()
            
            #on ajoute ce coup au Bogan de la liste
            Liste_Gobans[k] = self.copie_bogan_ajout(coup)
            
            #on rend sa valeur initial au goban
            self.game.goban.cell = Liste_Aux
            
        return Liste_Gobans
             
    def etape_6 (self, Liste_Gobans, Liste_Importances):
        """
        Fonction qui réalise l'étape 6
        """
        #Liste_Aux = [self.copie_goban()for k in range(len(Liste_Importances))] DEBUG
        Liste_Aux = self.copie_liste(self.game.goban.cell)
        imp = 0
                
        for k in range (len(Liste_Gobans)):
            
            self.game.goban.cell = Liste_Gobans[k]
            
            ia = IA_level1((1+self.number)%2,self.game)
            ia.game.goban = self.game.goban
            coup = ia.choose_move()
            #print(coup)
            imp = self.quality.importance(coup[1],coup[0])
            #print(imp)
            Liste_Importances[k] += imp
            
            self.game.goban.cell = Liste_Aux
            
            imp = 0
            
        return Liste_Importances

    def etape_7 (self, Liste_Importances):
        """
        Fonction qui réalise l'étape 7
        """
        
        k = 0
        imp_max = 0
        for i in range(len(Liste_Importances)):
            if Liste_Importances[i]> imp_max :
                imp_max = Liste_Importances[i]
                k = i
        return k
    

    def etape_8 (self, indice, liste_initiale):
        return(liste_initiale[indice])

    

    def choose_move(self):
        """
        Renvoie le coup choisi à partir de l'algorithme du minimax pour n=2
        """

        n = self.game.goban.taille
        lgn, col = 0, 0
        imp_tmp  = 0
        num = 0
        L = self.quality.fuseki(num)
        Liste = []
        coord_none = [(i, j) for i in range(n) for j in range(n) if self.game.goban.cell[i][j] == None]
        
        for i in range (len(L)) :
            try:
                self.game.goban.test_move(L[i][1],L[i][0],self)
                return L[i][1],L[i][0]

            except Forbidden_move as e:
                pass
            
        
        #etape 1
        Liste_Initiale = self.liste_coups_possibles()        
        if Liste_Initiale != [] :
            #etape 2 :
            Liste_Importances = self.liste_importances_coups_possibles()
            #etape 3 :
            Liste_Gobans = self.etape_3()
            #etape 4_5 :
            Liste_Gobans2 = self.etape_4_5(Liste_Gobans)
            #etape 6 :
            Liste_Importances2 = self.etape_6(Liste_Gobans2 , Liste_Importances)
            #etape 7_8 :
            #print(Liste_Importances)
            #print(Liste_Importances2)
            return(self.etape_8(self.etape_7(Liste_Importances2),Liste_Initiale))
        
        else:
            return 'pass'