IA-Learning/Nim.py

90 lines
3.1 KiB
Python

import datetime
import json
import random
# Fonction pour afficher les tas
def afficher_tas(tas):
print("\nVoici les tas actuels :")
for i, nb_objets in enumerate(tas):
print(f"Tas {i+1}: {nb_objets} objets")
print()
# Fonction pour vérifier si le jeu est terminé
def est_jeu_termine(tas):
return all(nb_objets == 0 for nb_objets in tas)
# Sauvegarder la partie dans un fichier json
def sauvegarder_partie(historique, resultat):
partie = {
"date": str(datetime.datetime.now()),
"historique": historique,
"resultat": resultat
}
# Chargement du fichier JSON existant ou création s'il n'existe pas
try:
with open("historique_nim.json", "r") as fichier:
sauvegardes = json.load(fichier)
except FileNotFoundError:
sauvegardes = []
# Ajouter la nouvelle partie à l'historique
sauvegardes.append(partie)
# Sauvegarde dans le fichier
with open("historique_nim.json", "w") as fichier:
json.dump(sauvegardes, fichier, indent=4)
# Heuristique pour l'ordinateur : choisir un tas non vide au hasard et prendre un nombre aléatoire d'objets
def heuristique_ordinateur(tas, historique, joueur):
tas_non_vide = [i for i, nb_objets in enumerate(tas) if nb_objets > 0]
tas_choisi = random.choice(tas_non_vide)
if 3 <= tas[tas_choisi]:
nb_objets = random.randint(1, 3)
elif tas[tas_choisi] == 1:
nb_objets = 1
else:
nb_objets = random.randint(1, tas[tas_choisi])
tas[tas_choisi] -= nb_objets
historique.append(f"Joueur{joueur} a pris {nb_objets} objets du tas {tas_choisi + 1}")
print(f"L'ordinateur a pris {nb_objets} objets du tas {tas_choisi + 1}.\n")
# Fonction principale pour jouer au jeu
def jeu_de_nim(tas_initial, mode="normal"):
tas = tas_initial[:]
joueur = 1 # 1 pour joueur humain, 2 pour ordinateur
afficher_tas(tas)
historique = [f"Tas initiaux: {tas}"]
while not est_jeu_termine(tas):
if joueur == 1:
print("Tour du joueur 1 :")
heuristique_ordinateur(tas, historique, joueur)
else:
print("Tour du joueur 2 :")
heuristique_ordinateur(tas, historique, joueur)
# Changer de joueur
joueur = 2 if joueur == 1 else 1
# Condition de victoire/perte
if mode == "normal":
if joueur == 2:
print("Joueur 1 a gagné.")
Resultat = ("joueur 1 a gagné")
else:
print("Joueur 2 a gagné.")
Resultat = ("joueur 2 a gagné")
elif mode == "misere":
if joueur == 2:
print("Joueur 2 a perdu (version misère).")
Resultat = ("joueur 1 a gagné")
else:
print("Joueur 1 a perdu (version misère).")
Resultat = ("joueur 2 a gagné")
sauvegarder_partie(historique,Resultat)
tas_initial = [random.randint(5, 10), random.randint(5, 10), random.randint(5, 10)]
mode_de_jeu = "normal"
jeu_de_nim(tas_initial, mode_de_jeu)