But : Essayez d’arriver à 15 parties gagnantes avant la machine !
Dans la vidéo je dis que s’il y a un blocage, c’est qu’il reste le même nombre de pions blancs et de pions noirs, ce n’est pas exact :
X.X X.O O..
est une situation bloquée et pourtant les nombres de pions sont différents ;-) J’ai donc changé le test et mis tout simplement :
if len(jouables(position)) == 0: return 1
En d’autres termes, s’il n’y a pas de déplacement possible, c’est que la situation est bloquée.
from random import choice strategie = {} gagne = [0,0] def surPlateau(n): return 1 <= n <= 9 def colGauche(n): return n % 3 == 1 def colDroite(n): return n % 3 == 0 def key(position): [hu,ia] = position plateau = "" for k in [7,8,9,4,5,6,1,2,3]: if k in hu: plateau += 'O' elif k in ia: plateau += 'X' else: plateau += ' ' return plateau def jouables(position): global strategie cle = key(position) if cle in strategie: return strategie[cle] [hu,ia] = position dep = [] for k in ia: avancer = k - 3 if surPlateau(avancer) and avancer not in hu and avancer not in ia: dep += [10 * k + avancer] droite = k - 2 if surPlateau(droite) and not(colDroite(k)) and droite in hu: dep += [10 * k + droite] gauche = k - 4 if surPlateau(gauche) and not(colGauche(k)) and gauche in hu: dep += [10 * k + gauche] strategie[cle] = dep return dep def aff(c): print(c, end='') def affiche(position): [hu,ia] = position plateau = "" for k in [7,8,9,4,5,6,1,2,3]: if k in hu: aff("O") elif k in ia: aff("X") else: aff(".") if k % 3 == 0: print() print("-"*10 + " (J:{} - IA:{})".format(gagne[0],gagne[1])) def gagnante(position): [hu,ia] = position hu.sort() ia.sort() if any([v in [7,8,9] for v in hu]): return 1 if any([v in [1,2,3] for v in ia]): return 1 if len(hu) == 0 or len(ia) == 0: return 1 if len(jouables(position)) == 0: return 1 return 0 def humain(coup, position): [hu,ia] = position [d,a] = [int(v) for v in coup] if not(d in hu): return False ti = a in ia tg = colGauche(d) td = colDroite(d) tv = not(ti) and not(a in hu) if a == d + 3 and tv: return True if a == d + 2 and not(tg) and ti: return True if a == d + 4 and not(td) and ti: return True return False def jouer(coup, position, xo): global strategie [hu, ia] = position [d, a] = [int(v) for v in coup] if xo == 0: hu.remove(d) hu += [a] if a in ia: ia.remove(a) else: ia.remove(d) ia += [a] if a in hu: hu.remove(a) print("Je joue", coup) affiche([hu, ia]) return [hu, ia] def hexapawn(): global gagne while True: position = [[1,2,3],[7,8,9]] print("-"*10) affiche(position) while gagnante(position) == 0: valide = False while not(valide): coup = input("Votre coup (ex: 14 ou 0) ? ") if coup == '0': return valide = humain(coup, position) if valide: position = jouer(coup, position, 0) else: print("Vous ne pouvez pas jouer ca !") if gagnante(position): print('Vous gagnez...') gagne[0] += 1 strategie[historique[0]].remove(historique[1]) else: iacherche = choice(jouables(position)) historique = [key(position)] jouer(str(iacherche), position, 1) historique += [iacherche] if gagnante(position): print('Je gagne...') gagne[1] += 1 s = strategie[historique[0]] if any(v != historique[1] for v in s): strategie[historique[0]] += [historique[1]] hexapawn()