FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Demande pour Jack concernant PanExpress
par Jack Aujourd'hui à 7:48

» Calculatrice
par papydall Hier à 22:54

» EPP_V01 éditeur pour Panoramic
par Minibug Mer 19 Sep 2018 - 21:03

» [RESOLU] Quelle ligne est sélectionnée dans SYNEDIT ?
par Jean Claude Mer 19 Sep 2018 - 21:02

» PanExpress : l'éditeur Panoramic avec création d'objet
par Minibug Mer 19 Sep 2018 - 15:58

» Planétarium virtuel.
par Pedro Alvarez Mer 19 Sep 2018 - 9:28

» Petit coucou en passant !
par Minibug Dim 16 Sep 2018 - 15:03

» bug SEVERE fnc+sub : variables globales corrompus
par silverman Dim 16 Sep 2018 - 13:38

» Verrouiller un form en avant plan
par silverman Dim 16 Sep 2018 - 12:50

» Fin de l'aventure.
par Pedro Alvarez Sam 15 Sep 2018 - 18:16

» Demande d'explications Sur File_Write & File_writeln
par Jack Sam 15 Sep 2018 - 17:26

» MEMO avec des possibilités de commande
par Oscaribout Mer 12 Sep 2018 - 1:06

» La théorie du chaos
par jean_debord Mar 11 Sep 2018 - 9:30

» Orbites de l’ensemble de Mandelbrot
par Jean Claude Lun 10 Sep 2018 - 21:08

» Version instantanée V 0.9.29i2 du 4/09/2018
par silverman Mer 5 Sep 2018 - 10:15

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Septembre 2018
LunMarMerJeuVenSamDim
     12
3456789
10111213141516
17181920212223
24252627282930
CalendrierCalendrier

Partagez | 
 

 Construire et résoudre un puzzle

Aller en bas 
AuteurMessage
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: 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.bas
Ce 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.bas
Pour 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 !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
 
Construire et résoudre un puzzle
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» [résolu ]puzzle
» Scrabble puzzle
» salut, au secour qui sait modéliser un "Gridshell"
» Tiroir automatique en coulisse
» Vitesse 65000 Mistral

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Les jeux faits avec Panoramic-
Sauter vers: