Il faut trier les couleurs pour avoir une seule couleur dans chaque bouteille. On peut verser du liquide sur du liquide de même couleur ou dans une bouteille vide. Shift pour recommencer la partie du début. Flèches pour choisir les bouteilles. OK pour valider. Clear pour annuler une sélection.
# dans tous les autres jeux trouvés (mobile ou Internet), le nombre de couleurs différentes # dans chaque bouteille est 4 au maximum. from random import * from kandinsky import * from ion import * from time import * couleurs=["r","g","b","cyan","gray",(160,0,255),"orange",(220,250,0)] N=8 Nv=2 H=4 def cadre(k,couleur): fill_rect(31+50*(k%5),50+90*(k//5),39,1,couleur) fill_rect(30+50*(k%5),51+90*(k//5),1,69,couleur) fill_rect(31+50*(k%5),50+90*(k//5)+70,39,1,couleur) fill_rect(30+50*(k%5)+40,51+90*(k//5),1,69,couleur) def dessin_bouteille(k): fill_rect(40+50*(k%5),70+90*(k//5),1,40,"k") # côté gauche fill_rect(40+50*(k%5)+5,62+90*(k//5),1,4,"k") # côté gauche (haut) for i in range(5): set_pixel(40+50*(k%5)+i,60+90*(k//5)+10-i,"k") # côté gauche goulot set_pixel(40+50*(k%5)+20-i,60+90*(k//5)+10-i,"k") # côté droit goulot fill_rect(40+50*(k%5)+1,60+50+90*(k//5),19,1,"k") # bas fill_rect(40+50*(k%5)+20,70+90*(k//5),1,40,"k") # côté droit fill_rect(40+50*(k%5)+15,62+90*(k//5),1,4,"k") # côté droit (haut) for i in range(H):#len(bouteilles[k])): if i<len(bouteilles[k]): fill_rect(40+50*(k%5)+1,60+90*(k//5)+40-10*i,19,10,couleurs[bouteilles[k][i]]) else: fill_rect(40+50*(k%5)+1,60+90*(k//5)+40-10*i,19,10,"w") #cadre(k,couleurs[k]) def affichage(debut,fin): for k in range(debut,fin+1): dessin_bouteille(k) #seed(1234) while 1: bouteilles=[[k]*H for k in range(N)]+[[] for k in range(Nv)] # N bouteilles + Nv vides completees=0 Ncoups=0 draw_string("Trie les liquides !",65,10,"b") draw_string("SHIFT pour reprendre du début",15,30,"g") affichage(0,9) # mélange des bouteilles : rang1=0 rang2=0 for i in range(300): rang1=randint(0,N+Nv-1) while rang2==rang1 or len(bouteilles[rang2])==H: rang2=randint(0,N+Nv-1) if len(bouteilles[rang2])<H and len(bouteilles[rang1])>0: if len(bouteilles[rang1])==1: # il y a un seul étage bouteilles[rang2].append(bouteilles[rang1].pop(-1)) # on vide un étage de bouteille 1 dans bouteille 2 elif bouteilles[rang1][-1]==bouteilles[rang1][-2]: bouteilles[rang2].append(bouteilles[rang1].pop(-1)) #while len(bouteilles[rang2])<6 and len(bouteilles[rang1])>1: # if bouteilles[rang1][-1]==bouteilles[rang1][-2]: # bouteilles[rang2].append(bouteilles[rang1].pop(-1)) # on vide un étage de bouteille 1 dans bouteille 2 # else: # break affichage(0,N+Nv-1) Sav_bouteilles=tuple(tuple(k) for k in bouteilles) #print("SAV",*Sav_bouteilles,*bouteilles) rang=1 chg=-1 while completees!=N:# not Victoire(): if chg: cadre(rang,"w") rang=(rang+chg)%10 cadre(rang,"b") sleep(0.2) chg=keydown(KEY_RIGHT)-keydown(KEY_LEFT)+5*keydown(KEY_DOWN)-5*keydown(KEY_UP) if keydown(KEY_SHIFT): # recommencer la partie bouteilles=list(list(k) for k in Sav_bouteilles) #draw_string("rest",280,30,"b") #print("Rest",*bouteilles,*Sav_bouteilles) affichage(0,N+Nv-1) while keydown(KEY_SHIFT):1 #draw_string("rest",280,30,"w") if (keydown(KEY_OK) or keydown(KEY_EXE)) and bouteilles[rang] != []: cadre(rang,"r") while keydown(KEY_EXE) or keydown(KEY_OK):1 rang_cible=rang while 1:#not (keydown(KEY_EXE) or keydown(KEY_OK) or keydown(KEY_BACKSPACE)): if chg: cadre(rang_cible,"wr"[rang_cible==rang]) rang_cible=(rang_cible+chg)%10 cadre(rang_cible,("purple","r")[rang_cible==rang]) sleep(0.2) chg=keydown(KEY_RIGHT)-keydown(KEY_LEFT)+5*keydown(KEY_DOWN)-5*keydown(KEY_UP) if (keydown(KEY_EXE) or keydown(KEY_OK)) and rang_cible != rang and len(bouteilles[rang_cible])<H and len(bouteilles[rang])>0: if (bouteilles[rang_cible]==[] or bouteilles[rang][-1]==bouteilles[rang_cible][-1]): # pas mêmes bouteilles mais même couleur et bouteille cible pas pleine bouteilles[rang_cible].append(bouteilles[rang].pop(-1)) Ncoups+=1 if bouteilles[rang]!=[]: while bouteilles[rang]!=[] and bouteilles[rang_cible][-1]==bouteilles[rang][-1] and len(bouteilles[rang_cible])<H: bouteilles[rang_cible].append(bouteilles[rang].pop(-1)) #Ncoups+=1 #affichage(0,N+Nv-1) dessin_bouteille(rang) dessin_bouteille(rang_cible) sleep(0.4) #if bouteilles[rang_cible] == [bouteilles[rang_cible][-1]]*6: #bouteilles[rang_cible]=[] #affichage(rang_cible,rang_cible) cadre(rang,"b") cadre(rang_cible,"w") # test partie finie completees=0 for k in range(N+Nv): if bouteilles[k] != []: if bouteilles[k]==[bouteilles[k][-1]]*H: completees+=1 while keydown(KEY_OK) or keydown(KEY_EXE):1 break if keydown(KEY_BACKSPACE) or ((keydown(KEY_EXE) or keydown(KEY_OK)) and rang_cible == rang): cadre(rang_cible,"w") cadre(rang,"b") while keydown(KEY_BACKSPACE) or keydown(KEY_EXE) or keydown(KEY_OK):1 break cadre(rang,"w") draw_string("Victoire en "+str(Ncoups)+" coups !",50,122,"b") draw_string(" OK pour relancer une partie. ",10,30,"purple") while not (keydown(KEY_OK) or keydown(KEY_EXE)):1 draw_string("Victoire en "+str(Ncoups)+" coups !",50,122,"w")