morpion_ia.py

Created by florian-allard

Created on August 05, 2020

6.22 KB

Jeu du Morpion ou Tic Tac Toe, avec gestion de l’appui sur les touches grâce au module ion et un menu de choix du mode : Joueur contre joueur ou Joueur contre une IA (Intelligence Artificielle). Se joue en utilisant les touches 1 à 9. C’est ma version la plus aboutie. Les versions précédentes sont disponibles ici et ici. Une version optimisée avec un script plus court est disponible par ici.


from ion import *
from kandinsky import *
from time import sleep
from random import randint,choice

def joueur_joue(j=1):
  global Jeu
  k = 9
  while k == 9: #Le tour n'est pas encore joué
    if keydown(KEY_ONE) and Jeu[6] == " ":
      k = 6
    elif keydown(KEY_TWO) and Jeu[7] == " ":
      k = 7
    elif keydown(KEY_THREE) and Jeu[8] == " ":
      k = 8
    elif keydown(KEY_FOUR) and Jeu[3] == " ":
      k = 3
    elif keydown(KEY_FIVE) and Jeu[4] == " ":
      k = 4
    elif keydown(KEY_SIX) and Jeu[5] == " ":
      k = 5
    elif keydown(KEY_SEVEN) and Jeu[0] == " ":
      k = 0
    elif keydown(KEY_EIGHT) and Jeu[1] == " ":
      k = 1
    elif keydown(KEY_NINE) and Jeu[2] == " ":
      k = 2
  Jeu[k] = j
  draw_string(str(j),72+30*(k%3),80+30*(k//3),'red')

def IA_joue(i):
  global Jeu,t
  j = 0
  Jeu[i] = j
  sleep(t)
  draw_string(str(j),72+30*(i%3),80+30*(i//3),'red')
  
def IA_facile(j):
  global Jeu
  fait = 0
  while fait == 0:
    i = choice([k for k in range(len(Jeu)) if Jeu[k] == " "])
    Jeu[i] = j
    fait = 1
  sleep(t)
  draw_string(str(j),72+30*(i%3),80+30*(i//3),'red')

def tr1(k): #Symétrie d'axe vertical
  if k in [0,2]:
    return 2-k
  elif k in [3,5]:
    return 8-k
  elif k in [6,8]:
    return 14-k
  else:
    return k

def tr2(k): #Symétrie d'axe horizontal
  if k in [0,6]:
    return 6-k
  elif k in [1,7]:
    return 8-k
  elif k in [2,8]:
    return 10-k
  else:
    return k

def tr3(k): #Symétrie d'axe la 1ère diagonale
  if k in [1,3]:
    return 4-k
  elif k in [5,7]:
    return 12-k
  elif k in [2,6]:
    return 8-k
  else:
    return k

def tr4(k): #Symétrie d'axe la 2ème diagonale
  if k in [1,5]:
    return 6-k
  elif k in [3,7]:
    return 10-k
  elif k in [0,8]:
    return 8-k
  else:
    return k

def trans(k):
  if k1 == 1:
    k = tr1(k)
  if k2 == 1:
    k = tr2(k)
  if k3 == 1:
    k = tr3(k)
  if k4 == 1:
    k = tr4(k)
  return k

def triplet(a,b,c):
  global gagnant,couleur
  if Jeu[a] in [0,1] and Jeu[a] == Jeu[b] == Jeu[c]:
    couleur = 'green'
    gagnant = Jeu[a]
    if gagnant == 0:
      couleur = 'blue'
    for d in [a,b,c]:
      draw_string(str(Jeu[d]),72+30*(d%3),80+30*(d//3),couleur)
  
def jeu_fini(Jeu):
  global gagnant
  gagnant = 2 #Pas de gagnant
  fin = False
  for k in range(3):
    triplet(0+3*k,1+3*k,2+3*k)
    triplet(0+k,3+k,6+k)
  triplet(0,4,8)
  triplet(2,4,6)
  if gagnant < 2:
    draw_string("Joueur"+str(gagnant)+" a gagné",84,25,couleur)
    score[gagnant] += 1
    draw_string("Joueur"+str(gagnant)+" : "+str(score[gagnant]),170,100+20*gagnant,'red')
    fin = True
  elif Jeu.count(0)+Jeu.count(1) == 9 and fin == 0:
    draw_string("Personne n'a gagné",68,25)
    fin = True
  return fin

def JcJ():
  global j,Jeu,fin
  while fin == False:
    joueur_joue(j)
    fin = jeu_fini(Jeu)
    j = 1-j

def JcIA_facile():
  global j,Jeu,fin
  if j == 0:
    IA_facile(j)
    j = 1-j
  while True:
    joueur_joue(j)
    fin = jeu_fini(Jeu)
    j = 1-j
    if fin:
      return None
    IA_facile(j)
    fin = jeu_fini(Jeu)
    j = 1-j
    if fin:
      return None

def enchainement(a,b,c,d,e):
  IA_joue(trans(a))
  joueur_joue()
  if Jeu[trans(b)] == " ":
    IA_joue(trans(b))
  else:
    IA_joue(trans(c))
    joueur_joue()
    if Jeu[trans(d)] == " ":
      IA_joue(trans(d))
    else:
      IA_joue(trans(e))

def petit_ench(a,b,c):
  IA_joue(trans(a))
  joueur_joue()
  if Jeu[trans(b)] == " ":
    IA_joue(trans(b))
  else:
    IA_joue(trans(c))

def JcIA():
  global Jeu
  j = 0 # IA qui joue
  IA_joue(trans(0))
  joueur_joue()

  if Jeu[trans(1)] == 1-j:
    enchainement(4,8,6,3,2)

  elif Jeu[trans(2)] == 1-j:
    enchainement(6,3,8,4,7)

  elif Jeu[trans(3)] == 1-j:
    enchainement(4,8,2,1,6)

  elif Jeu[trans(4)] == 1-j:
    petit_ench(2,1,7)
    joueur_joue()
    if Jeu[trans(3)] == 1-j:
      petit_ench(5,8,6)
    elif Jeu[trans(5)] == 1-j:
      petit_ench(3,6,8)
    elif Jeu[trans(6)] == 1-j:
      petit_ench(8,5,3)
    elif Jeu[trans(8)] == 1-j:
      petit_ench(6,3,5)

  elif Jeu[trans(5)] == 1-j:
    enchainement(4,8,2,1,6)
          
  elif Jeu[trans(6)] == 1-j:
    enchainement(2,1,8,4,5)
          
  elif Jeu[trans(7)] == 1-j:
    enchainement(4,8,6,3,2)

  elif Jeu[trans(8)] == 1-j:
    enchainement(2,1,6,4,3)
  jeu_fini(Jeu)  

def partie():
  global j,score,t,mode,diff,fin,Jeu,k1,k2,k3,k4
  while 1:
    Jeu = [" "]*9
    fin = False

    draw_string("Appuyez sur EXE",84,46,(160,0,255))

    while not (keydown(KEY_EXE) or keydown(KEY_OK)):True

    fill_rect(62,25,255,190,'white')
    for a in range(65,160,30):
      fill_rect(65-3,a+8,91,1,'orange')
      fill_rect(a-3,73,1,90,'orange')

    draw_string("Joueur0 : "+str(score[0]),170,100,'blue')
    draw_string("Joueur1 : "+str(score[1]),170,120,'green')

    if mode == 0:
      JcJ()
    if mode == 1:
      if diff == 0:
        JcIA_facile()
      else:
        k1 = randint(0,1)
        k2 = randint(0,1)
        k3 = randint(0,1)
        k4 = randint(0,1)
        JcIA()

def menu():
  d = 0
  m = 0
  draw_string("Choix du mode :",85,30,'orange')
  draw_string("Joueur contre joueur",60,60,'blue')
  draw_string("Joueur contre IA",80,82,'blue')
  while keydown(KEY_EXE) or keydown(KEY_OK):True
  while not (keydown(KEY_EXE) or keydown(KEY_OK)):
    draw_string("[",60+20*m-2*10,60+22*m,'blue')
    draw_string("]",60+21*10-20*m,60+22*m,'blue')
    if keydown(KEY_DOWN) or keydown(KEY_UP):
      draw_string(" ",60+20*m-2*10,60+22*m)
      draw_string(" ",60+21*10-20*m,60+22*m)
      m = 1-m
      while keydown(KEY_DOWN) or keydown(KEY_UP):True

  if m == 1:
    while keydown(KEY_EXE) or keydown(KEY_OK):
      draw_string("Choix de la difficulté :",40,132,'orange')
      draw_string("Facile",130,162,'blue')
      draw_string("Difficile",115,184,'blue')
    while keydown(KEY_EXE) or keydown(KEY_OK):True
    while not (keydown(KEY_EXE) or keydown(KEY_OK)):
      draw_string("[",130-15*d-2*10,162+22*d,'blue')
      draw_string("]",130+7*10+15*d,162+22*d,'blue')
      if keydown(KEY_DOWN) or keydown(KEY_UP):
        draw_string(" ",130-15*d-2*10,162+22*d)
        draw_string(" ",130+7*10+15*d,162+22*d)
        d = 1-d
        while keydown(KEY_DOWN) or keydown(KEY_UP):True
  fill_rect(2,5,315,210,'white')
  return m,d

score = [0,0]
j = 0 #IA ou joueur0 commence
t = 0.5
mode,diff = menu()

partie()