taquin.py

Created by florian-allard

Created on December 27, 2021

3.22 KB

Jeu du Taquin, dont le but est de remettre des nombres dans l’ordre, en faisant glisser un nombre dans une case vide. Se joue avec les 4 flèches directionnelles. On peut choisir la taille de la grille et un mode de résolution automatique mais pas optimisé et uniquement pour une grille de taille inférieur ou égale à 4 (sinon il faut modifier le script et réduire le nombre de mouvements pour le mélange).


from random import *
from ion import *
from kandinsky import *
from time import *

while 1:
  fill_rect(0,0,320,222,"white")
  n=4
  draw_string("Taille de la grille",70,50,"orange")
  draw_string("<  >",140,70,"blue")
  while keydown(KEY_EXE) or keydown(KEY_OK):True
  while not keydown(KEY_EXE) or keydown(KEY_OK):
    n=(n+keydown(KEY_RIGHT)-keydown(KEY_LEFT)-2)%8+2
    draw_string(str(n),155,70,"orange")
    sleep(0.08)
  #n=int(input("Taille de la grille (entre 2 et 8) : \n"))
  #try:
    #mode=int(input("Mode : \n1 → auto\n2 → manuel\n"))
  #except:
  mode=1
  if n<5:
    draw_string("Mode",140,100,"orange")
    draw_string("Auto    Manuel",90,120,"orange")
    while keydown(KEY_EXE) or keydown(KEY_OK):True
    while not keydown(KEY_EXE) or keydown(KEY_OK):
      chgt = keydown(KEY_RIGHT)-keydown(KEY_LEFT)
      draw_string("[",155-mode*80,120,"white")
      draw_string("]",235-mode*100,120,"white")
      draw_string("[",75+mode*80,120,"blue")
      draw_string("]",135+mode*100,120,"blue")
      if chgt != 0:
        mode = (chgt+1)//2
  #mode=2
  Jeu=[k for k in range(1,n**2+1)]
  Jeu[-1]=0
  Jeu_resolu=Jeu[:]
  M=0
  mouv=[]
  while Jeu == Jeu_resolu:
    for l in range(100*n**2):
      k=randint(1,4)
      rang=Jeu.index(0)
      if rang%n<n-1 and k==1:
        Jeu[rang]=Jeu[rang+1]
        Jeu[rang+1]=0
        M+=1
        if mode==0:
          mouv.append(1)
      if rang%n>0 and k==2:
        Jeu[rang]=Jeu[rang-1]
        Jeu[rang-1]=0
        M+=1
        if mode==0:
          mouv.append(2)
      if rang//n<n-1 and k==3:
        Jeu[rang]=Jeu[rang+n]
        Jeu[rang+n]=0
        M+=1
        if mode==0:
          mouv.append(3)
      if rang//n>0 and k==4:
        Jeu[rang]=Jeu[rang-n]
        Jeu[rang-n]=0
        M+=1
        if mode==0:
          mouv.append(4)

  fill_rect(50,50,220,150,"white")
  temps=monotonic()
  chgt=1
  N=-1
  while Jeu != Jeu_resolu:
    rang=Jeu.index(0)

    if (keydown(KEY_LEFT) and rang%n<n-1) or (mode==0 and mouv[-1]==2):
      Jeu[rang]=Jeu[rang+1]
      Jeu[rang+1]=0
      chgt=1
    elif (keydown(KEY_RIGHT) and rang%n>0) or (mode==0 and mouv[-1]==1):
      Jeu[rang]=Jeu[rang-1]
      Jeu[rang-1]=0
      chgt=1
    elif (keydown(KEY_UP) and rang//n<n-1) or (mode==0 and mouv[-1]==4):
      Jeu[rang]=Jeu[rang+n]
      Jeu[rang+n]=0
      chgt=1
    elif (keydown(KEY_DOWN) and rang//n>0) or (mode==0 and mouv[-1]==3):
      Jeu[rang]=Jeu[rang-n]
      Jeu[rang-n]=0
      chgt=1

    for k in range(n+1):
      fill_rect(160-(27*n)//2+27*k,96-(20*n)//2,1,20*n,"orange")
      fill_rect(160-(27*n)//2,96-(20*n)//2+20*k,27*n,1,"orange")

    if chgt==1:
      N+=1
      while keydown(KEY_UP) or keydown(KEY_DOWN) or keydown(KEY_LEFT) or keydown(KEY_RIGHT):True
      for i in range(n):
        for j in range(n):
          draw_string("  ",164-(27*n)//2+27*j,98-(20*n)//2+20*i)
          draw_string(str(Jeu[n*i+j])*(Jeu[n*i+j]>0),164-(27*n)//2+27*j+5*(Jeu[n*i+j]<10),98-(20*n)//2+20*i,"blue")
      chgt=0
      mouv=mouv[:-1]
  
  T = monotonic()-temps
  draw_string("Gagné en "+str(N)+" coup"+"s"*(N>1)+" en "+[str(int(T)),str(T)[:7-len(str(N))]][len(str(N))+len(str(int(T)))<6]+" sec",10,200)
  draw_string("Mélangé en "+str(M)+" coups",60,180)
  sleep(0.3)
  while not keydown(KEY_EXE):True