Jeu du Puissance 4, améliorée avec la mise en évidence de l’alignement gagnant et légèrement optimisée par rapport à la version précédente, disponible ici. La version basique est disponible ici et la version terminée est disponible là.
from kandinsky import * from ion import * from random import randint from time import sleep kd = keydown KE = KEY_EXE KO = KEY_OK purple = (160,0,255) def init(): global Jeu Jeu=[[0 for m in range(7)] for n in range(6)] # nettoyage du haut de l'écran draw_string(" "*32,0,3) draw_string(" "*17,80,21) # nettoyage du plateau de jeu for i in range(7): for j in range(6): jeton(i,j,'white') # Affichage du curseur def curseur(x,couleur): draw_string("v",30+30*x,22,couleur) # Déplacement du curseur def deplacement(): global x dx = kd(KEY_RIGHT)-kd(KEY_LEFT) if dx !=0: curseur(x,'white') x = (x+dx)%7 curseur(x,couleur) while kd(KEY_LEFT) or kd(KEY_RIGHT):True def descente(x): global Jeu l=0 while l<6 and Jeu[l][x]==0: # tant que la case est libre sleep(0.1) if l>0: jeton(x,l-1,'white') Jeu[l-1][x]=0 jeton(x,l,couleur) Jeu[l][x]=num_joueur l+=1 while kd(KE) or kd(KO):True return l-1 def jeton(x,y,couleur): draw_string("o",35-5+30*x,55-9+30*y,couleur) def fin(): k=num_joueur maxi_voisins=0 #ligne voisins=1 liste_gagnant=[[y,x]] for lig in range(1,y+1): if Jeu[y-lig][x]==k: voisins+=1 liste_gagnant.append([y-lig,x]) else:break for lig in range(1,5-y+1): if Jeu[y+lig][x]==k: voisins+=1 liste_gagnant.append([y+lig,x]) else:break if voisins>=4: for elt in liste_gagnant: jeton(elt[1],elt[0],'green') maxi_voisins=max(voisins,maxi_voisins) #colonne voisins=1 liste_gagnant=[[y,x]] for col in range(1,x+1): if Jeu[y][x-col]==k: voisins+=1 liste_gagnant.append([y,x-col]) else:break for col in range(1,6-x+1): if Jeu[y][x+col]==k: voisins+=1 liste_gagnant.append([y,x+col]) else:break if voisins>=4: for elt in liste_gagnant: jeton(elt[1],elt[0],'green') maxi_voisins=max(voisins,maxi_voisins) #diag 1 voisins=1 liste_gagnant=[[y,x]] for diag in range(1,min(x,y)+1): if Jeu[y-diag][x-diag]==k: voisins+=1 liste_gagnant.append([y-diag,x-diag]) else:break for diag in range(1,min(6-x,5-y)+1): if Jeu[y+diag][x+diag]==k: voisins+=1 liste_gagnant.append([y+diag,x+diag]) else:break if voisins>=4: for elt in liste_gagnant: jeton(elt[1],elt[0],'green') maxi_voisins=max(voisins,maxi_voisins) #diag 2 voisins=1 liste_gagnant=[[y,x]] for diag in range(1,min(x,5-y)+1): if Jeu[y+diag][x-diag]==k: voisins+=1 liste_gagnant.append([y+diag,x-diag]) else:break for diag in range(1,min(6-x,y)+1): if Jeu[y-diag][x+diag]==k: voisins+=1 liste_gagnant.append([y-diag,x+diag]) else:break if voisins>=4: for elt in liste_gagnant: jeton(elt[1],elt[0],'green') maxi_voisins=max(voisins,maxi_voisins) if maxi_voisins>=4: draw_string("Joueur"+str(k)+" a gagné : Puissance"+str(maxi_voisins)+" "+"!"*min((maxi_voisins-3),3),10-5*min((maxi_voisins-4),2),3,couleur) curseur(x,'white') draw_string("Appuyer sur EXE",85,21,purple) draw_string("Score : ",240,110,'purple') score[k-1]+=1 draw_string("J"+str(k)+" : "+str(score[k-1]),240,110+18*k,couleur) if score[2-k]==0: draw_string("J"+str(3-k)+" : 0",240,110+18*(3-k),'blue'*(k-1)+'red'*(2-k)) return True elif sum(int(Jeu[k][l]) for k in range(6) for l in range(7))==63: draw_string("Personne n'a gagné",70,3) curseur(x,'white') draw_string("Appuyer sur EXE",85,21,purple) return True return False num_joueur=1 # vaudra 1 ou 2 x=3 for i in range(8): # tracé du plateau fill_rect(20+30*i,40,1,181,'orange') fill_rect(20,40+min(30*i,30*6),211,1,'orange') score=[0,0] init() while True: couleur='blue'*(num_joueur==1)+'red'*(num_joueur==2) curseur(x,couleur) while not (kd(KE) or kd(KO)): deplacement() if Jeu[0][x] == 0: y=descente(x) if fin(): while not (kd(KE) or kd(KO)):True init() while kd(KE) or kd(KO):True num_joueur=3-num_joueur