taquin.py

Created by escartem

Created on December 01, 2021

4.23 KB

Le jeu du taquin est composé d’une grille de cases avec des chiffres, l’objectif est de remettre ces chiffres dans le bon ordre c’est a dire dans l’ordre croissant en spirale dans le sens horaire

Contrôles : - flèches directionnelles pour déplacer les cases dans cette direction

Notes : * Les dimensions du niveau peuvent être changées dans le programme en ligne 10. * Le nombre de mouvements effectués est affiché en haut a droite de l’écran lors d’une partie.


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

# Dimensions map
# Maximum : 7
# Minimum : 3
map_size = 3

def create_resolved(s):
  ts=s*s
  puzzle = [-1 for i in range(ts)]
  cur,x,ix,y,iy=1,0,1,0,0
  while True:
    puzzle[x + y*s] = cur
    if cur == 0:
      break
    cur += 1
    if x + ix == s or x + ix < 0 or (ix != 0 and puzzle[x + ix + y*s] != -1):
      iy = ix
      ix = 0
    elif y + iy == s or y + iy < 0 or (iy != 0 and puzzle[x + (y+iy)*s] != -1):
      ix = -iy
      iy = 0
    x += ix
    y += iy
    if cur == s*s:
      cur = 0

  return puzzle

def randomize_map(p,s):
  idx = p.index(0)
  poss = []
  if idx % s > 0:
    poss.append(idx - 1)
  if idx % s < s - 1:
    poss.append(idx + 1)
  if idx / s > 0 and idx - s >= 0:
    poss.append(idx - s)
  if idx / s < s - 1:
    poss.append(idx + s)
  swi = choice(poss)
  p[idx] = p[swi]
  p[swi] = 0
  return p

def convert_map(m,s):
  f=[]
  for y in range(s):
    t=[]
    for x in range(s):
      t.append(m[y*s+x])
    f.append(t)
  return f

print("Chargement...")
selected,free,moves=None,(0,0),0
size = floor(180/map_size)
resolved=create_resolved(map_size)
final=create_resolved(map_size)
for i in range(randint(1,1000)):
  final = randomize_map(final,map_size)
  
resolved=convert_map(resolved,map_size)
final=convert_map(final,map_size)
print("Lancement du jeu...")
start=monotonic()

if map_size>=8 or map_size<=2:
  raise BaseException("\nMauvaises dimensions de la map")

def set_free_cells():
  global free_cells
  global free_cells2
  global free
  for i in range(len(final)):
    if 0 in final[i]:
      free=(i,final[i].index(0))
  free_cells,free_cells2=[],[]
  if not free[1]==0:
    free_cells.append((free[0],free[1]-1))
    free_cells2.append("G")
  if not free[1]==len(final[0])-1:
    free_cells.append((free[0],free[1]+1))
    free_cells2.append("D")
  if not free[0]==0:
    free_cells.append((free[0]-1,free[1]))
    free_cells2.append("H")
  if not free[0]==len(final)-1:
    free_cells.append((free[0]+1,free[1]))
    free_cells2.append("B")

def switch_cells(direction):
  set_free_cells()
  global final
  global selected
  global moves
  selected=free_cells[free_cells2.index(direction)]
  moves+=1
  final[free[0]][free[1]]=final[selected[0]][selected[1]]
  final[selected[0]][selected[1]]=0
  selected=None
  set_free_cells()
  render()

def render():
  draw_offset_x=floor((320-(len(final[0])*(size+2)-1+6))/2)-7
  draw_offset_y=floor((240-(len(final)*(size+2)-1+6))/2)-7
  fill_rect(0,0,320,222,(87,87,87))
  fill_rect(0,0,320,20,(61,61,61))
  draw_string("Par Escartem - V 1.3",1,1,(255,255,255),(61,61,61))
  draw_string(str(moves),320-len(str(moves))*10-1,1,(255,255,255),(61,61,61))
  fill_rect(draw_offset_x+7,draw_offset_y+7,len(final[0])*(size+2)-1+6,len(final)*(size+2)-1+6,(32,33,36))
  for x in range(len(final[0])):
    for y in range(len(final)):
      if not str(final[y][x])=="0":
        fill_rect(10+x*(size+2)+draw_offset_x,10+y*(size+2)+draw_offset_y,size,size,(82,82,82))
        fill_rect(10+x*(size+2)+2+draw_offset_x,10+y*(size+2)+2+draw_offset_y,size-4,size-4,(60,64,67))
        draw_string(str(final[y][x]),int(size/2)+5+x*(size+2)-(len(str(final[y][x]))-1)*6+draw_offset_x,draw_offset_y+int(size/1.8)+y*(size+2),(255,255,255),(60,64,67))

set_free_cells()
render()

while True:
  if keydown(KEY_LEFT):
    if "D" in free_cells2:
      switch_cells("D")
    while keydown(KEY_LEFT):
      pass
  if keydown(KEY_RIGHT):
    if "G" in free_cells2:
      switch_cells("G")
    while keydown(KEY_RIGHT):
      pass
  if keydown(KEY_UP):
    if "B" in free_cells2:
      switch_cells("B")
    while keydown(KEY_UP):
      pass
  if keydown(KEY_DOWN):
    if "H" in free_cells2:
      switch_cells("H")
    while keydown(KEY_DOWN):
      pass
  if final==resolved:
    fill_rect(0,20,320,202,(87,87,87))
    draw_string("Niveau accompli",floor((320-150)/2),round((240-20)/2)-floor(19/2),(255,255,255),(87,87,87))
    draw_string("En "+str(moves)+" coups et "+str(round(monotonic()-start))+" secondes",floor((320-((22+len(str(moves)))+len(str(round(monotonic()-start))))*10)/2),floor((240-20)/2)+floor(19/2),(255,255,255),(87,87,87))
    draw_string("Appuyez sur OK pour fermer",floor((320-260)/2),200,(255,255,255),(87,87,87))
    break

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.