Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Construire et résoudre un puzzle Mar 7 Aoû 2012 - 18:34 | |
| J'ai fait un programme pour découper une image en petits morceaux façon puzzle, et un autre pour reconstituer le puzzle à partir des morceaux éparpillés de façon aléatoire. J'ai déjà posté le tout sur un autre fil de discussion, mais je réunis tout ici, dans la rubrique des jeux, car je pense que c'est sa place, maintenant que tout est opérationnel. Programme puzzeliser.basCe programme prend une image (BMP ou JPG) et la découpe en petits rectangles. On peut choisir le nombre de lignes et de colonnes, via un menu de configuration. Le résultat sera déposé sous forme d'un répertoire dans le même dossier que le fichier image d'origine qui reste inchangé. Ce dossier porte le même nom que l'image d'origine, et il contient tous les morceaux sous forme de fichiers BMP, et un fichier puzzle_config.txt qui donne des informations sur le puzzle. Ce sera ce fichier TXT qui sera utilisé par le programme puzzle.bas pour charger le puzzle. - Code:
-
' puzzeliser.bas
label labels : gosub labels gosub constantes gosub variables gosub donnees gosub form0 gosub menu gosub GUI gosub initialisations end
labels: label constantes, variables, donnees, form0, menu, GUI, initialisations label open, sortir, conf, close_conf, decouper return constantes: dim max_lignes% : max_lignes% = 100 dim max_colonnes% : max_colonnes% = 150 return variables: ' variables techniques dim no%, no1%, no2%, i%, j%, k%, m%, n%, s$, pic$, w%, h%, f$ ' variables mémorisant des numéros d'objet dim no_pic% : ' picture visualisé à l'écran dim no_open% : ' open_dialog dim no_conf% : ' form de configuration dim no_conf_n_lignes% : ' zone pour le nombre de lignes dans la form de configuration dim no_conf_n_colonnes% : ' zone pour le nombre de colonnes dans la form de configuration dim no_decoup% : ' ligne "Découper" dans le menu "Fichiers" dim no_image% : ' image interne recevant le rectangle découpé ' variables pour la configuration du découpage dim n_lignes%, n_colonnes% return
donnees: return
form0: full_space 0 caption 0,"Création d'un puzzle"
return
menu: no% = no% + 1 : main_menu no% : no1% = no% no% = no% + 1 : sub_menu no% : parent no%,no1% : no2% = no% caption no%,"Fichier" no% = no% + 1 : sub_menu no% : parent no%,no2% caption no%,"Ouvrir" : on_click no%,open no% = no% + 1 : sub_menu no% : parent no%,no2% caption no%,"Découper" : on_click no%,decouper no_decoup% = no% : inactive no% no% = no% + 1 : sub_menu no% : parent no%,no2% caption no%,"----------" no% = no% + 1 : sub_menu no% : parent no%,no2% caption no%,"Sortir" : on_click no%,sortir
no% = no% + 1 : sub_menu no% : parent no%,no1% : no2% = no% caption no%,"Options" no% = no% + 1 : sub_menu no% : parent no%,no2% caption no%,"Configuration" : on_click no%,conf
return
GUI: ' objets invisibles no% = no% + 1 : open_dialog no% : no_open% = no% filter no%,"Images|*.jpg;*.bmp"
' form 0 no% = no% + 1 : picture no% : no_pic% = no% : 2d_target_is no% top no%,10 : left no%,10 width no%,width(0)-8-20 : height no%,height(0)-34-40 ' configuration no% = no% + 1 : form no% : hide no% : no_conf% = no% : no1% = no% border_small no% : on_close no%,close_conf caption no%,"Configuration du puzzle" top no%,200 : left no%,200 no% = no% + 1 : alpha no% : parent no%,no1% top no%,20 : left no%,20 : caption no%,"Nombre de lignes:" no% = no% + 1 : edit no% : parent no%,no1% : no_conf_n_lignes% = no% top no%,20 : left no%,130 : width no%,40 no% = no% + 1 : alpha no% : parent no%,no1% top no%,50 : left no%,20 : caption no%,"Nombre de colonnes:" no% = no% + 1 : edit no% : parent no%,no1% : no_conf_n_colonnes% = no% top no%,50 : left no%,130 : width no%,40
return
initialisations: n_lignes% = 5 n_colonnes% = 7 return sortir: terminate
open: pic$ = "" width no_pic%,width(0)-8-20 : height no_pic%,height(0)-34-40 s$ = file_name$(no_open%) if s$="_" then return file_load no_pic%,s$ ' width no_pic%,width(0)-8-20 : height no_pic%,height(0)-34-40 pic$ = s$ 2d_flood width(no_pic%)-1,height(no_pic%)-1,0,0,0 display for w%=width(no_pic%)-1 to 0 step -1 if color_pixel_red(no_pic%,w%,0)<>0 then exit_for if color_pixel_green(no_pic%,w%,0)<>0 then exit_for if color_pixel_blue(no_pic%,w%,0)<>0 then exit_for next w% for h%=width(no_pic%)-1 to 0 step -1 if color_pixel_red(no_pic%,0,h%)<>0 then exit_for if color_pixel_green(no_pic%,0,h%)<>0 then exit_for if color_pixel_blue(no_pic%,0,h%)<>0 then exit_for next h% w% = w% + 1 : h% = h% + 1 message "Largeur: "+str$(w%)+" Hauteur: "+str$(h%) active no_decoup% return
conf: text no_conf_n_lignes%,str$(n_lignes%) text no_conf_n_colonnes%,str$(n_colonnes%) inactive 0 show no_conf% return
close_conf: i% = 0 s$ = text$(no_conf_n_lignes%) if numeric(s$)=1 n% = int(val(s$)) if (n%>=2) and (n%<=max_lignes%) then i% = 1 end_if if i%=0 message "Le nombre de lignes est invalide." else n_lignes% = n% end_if i% = 0 s$ = text$(no_conf_n_colonnes%) if numeric(s$)=1 n% = int(val(s$)) if (n%>=2) and (n%<=max_colonnes%) then i% = 1 end_if if i%=0 message "Le nombre de colonnes est invalide." else n_colonnes% = n% end_if
hide no_conf% active 0 : to_foreground 0 return
decouper: n% = int(h%/n_lignes% + 0.5) m% = int(w%/n_colonnes% + 0.5) no% = no% + 1 f$ = left$(pic$,len(pic$)-4) if dir_exists(f$)=0 then dir_make f$ f$ = f$ + "\puzzle_" for i%=1 to n_lignes% for j%=1 to n_colonnes% image no% 2d_image_copy no%,(j%-1)*m%,(i%-1)*n%,j%*m%,i%*n% file_save no%,f$ + str$(i%)+"_"+str$(j%)+".bmp" delete no% next j% next i% file_open_write 1,f$+"config.txt" file_writeln 1,file_extract_name$(pic$) file_writeln 1,str$(w%)+" largeur" file_writeln 1,str$(h%)+" hauteur" file_writeln 1,str$(n_lignes%)+" lignes" file_writeln 1,str$(n_colonnes%)+" colonnes" file_close 1 message "Terminé." return Programme puzzle.basPour jouer, il faut disposer d'un dossier contenant un puzzle créé par le programme puzzeliser.bas ci-dessus. C'est le programme puzzle.bas qui charge le fichier puzzle_config.txt, et à partir de là, il trouve les morceaux du puzzle et les affiche, dispersés de façon aléatoire. On utilise alors la fonction "Jouer" du menu "Fichiers" pour démarrer le jeu. A partir de ce moment, on sélectionne un morceau par un clic gauche. Le morceau reste alors collé à la souris et on peut le déplacer librement. Un nouveau clic gauche le désélectionne et le fixe dans la "case" la plus proche de sa position actuelle. Lorsque le dernier morceau est correctement mis en place, un message vient féliciter le gagnant, et on peut lancer une nouvelle partie. - Code:
-
' puzzle.bas
label labels : gosub labels gosub constantes gosub variables gosub donnees gosub form0 gosub menu gosub GUI gosub initialisations end
labels: label constantes, variables, donnees, form0, menu, GUI, initialisations label open, sortir, jouer, selpic, sel0, tick return constantes: dim max_lignes% : max_lignes% = 100 dim max_colonnes% : max_colonnes% = 150 dim dll$ : dll$ = "MouseOperations.dll" return variables: ' variables techniques dim no%, no1%, no2%, i%, j%, k%, m%, n%, s$, pic$, w%, h%, f$, x%, y% dim f_jouer%, n_select%, x_mouse%, y_mouse%, hnd% ' variables mémorisant des numéros d'objet dim no_pic% : ' picture visualisé à l'écran dim no_open% : ' open_dialog dim no_jouer% : ' ligne "Jouer" dans le menu "Fichiers" dim no_detail% : ' dernier numéro d'objet AVANT les pictures de détail dim no_image% : ' image pour pouvoir copier un picture de détail dim no_transport% : ' picture pour déplacer un picture de détail dim no_timer% : ' timer pour le déplacement d'un picture de détail ' variables pour la configuration du découpage dim n_lignes%, n_colonnes% return
donnees: return
form0: full_space 0 : on_click 0,sel0 caption 0,"Résoudre un puzzle"
return
menu: no% = no% + 1 : main_menu no% : no1% = no% no% = no% + 1 : sub_menu no% : parent no%,no1% : no2% = no% caption no%,"Fichier" no% = no% + 1 : sub_menu no% : parent no%,no2% caption no%,"Ouvrir" : on_click no%,open no% = no% + 1 : sub_menu no% : parent no%,no2% caption no%,"Jouer" : on_click no%,jouer no_jouer% = no% : inactive no% no% = no% + 1 : sub_menu no% : parent no%,no2% caption no%,"----------" no% = no% + 1 : sub_menu no% : parent no%,no2% caption no%,"Sortir" : on_click no%,sortir
return
GUI: ' objets invisibles no% = no% + 1 : open_dialog no% : no_open% = no% filter no%,"Puzzle|*.txt" no% = no% + 1 : image no% : no_image% = no% no% = no% + 1 : timer no% : no_timer% = no% : timer_interval no_timer%,100 on_timer no_timer%,tick : timer_off no_timer% ' form 0 no% = no% + 1 : picture no% : no_pic% = no% : 2d_target_is no% top no%,10 : left no%,10 : on_click no%,sel0 width no%,width(0)-8-20 : height no%,height(0)-34-40 no_detail% = no% return
initialisations: n_lignes% = 5 n_colonnes% = 7 hnd% = handle(0) dll_on dll$ return sortir: terminate
open: timer_off no_timer% f_jouer% = 0 2d_target_is 0 if no%>no_detail% for i%=no_detail%+1 to no%+1 delete i% next i% color no_pic%,255,255,255 end_if pic$ = "" width no_pic%,width(0)-8-20 : height no_pic%,height(0)-34-40 s$ = file_name$(no_open%) if s$="_" then return if file_extract_name$(s$)<>"puzzle_config.txt" message "Ce n'est pas un puzzle valide." return end_if f$ = file_extract_path$(s$) file_open_read 1,s$ file_readln 1,pic$ caption 0,"Résoudre le puzzle "+pic$ file_readln 1,s$ i% = instr(s$," ") w% = val(left$(s$,i%-1)) file_readln 1,s$ i% = instr(s$," ") h% = val(left$(s$,i%-1)) file_readln 1,s$ i% = instr(s$," ") n_lignes% = val(left$(s$,i%-1)) file_readln 1,s$ i% = instr(s$," ") n_colonnes% = val(left$(s$,i%-1)) file_close 1 no% = no_detail% n% = int(h%/n_lignes% + 0.5) m% = int(w%/n_colonnes% + 0.5) color no_pic%,0,0,0 2d_target_is no_pic% 2d_rectangle 0,0,w%,h% for i%=1 to n_lignes% for j%=1 to n_colonnes% s$ = f$ + "puzzle_"+str$(i%)+"_"+str$(j%)+".bmp" no% = no% + 1 : picture no% : width no%,m% : height no%,n% left no%,10 + int(rnd(width(no_pic%)-m%)) top no%,10 + int(rnd(height(no_pic%)-n%)) file_load no%,s$ : on_click no%,selpic next j% next i% no_transport% = no% + 1 : picture no_transport% : hide no_transport% width no_transport%,m% : height no_transport%,n% on_click no_transport%,selpic active no_jouer% return
jouer: inactive no_jouer% f_jouer% = 1 return selpic: timer_off no_timer% if n_select%>0 left n_select%,left(no_transport%) top n_select%,top(no_transport%) show n_select% : hide no_transport% if number_click=no_transport% top n_select%,int(top(n_select%)/n%+0.5)*n% +10 left n_select%,int(left(n_select%)/m%+0.5)*m% +10 x% = 0 for i%=1 to n_lignes% for j%=1 to n_colonnes% k% = no_detail% + (i%-1)*n_lignes% + j% if (left(k%)<>(10+(j%-1)*m%)) then x% = 1 if (top(k%)<>(10+(i%-1)*n%)) then x% = 1 next j% next i% if x%=0 off_key_down 0 message "BRAVO ! Vous avez reconstitué le puzzle !" return end_if n_select% = 0 return end_if end_if n_select% = number_click i% = dll_call3("GetMousePosition",hnd%,adr(x_mouse%),adr(y_mouse%)) 2d_target_is n_select% 2d_image_copy no_image%,0,0,m%-1,n%-1 2d_target_is no_transport% 2d_image_paste no_image%,0,0 left no_transport%,left(n_select%) top no_transport%,top(n_select%) show no_transport% : hide n_select% timer_on no_timer% return sel0: timer_off no_timer% left n_select%,left(no_transport%) top n_select%,top(no_transport%) show n_select% : hide no_transport% n_select% = 0 return
tick: timer_off no_timer% i% = dll_call3("GetMousePosition",hnd%,adr(x%),adr(y%)) if x%<0 then return left no_transport%,x% - x_mouse% + left(no_transport%) top no_transport%,y% - y_mouse% + top(no_transport%) x_mouse% = x% y_mouse% = y% timer_on no_timer% return Amusez-vous bien ! | |
|