Présentation du jeu et de l’algorithme de Bouton :
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/2jahbr5wMHk?autoplay=0&controls=1&end=0&loop=0&mute=0&start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"
></iframe>
</div>
Coder une IA qui joue un coup gagnant lorsqu’elle est est en position gagnante (en suivant l’algorithme de Bouton) et qui joue aléatoirement si elle est sur une position perdante.
# exemple de plateau : [1,3,5,7]
from random import randint
def tourIA(plateau):
nimSomme = 0
for nb in plateau:
nimSomme ^= nb
if nimSomme == 0: # position perdante
ligne = randint(0,len(plateau)-1)
while plateau[ligne] == 0:
ligne = randint(0,len(plateau)-1)
nbjetons = randint(1,plateau[ligne])
plateau[ligne] -= nbjetons
print(f"l'IA en prend {nbjetons} sur la ligne {ligne+1}")
print(plateau)
else:
compteur = 0
for i in range(len(plateau)):
if plateau[i] != 0:
ligne = i
compteur += 1
if compteur == 1: # s'il ne reste qu'une seule ligne non vide, c'est fini
print(f"l'IA en prend {plateau[ligne]} sur la ligne {ligne+1}.\nLe plateau est vide, vous avez perdu...")
plateau[i] = 0
print(plateau)
else:
i = 0
while (plateau[i]^nimSomme) > plateau[i]: # on cherche une ligne permettant d'obtenir à nouveau nimSomme=0
i += 1
vieux = plateau[i]
plateau[i] = nimSomme^plateau[i]
print(f"l'IA en prend {vieux-plateau[i]} sur la ligne {i+1}")
print(plateau)