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
» Mah-Jong américain
par Jean Claude Hier à 19:37

» StratégoV8 et V9
par Jean Claude Hier à 13:18

» Problème avec Deepl
par Klaus Hier à 0:34

» Déformation d'image en trapèze
par Klaus Dim 14 Jan 2018 - 16:22

» Quelques nouvelles ...
par Jean Claude Ven 12 Jan 2018 - 22:40

» Renommer les instructions ITEM_... ?
par Jicehel Ven 12 Jan 2018 - 18:56

» Ludothèque Panoramic
par jjn4 Ven 12 Jan 2018 - 18:11

» sous-programmes et fonctions
par Jack Ven 12 Jan 2018 - 17:51

» KGF_dll - nouvelles versions
par Minibug Ven 12 Jan 2018 - 0:21

» Mah-Jong français
par Jean Claude Jeu 11 Jan 2018 - 22:15

» HVIEWER
par Klaus Mer 10 Jan 2018 - 2:06

» panoramic 0.9.28
par gigi75 Ven 5 Jan 2018 - 14:06

» Un jeu qui va vous énerver!
par Jean Claude Jeu 4 Jan 2018 - 22:05

» Bonne fêtes de fin d'année ! Meilleurs Vœux 2018 !
par Jicehel Jeu 4 Jan 2018 - 17:28

» Mah-Jong international
par jjn4 Jeu 4 Jan 2018 - 16:55

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Janvier 2018
LunMarMerJeuVenSamDim
1234567
891011121314
15161718192021
22232425262728
293031    
CalendrierCalendrier

Partagez | 
 

 Construire et résoudre un puzzle

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Klaus

avatar

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

MessageSujet: Construire et résoudre un puzzle   Mar 7 Aoû 2012 - 19: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
Voir le sujet précédent Voir le sujet suivant 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
» construire side-car 1800
» Construire un chargeur d'accus pour FR3b

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: