# -*- coding: utf-8 -*- # nom : cat_loiac_ppc.py, Intelligence Artificielle pour le jeu du pierre papier ciseaux # Version compacte (basé sur la version 1.0.0) # Copyright (C) 2007 Loïc Chardonnet # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . from random import randint # On importe la fonction pseudo aléatoire randint(). aleatoire = 0 normal = 1 def play(debut=0): global normal, aleatoire # C'est le choix de l'élément de l'I.A. # ch_ia_ppc est une fonction qui prend en argument 2 paramètres, dont 1 facultatif : # L'élément que le joueur a choisi (1, 2 ou 3) ; # si la partie vient de commencer (1) ou pas (0). C'est cet argument qui est facultatif # (debut vaudra 0 par défaut). # Par convention : 1 = Pierre, 2 = Papier et 3 = Ciseaux. De plus perdre = -2 points, gagner = # +2 points et égalité = +1 point. Ensuite, debut = 1 : c'est le début de la partie et debut = 0 : # ce n'est pas le début de la partie. # Premièrement on test la validité de l'argument debut. Rappel : ce doit être un entier # compris entre 0 et 1 tout deux inclus. try: int(debut) # On regarde si debut est bien un entier. except: # Si c'est pas un entier, on signale l'erreur et on fait comme si ce n'était pas le début. print "Erreur 3 debut\ndebut = ", debut debut = 0 else: # Sinon, c'est bien un entier et on vérifie son contenu. int(debut) # On le passe en entier dans le cas ou l'entrée serait "1" et pas 1 par # exemple. if debut != 0 and debut != 1: # Si ce n'est ni le début (1) ni pas le début (0) alors on signale l'erreur et fait comme si # ce n'était pas le début. print "Erreur 4 debut\ndebut = ", debut debut = 0 # Et troisièmement on test l'existence du fichier ia_ppc_memoire.txt. # Il contient tous les élements statistiques nécessaires à l'I.A. try: test = open('ia_ppc_memoire1c.txt', 'r') # On teste l'ouverture du fichier. except: # Si ça ne marche pas, le fichier n'existe pas, donc on le crée. creation = open('ia_ppc_memoire1c.txt', 'w') # On ouvre le fichier en mode écriture, ce qui le # crée. # Contenu du fichier : # l1 : description. l5 : nb_pi_debut. l9 : nb_gagne. # l2 : nb_pierre. l6 : nb_pa_debut. l10 : nb_perdu. # l3 : nb_papier. l7 : nb_c_debut. l11 : nb_egalite. # l4 : nb_ciseaux. l8 : dernier_gagne. l12 : nb_utilisation. creation.write("Ce fichier contient les parametres statistiques necessaires au bon "+ "fonctionnement de l'intelligence artificielle.") # Ecriture de la premiere ligne : la # description. creation.write("\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0") # Ecriture des 11 autres lignes. # Enfin, on ferme le fichier et on l'ouvre en mode lecture. creation.close() memoire = open('ia_ppc_memoire1c.txt', 'r') else: # Sinon, on peut l'ouvrir en mode lecture. memoire = open('ia_ppc_memoire1c.txt', 'r') # Initialisation des variables. liste_memoire = memoire.readlines() # On crée la liste qui contient tout. descriptif = liste_memoire[0] # Le descriptif du fichier. nb_pierre = int(liste_memoire[1]) # Le nombre total de Pierre utilisées. nb_papier = int(liste_memoire[2]) # Le nombre total de Papier utilisés. nb_ciseaux = int(liste_memoire[3]) # Le nombre total de Ciseaux utilisés. nb_pi_debut = int(liste_memoire[4]) # Le nombre de Pierre utilisées en début de partie. nb_pa_debut = int(liste_memoire[5]) # Le nombre de Papier utilisés en début de partie. nb_c_debut = int(liste_memoire[6]) # Le nombre de Ciseaux utilisés en début de partie. dernier_gagne = int(liste_memoire[7]) # L'élément vainqueur au dernier tour. nb_gagne = int(liste_memoire[8]) # Nombre de fois que l'I.A. a gagné un tour. nb_perdu = int(liste_memoire[9]) # Nombre de fois que l'I.A. a perdu un tour. nb_egalite = int(liste_memoire[10]) # Nombre de fois qu'il y a eu égalité. nb_utilisation = int(liste_memoire[11]) # Nombre de fois que l'I.A. a été utilisée. # Les 4 dernières variables permettent de donner une note à l'I.A. afin de vérifier son efficacité. # La lecture faite et mémorisée, on peut fermer le fichier. memoire.close() # Choix de l'I.A. if (debut == 1 and (nb_pi_debut > nb_pa_debut and nb_pi_debut > nb_c_debut) or ( nb_pi_debut == nb_pa_debut and nb_pi_debut > nb_c_debut)) or (debut == 0 and ( nb_pierre > nb_papier and nb_pierre > nb_ciseaux) or ( nb_pierre == nb_papier and nb_pierre > nb_ciseaux)): # Si Pierre a été le plus utilisé ou si Pierre et Papier sont égaux et supérieurs à Ciseaux. ordi = 2 # Alors l'I.A. choisie Papier car le joueur a plus de chances de choisir Pierre # (ou Papier), comme il a l'air de faire d'habitude. elif (debut == 1 and (nb_pa_debut > nb_pi_debut and nb_pa_debut > nb_c_debut) or ( nb_pa_debut == nb_c_debut and nb_pa_debut > nb_pi_debut)) or (debut == 0 and ( nb_papier> nb_pierre and nb_papier > nb_ciseaux) or ( nb_papier == nb_ciseaux and nb_papier > nb_pierre)): # Sinon si c'est Papier ou si Papier et Ciseaux sont égaux et supérieurs à Pierre. ordi = 3 # Alors l'I.A. choisie Ciseaux car le joueur a plus de chance de choisir Papier # (ou Ciseaux), comme il a l'air d'avoir l'habitude. elif (debut == 1 and (nb_c_debut > nb_pi_debut and nb_c_debut > nb_pa_debut) or ( nb_c_debut == nb_pi_debut and nb_c_debut > nb_pa_debut)) or (debut == 0 and ( nb_ciseaux > nb_pierre and nb_ciseaux > nb_papier) or ( nb_ciseaux == nb_pierre and nb_ciseaux > nb_papier)): # Sinon si c'est Ciseaux ou si Ciseaux et Pierre sont égaux et supérieurs à Papier. ordi = 1 # Alors l'I.A. choisie Pierre car le joueur a plus de chance de choisir Ciseaux # (ou Pierre), comme il a l'air d'avoir l'habitude. elif (nb_pi_debut == nb_pa_debut and nb_pi_debut == nb_c_debut) or ( nb_pierre == nb_papier and nb_pierre == nb_ciseaux): # Sinon si tout a été utilisé le même nombre de fois. if debut == 0: # Si on n'est pas en début de partie. if dernier_gagne == 1 or dernier_gagne == 2: # Si la dernière fois qu'il a gagné, le joueur a gagné avec Pierre ou Papier. ordi = dernier_gagne + 1 # Alors on choisit l'élément supérieur. elif dernier_gagne == 3: # Sinon si c'est avec Ciseaux. ordi = 1 # Alors l'I.A. choisie Pierre. elif dernier_gagne == 0: # Sinon, si la dernière fois le joueur n'a pas gagné. aleatoire += 1 ordi= randint(1,3) # Alors l'I.A. choisie un élément au hasard. elif debut == 1: # Sinon si on est en début de partie. aleatoire += 1 ordi = randint(1,3) # Alors l'I.A. choisie un élément au hasard. normal += 1 print "Sur %d coups, %d aléatoires" % (normal, aleatoire) return ordi # On retourne le choix de l'I.A. def resultat(ch_joueur, ordi, debut=0): # On détermine qui a pris quoi et on donne le résultat. # det_ia_ppc est une fonction qui prend en argument 2 paramètres, dont 1 facultatif : # L'élément que le joueur a choisi (1, 2 ou 3) ; # si la partie vient de commencer (1) ou pas (0). C'est cet argument qui est facultatif # (debut vaudra 0 par défaut). # Par convention : 1 = Pierre, 2 = Papier et 3 = Ciseaux. De plus perdre = -2 points, gagner = # +2 points et égalité = +1 point. Ensuite, debut = 1 : c'est le début de la partie et debut = 0 : # ce n'est pas le début de la partie. # Premièrement, on test la validité de l'argument ch_joueur. Rappel : ce doit être un entier # Compris entre 1 et 3 tout deux inclus. try: int(ch_joueur) # On regarde si ch_joueur est un entier. except: # Si c'est pas un entier, on signale l'erreur et on choisi aléatoirement un élément. print "Erreur 1 ch_joueur\nch_joueur = ", ch_joueur print "aleatoire" ch_joueur = randint(1,3) else: # Sinon, c'est bien un entier et on vérifie son contenu. int(ch_joueur) # On le passe en entier dans le cas ou l'entrée serait "1" et pas 1 par # exemple. if ch_joueur != 1 and ch_joueur != 2 and ch_joueur != 3: # Si le choix n'est ni 1, 2 ou 3 alors on signale l'erreur et on choisi aléatoirement un # élément. print "Erreur 2 ch_joueur\nch_joueur = ", ch_joueur print "aleatoire" ch_joueur = randint(1,3) # Deuxièmement, on test la validité de l'argument ordi. Rappel : ce doit être un entier # Compris entre 1 et 3 tout deux inclus. try: int(ordi) # On regarde si ch_joueur est un entier. except: # Si c'est pas un entier, on signale l'erreur et on choisi aléatoirement un élément. print "Erreur 3 ordi\nordi = ", ordi print "aleatoire" ordi = randint(1,3) else: # Sinon, c'est bien un entier et on vérifie son contenu. int(ordi) # On le passe en entier dans le cas ou l'entrée serait "1" et pas 1 par # exemple. if ordi != 1 and ordi != 2 and ordi != 3: # Si le choix n'est ni 1, 2 ou 3 alors on signale l'erreur et on choisi aléatoirement un # élément. print "Erreur 4 ordi\nordi = ", ordi print "aleatoire" ordi = randint(1,3) # Troisièmement on test la validité de l'argument debut. Rappel : ce doit être un entier # compris entre 0 et 1 tout deux inclus. try: int(debut) # On regarde si debut est bien un entier. except: # Si c'est pas un entier, on signale l'erreur et on fait comme si ce n'était pas le début. print "Erreur 5 debut\ndebut = ", debut debut = 0 else: # Sinon, c'est bien un entier et on vérifie son contenu. int(debut) # On le passe en entier dans le cas ou l'entrée serait "1" et pas 1 par # exemple. if debut != 0 and debut != 1: # Si ce n'est ni le début (1) ni pas le début (0) alors on signale l'erreur et fait comme si # ce n'était pas le début. print "Erreur 6 debut\ndebut = ", debut debut = 0 # Et quatrièmement on test l'existence du fichier ia_ppc_memoire.txt. # Il contient tous les élements statistiques nécessaires à l'I.A. try: test = open('ia_ppc_memoire1c.txt', 'r') # On teste l'ouverture du fichier. except: # Si ça ne marche pas, le fichier n'existe pas, donc on le crée. creation = open('ia_ppc_memoire1c.txt', 'w') # On ouvre le fichier en mode écriture, ce qui le # crée. # Contenu du fichier : # l1 : description. l5 : nb_pi_debut. l9 : nb_gagne. # l2 : nb_pierre. l6 : nb_pa_debut. l10 : nb_perdu. # l3 : nb_papier. l7 : nb_c_debut. l11 : nb_egalite. # l4 : nb_ciseaux. l8 : dernier_gagne. l12 : nb_utilisation. creation.write("Ce fichier contient les parametres statistiques necessaires au bon "+ "fonctionnement de l'intelligence artificielle.") # Ecriture de la premiere ligne : la # description. creation.write("\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0") # Ecriture des 11 autres lignes. # Enfin, on ferme le fichier et on l'ouvre en mode lecture. creation.close() memoire = open('ia_ppc_memoire1c.txt', 'r') else: # Sinon, on peut l'ouvrir en mode lecture. memoire = open('ia_ppc_memoire1c.txt', 'r') # Initialisation des variables. liste_memoire = memoire.readlines() # On crée la liste qui contient tout. descriptif = liste_memoire[0] # Le descriptif du fichier. nb_pierre = int(liste_memoire[1]) # Le nombre total de Pierre utilisées. nb_papier = int(liste_memoire[2]) # Le nombre total de Papier utilisés. nb_ciseaux = int(liste_memoire[3]) # Le nombre total de Ciseaux utilisés. nb_pi_debut = int(liste_memoire[4]) # Le nombre de Pierre utilisées en début de partie. nb_pa_debut = int(liste_memoire[5]) # Le nombre de Papier utilisés en début de partie. nb_c_debut = int(liste_memoire[6]) # Le nombre de Ciseaux utilisés en début de partie. dernier_gagne = int(liste_memoire[7]) # L'élément vainqueur au dernier tour. nb_gagne = int(liste_memoire[8]) # Nombre de fois que l'I.A. a gagné un tour. nb_perdu = int(liste_memoire[9]) # Nombre de fois que l'I.A. a perdu un tour. nb_egalite = int(liste_memoire[10]) # Nombre de fois qu'il y a eu égalité. nb_utilisation = int(liste_memoire[11]) # Nombre de fois que l'I.A. a été utilisée. # Les 4 dernières variables permettent de donner une note à l'I.A. afin de vérifier son efficacité. # La lecture faite et mémorisée, on peut fermer le fichier. memoire.close() # On détermine qui a pris quoi et on donne le résultat. if ch_joueur == ordi: # Si le joueur a choisi le même élément que l'I.A. # Le résultat en lui même : égalité. dernier_gange = 0 # On initialise car le joueur n'a pas gagné. nb_egalite += 1 # On incrémente le nombre d'égalité. elif (ordi == (ch_joueur + 1)) or (ordi == (ch_joueur - 2)): # Sinon si l'I.A. a choisie un élément supérieur à celui du joueur. # Le résultat en lui même : perdu pour le joueur. nb_gagne += 1 # On incrémente le nombre de parties gagnées par l'I.A. dernier_gagne = 0 # On initialise car le joueur n'a pas gagné. elif (ordi == (ch_joueur - 1)) or (ordi == (ch_joueur + 2)): # Sinon si l'I.A. a choisie un élément inférieur à celui du joueur. # Le résultat en lui même : gagné pour le joueur. nb_perdu += 1 # On incrémente le nombre de parties perdues par l'I.A. dernier_gagne = ch_joueur # Precision du dernier élément gagnant du joueur # On determine qui a pris quoi. if ch_joueur == 1: # Si le joueur a choisi Pierre. if debut == 1: # Si on est en début de partie. nb_pi_debut += 1 # On incrémente le nombre de Pierre choisi en début. elif debut == 0: # Sinon si on est pas en début de partie. nb_pierre += 1 # On incrémente le nombre de Pierre utilisés. elif ch_joueur == 2: # Sinon si le joueur a choisi Papier. if debut == 1: # Si on est en début de partie. nb_pa_debut += 1 # On incrémente le nombre de Papier choisi en début. elif debut == 0: # Sinon si on est pas en début de partie. nb_papier += 1 # On incrémente le nombre de Papier utilisés. elif ch_joueur == 3: # Sinon si le joueur a choisi Ciseaux. if debut == 1: # Si on est en début de partie. nb_c_debut += 1 # On incrémente le nombre de Ciseaux choisi en début. elif debut == 0: # Sinon si on est pas en début de partie. nb_ciseaux += 1 # On incrémente le nombre de Ciseaux utilisés. nb_utilisation += 1 # On icrémente le nombre d'utilisation de l'I.A. # On va maintenant créer une liste qui contiendra toutes les informations qui on été modifiées. # Elle est construite de la même façon que le fichier mémoire. liste_total = [descriptif, nb_pierre, nb_papier, nb_ciseaux, nb_pi_debut, nb_pa_debut, nb_c_debut, dernier_gagne, nb_gagne, nb_perdu, nb_egalite, nb_utilisation] # On va maintenant mettre à jour le fichier mémoire en remplaçant l'ancien contenu par le # nouveau avec le mode 'w'. maj_memoire = open('ia_ppc_memoire1c.txt', 'w') # Ouverture en mode écriture. compteur_maj = 0 # Compteur pour la boucle : le nombre d'élément dans la liste. while compteur_maj <= 11: # Tant que le compteur n'aura pas épluché tous les numéros de la liste. if compteur_maj == 0: # Si c'est le début. maj_memoire.write(str(liste_total[compteur_maj])) # On ajoute un par un les éléments # de la liste. else: # Sinon si ce n'est pas le début. maj_memoire.write(str(liste_total[compteur_maj])+'\n') # On ajoute un par un les éléments # de la liste. compteur_maj +=1 # On incrémente le compteur. maj_memoire.close() # on ferme ensuite le fichier.