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