Jeu du Puissance 4. À tour de rôle, deux joueurs lâchent un jeton dans une colonne au choix. Le premier joueur qui aligne au moins 4 jetons de sa couleur, en ligne, en colonne ou en diagonale, a gagné. Les versions précédentes sont disponibles ici et là. Une version optimisée avec un script plus court est disponible par ici.
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 remplir(x,y,couleur): fill_rect(35-2+30*x,55-1+30*y,4,4,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: remplir(elt[1],elt[0],couleur) 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: remplir(elt[1],elt[0],couleur) 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: remplir(elt[1],elt[0],couleur) 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: remplir(elt[1],elt[0],couleur) 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