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