water_sort_color.py

Created by florian-allard

Created on July 15, 2025

5.38 KB

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

During your visit to our site, NumWorks needs to install "cookies" or use other technologies to collect data about you in order to:

With the exception of Cookies essential to the operation of the site, NumWorks leaves you the choice: you can accept Cookies for audience measurement by clicking on the "Accept and continue" button, or refuse these Cookies by clicking on the "Continue without accepting" button or by continuing your browsing. You can update your choice at any time by clicking on the link "Manage my cookies" at the bottom of the page. For more information, please consult our cookies policy.