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
» PanExpress : l'éditeur Panoramic avec création d'objet
par Jean Claude Aujourd'hui à 8:27

» Projet de planétarium virtuel.
par Pedro Alvarez Hier à 20:53

» Quantité de mémoire utilisée par un exe
par Jack Hier à 16:39

» Problème avec 'file_load'.
par Pedro Alvarez Lun 18 Juin 2018 - 8:12

» Version instantanée V 0.9.28i20 du 13/06/2018
par jjn4 Sam 16 Juin 2018 - 14:25

» string$(0,chr$(32)) sans erreur
par silverman Ven 15 Juin 2018 - 19:56

» Version instantanée V 0.9.28i19 du 13/06/2018
par Minibug Ven 15 Juin 2018 - 19:14

» Mes souhaits d'amélioration de Panoramic.
par Pedro Alvarez Jeu 14 Juin 2018 - 20:17

» [RÉSOLU] Message d'erreur impossible à indentifier
par Minibug Mer 13 Juin 2018 - 20:52

» Cadre pour image
par Jean Claude Mar 12 Juin 2018 - 16:31

» Créateur d'objets Panoramic
par Minibug Mar 12 Juin 2018 - 14:02

» Planétarium gratuit.
par Jean Claude Sam 9 Juin 2018 - 18:50

» Comment afficher une image sans fond.
par JL35 Sam 9 Juin 2018 - 14:16

» image_width(n) et image_height(n)
par silverman Sam 9 Juin 2018 - 11:22

» Site sur la programmation sympa
par Jean Claude Jeu 7 Juin 2018 - 11:20

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Juin 2018
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
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
» DIY Gamer Kit, une Gameboy à construire soi-même pour Noël
» salut, au secour qui sait modéliser un "Gridshell"
» Tiroir automatique en coulisse

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: