UN PUZZLE POUR L'ÉTÉ

florenth - 4 juil. 2008 à 14:48
cs_Michel34 Messages postés 79 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 27 juin 2011 - 9 juil. 2008 à 18:08
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/47217-un-puzzle-pour-l-ete

cs_Michel34 Messages postés 79 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 27 juin 2011
9 juil. 2008 à 18:08
Salut DEBIAR , tout simplement Epoustouflant , je suis conquis d'etudier ta source ,pour info ,juste un petit Pb quand on deplace une piece et que l'on sorte de la fenetre avec , il faut eviter de relacher le bouton de la souris , sinon la piece est perdu ( cache a l'exterieur de ta forme . Je vais regarder a limiter les deplacements dans la zone de jeu.

Sinon que dire d'autre ,c'est super.
A+ et bonne continuation .
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
8 juil. 2008 à 17:32
@ DEBIARS, j'ai fait ta solution, mais j'ai la form3 qui apparait toujours et qui fait désordre.

Sinon, avec un topenpicturedialog cela fonctionne.

@+,

Cincap
Debiars Messages postés 285 Date d'inscription lundi 16 juin 2003 Statut Membre Dernière intervention 11 février 2018
8 juil. 2008 à 15:33
@Cincap : Je n'ai pas eu ce problème, mais j'ai quand-même remplacé dans Upuzzle3 ces composants un peu vieillots par un OpenPictureDialog et j'ai gardé et modifié la procédure FileListBox1Click comme suit :
----------------------------------------
procedure TForm3.FileListBox1Click(Sender: TObject);
const
K = 136;
Var
w0, h0 : single;
w, h : single;
kk : single;
begin
{ IF filelistbox1.items.count < 1 then exit;
IF filelistbox1.filename = '' then exit;
IF Diskindrive(Drivecombobox1.drive) = False Then
Begin
Showmessage('CD-ROM or floppy disk not ready');
exit;
end; }
if not OPDlg.Execute then exit;
Image1.visible := false;
Image1.width := K;
Image1.height := K;
try
// Image1.Picture.LoadFromFile(FileListbox1.Filename);
Image1.Picture.LoadFromFile(OPDlg.Filename);
except
----------------------------
Cela entraîne la suppression des procédures suivantes qui ne servent pus à rien :

procedure DirectoryListBox1Change(Sender: TObject);
procedure DriveComboBox1Click(Sender: TObject);
function DiskInDrive(Drive: Char): Boolean;

ainsi que quelques lignes qui se révèlent à la compile et naturellement la Form3.
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
8 juil. 2008 à 07:57
Bonjour à toutes et à tous,

@ DEBIARS, Dans la procédure de chargement de l'image (puzzle de J. Y. Q.), avec le composant TDirectoryListbox, je suis limité car je n'ai pas accès au dossier "Mes documents" et forcément au dossier "mes images".

Si quelqu'un sait pourquoi et à une autre solution, cela m'intéresse.

@+,

Cincap
Debiars Messages postés 285 Date d'inscription lundi 16 juin 2003 Statut Membre Dernière intervention 11 février 2018
7 juil. 2008 à 19:16
@Cincap : j'avais déjà neutralisé Lecture1click. Mais ce prog est plein de choses intéressantes, entre autres la génération des pièces sur laquelle Florenth vient de plancher.

@Florenth : Je pense qu'il faut poster, de toutes façons, ça m'intéresse énormément.

A+
Débiars: eh, j'ai enfin réussi à créer dynamiquement des pièces de puzzle en nombre et taille variable ! C'est pas si évident que cela, mais j'hésite à le poster, ça fait un peu plagiat.
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
7 juil. 2008 à 15:09
@ DEBIARS, j'ai en effet constaté avec ton puzzle, la rotation des pièces.

Ton puzzle a du mérite étant donné que tu utilises des masques et fichiers png.

Qpuzzle est le nom donné à l'exécutable mais le lien est bien jigsaw.

Pour ton information avec la source de J. Y. Q. il faut neutraliser ceci :

procedure TForm1.FormActivate(Sender: TObject);
begin
// Lecture1click(sender);
end;

sinon tu auras un bug pour le déplacement des pièces.

C'est vrai que cette source a aussi beaucoup de mérite.

@+,

Cincap
Debiars Messages postés 285 Date d'inscription lundi 16 juin 2003 Statut Membre Dernière intervention 11 février 2018
7 juil. 2008 à 14:25
@Cincap
ça y est, j'ai trouvé...fallait chercher Jigsaw et non pas Qpuzzle.
j'vas étudier, ça a l'air costaud.

merci.
Debiars Messages postés 285 Date d'inscription lundi 16 juin 2003 Statut Membre Dernière intervention 11 février 2018
7 juil. 2008 à 14:05
Salut Cincap,

Remarques : la rotation de la pièce avec le clic droit existe dans le prog.
La solution, tu l'as puisque tu choisis toi-même ton image et que tu peux l'afficher quand tu veux.
La difficulté est variable, en fonction justement du choix de l'image.
J'aurais bien aimé voir Qpuzzle, mais je ne l'ai pas trouvé sur le site en question...

à suivre...
cincap Messages postés 460 Date d'inscription dimanche 5 décembre 2004 Statut Membre Dernière intervention 6 avril 2009 2
7 juil. 2008 à 09:21
Bonjour à toutes et à tous,

@ DEBIARS, bravo pour ta source et pour te donner d'autres idées sans alourdir le jeu (utilisation d'un seul paintbox au lieu de Timage, rotations de la pièce avec le click droit, vitesse, solution, niveau de difficulté etc...), va voir la source de Qpuzzle par J. Y. Queinec sur ce site :

http://www.efg2.com/Lab/Library/Delphi/Graphics/Algorithms.htm

@+,

Cincap
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
6 juil. 2008 à 16:39
he!

"Normalement, chaque jeu de Débiars rameute toutes les foules de Delphifr.." c'est pas parcequ'on post pas qu'on est pas là.... ;-)

ceci dit passez une bon week-end ensoleillé !

Loda
Debiars Messages postés 285 Date d'inscription lundi 16 juin 2003 Statut Membre Dernière intervention 11 février 2018
6 juil. 2008 à 14:03
Je n'ai mis que les mises à jour, mais ça a viré tout le reste.
Alors, je remets tout le paquet et j'en profite pour remplacer les .dcu de PNG par leur sources.

Il semblerait que les collègues sont déjà partis en ouacances.
Chic, chic, Delphifr est à nous !!!
Je crois que tu as un peu trop élagué: y'a plus le .dpr !!

Sinon, je me demande pourquoi y'a que nous deux ici. Normalement, chaque jeu de Débiars rameute toutes les foules de Delphifr...
Debiars Messages postés 285 Date d'inscription lundi 16 juin 2003 Statut Membre Dernière intervention 11 février 2018
6 juil. 2008 à 11:06
A la demande générale de Florenth, je viens d'ajouter la sauvegarde. Elle se fait au moment de quitter un jeu en cours, en répondant affirmativement à une demande.
Le jeu est rechargé automatiquement quand on relance le jeu.
Debiars Messages postés 285 Date d'inscription lundi 16 juin 2003 Statut Membre Dernière intervention 11 février 2018
5 juil. 2008 à 14:46
La dimension des carrés est fonction du nombre de pièces que tu veux réaliser. Là dessus on accroche effectivement des ellipses.

Les tableaux posx# et posy# donnent la position du coin supérieur gauche des pièces dans l'image et permettent de déterminer si une pièce est à sa place (voir Image1MousUp).

Les tableaux dimx# et dimy# donnent les dimmensions de chaque pièce mais ne servent absolument pas et peuvent allègrement être supprimés. Merci de m'avoir mis le nez dedans. C'est sans doute le reste d'une version précédente.

Bon courage.
Ah, et puis à quoi correspondent les nombres dans tes tableaux statiques ?
"procédure Repartition..."
=> Je parlais de l'emplacement des TImage, qui ne varient pas toi tu ne fait qu'inverser des positions de pièces), mais c'est pas vraiment le truc le plus important.

"Si tu veux t'y coller, je prends"
=> J'aurais besoin de savoir comment tu as conçu le truc.
Les "carrés" font tous 80x80 pixels et après on met des ellipses pour les accrocher comme on veut (enfin, du moment qu'a la fin il n'y ait pas de blanc) ?

Mais attention, hein ! C'est pas dit que j'y arrive !
Debiars Messages postés 285 Date d'inscription lundi 16 juin 2003 Statut Membre Dernière intervention 11 février 2018
5 juil. 2008 à 09:49
"en plus tes pièces n'auraient jamais été au même endroit !"
ce n'est pas le cas...voir procédure Repartition...

"il est peut être aussi possible de les créer dynamiquement" (les masques)...wahouu! Si tu veux t'y coller, je prends, cela permettrait de varier le nombre de pièces...
"cela m'obligeait à définir un tableau des 80 positions initiales"
=> un bon coup de Random() et en plus tes pièces n'auraient jamais été au même endroit !

C'est vrai que les masques ont du prendre du temps, cela dit, il est peut être aussi possible de les créer dynamiquement, ce qui, en plus, t'enlève la charge des png et des libraires qui vont avec !

Voila voila !
Mais ça n'enlève rien à la qualité de ton travail, ni à ton imagination débordante !
Debiars Messages postés 285 Date d'inscription lundi 16 juin 2003 Statut Membre Dernière intervention 11 février 2018
5 juil. 2008 à 09:14
Merci, Florenth, pour tes suggestions...
Je m'occupe immédiatement la sauvegarde.
J'avais pensé à la création dynamique des Timage, mais cela m'obligeait à définir un tableau des 80 positions initiales des pièces. Ce qui a été le plus long c'est de dessiner les masques des pièces et d'en relever les dimensions/positions finales.
Pour le déplacement de la fenêtre, suffit de modifier la propriété Borderstyle de la Form, non.
Pour les .dcu, j'avions point pensé à la compatibilité, sorry.
Très très sympa.
J'avoue que ta démarche est super, j'aurais juste fait des TImage crées dynamiquement, car là, ça a du te prendre un temps fou à tout créer.

Le puzzle est d'ailleurs très très long à résoudre, pour preuve, tu a mis 7min 46s pour faire le petit bout de la capture.
Pourquoi ne pas pouvoir sauvegarder la position actuelle des pièces et pouvoir reprendre plus tard ?

Dans la même lignée, pourquoi empêcher de délacer la fenêtre ?
Mais à part ça, ça mérite un 10/10, je ne note pas, j'attends la suite !!

Et re bravo.

PS: Pour les .dcu, le problème c'est que c'est pas compatibles entre les versions de Delphi. Je suppose que tu as Delphi 7 puisque ça marche chez moi mais je ne sais pas pour les autres...