hexapawn.py

Created by schraf

Created on May 17, 2022

3.05 KB

Explications en vidéo

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()