Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

DÉMINEUR UTILISANT UNE TDRAWGRID ET AVEC LEQUEL ON PEUT TRICHER


Information sur la source

Catégorie :Jeux Classé sous : demineur, stringgrid, recursivite, matrice, tricher Niveau : Débutant Date de création : 08/12/2007 Date de mise à jour : 09/12/2007 12:35:55 Vu / téléchargé: 4 916 / 273

Note :
Aucune note

Commentaire sur cette source (40)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
On peut voir le fonctionnement du jeu en toute transparence, si on le désire bien sûr.
Une question sur le forum concernant l'initialisation d'un tableau bidimensionnel et le choix aléatoire d'un certain nombre de cases de ce tableau m'a entraîné vers la réalisation de ce démineur.
Comme je voulais faire simple (c'est raté), j'ai choisi d'utiliser une DrawGrid.
De fil en aiguille, mon projet s'est un peu alourdi.
Il faut dire que j'étais tiraillé entre le désir de faire simple et celui de cloner le WinMine de Microsoft, bien que l'utilisation de la DrawGrid s'y prête mal.
Avant de poster, j'ai fait une recherche sur le site, et j'ai trouvé 6 jeux de démineurs ou apparentés. J'en ai ressenti une grande frustration, mais plutôt que de me défenestrer depuis le rez-de-chaussée de chez moi (risquant tout au plus une entorse), je me suis dit que l'approche différente de mon démineur méritait peut-être que je le poste.
Voici à mon avis ce qui fait son originalité :
- le fait de voir se dérouler le jeu en toute transparence, très intéressant pour en étudier la logique,
- la démonstration d'utilisation d'un TDrawGrid dans laquelle on peut utiliser les propriétés du Canvas pour écrire du texte ou pour dessiner dans chaque cellule.
Je me suis un peu cassé la tête sur la fonction récursive qui balaye le jeu pour dégager les cases, et sur ce coup là, j'ai certainement réinventé la roue.
Enfin, tout fonctionne, et j'ai passé beaucoup plus de temps sur le débogage de l'interface que sur le code relatif au fonctionnement du jeu, et ça je ne m'y attendais pas.
A noter les fonctions d'enregistrement des scores par niveau dans un fichier de type ini, plus d'autres informations (niveau, position de la fiche avant fermeture du jeu).
J'ajouterai que j'ai très abondament commenté mon code, ce qui pourrait presque déboucher sur un didactitiel qui s'intitulerait : "comment créer pas à pas une petite application de jeu fonctionnelle et complète". En fait pour être complet, il aurait fallu rajouter un fichier d'aide.
J'ai découvert dans les commentaires des sources de démineur du site qu'il existait la possibilité d'appuyer simultanément les deux touches de la souris pour dégager plus rapidement une zone dont on a défini avec justesse l'emplacement des mines avec des drapeaux. Comme je ne connaissais pas cette possibilité dans le jeu original, je n'ai pas développé cette option.
Voilà, j'aurais pu incorporer les sons dans un fichier .res, mais ça aurait compliqué le code (déjà que...). J'avais également envisagé de charger l'image de la DrawGrid depuis une ImageList, mais vu la lenteur du processus j'ai abandonné l'idée.
Je me réserve de toute manière la possibilité d'améliorer mon Mine Clone, mais là je commence à l'avoir assez vu, je sature.
N'hésitez pas à l'essayer, il est pleinement fonctionnel.

PRECISIONS CONCERNANT LES CASES A COCHER :

Ca ne tombe pas forcément sous le sens, donc une petite explication au sujet des différentes options :

- "voir indices" signifie voir (ou dissimuler) les chiffres indiquant combien de mines touchent la cellule,
- "voir mines" signifie montrer (ou cacher) les mines,
- "indications sous mines" montre (ou cache) les chiffres indicatifs qui se trouvent sous la mine (pas très utile),
- "tricher" permet d'enlever tous les caches qui dissimulent la grille et de voir ce qu'il y a dessous, donc.

Donc, premier impératif, il faut que la checkbox "tricher" soit cochée, pour pouvoir visualiser une action sur les autres checkboxes.
Si elle n'est pas cochée, le jeu reprend son aspect normal.

Après, il suffit de jouer avec les checkboxes pour voir l'effet produit.

A l'exception notable de "voir indications sous mines", dont on ne pourra juger l'effet que si l'option "voir mines" est décochée, puisque les mines dissimulent le chiffre qui se trouve dessous.

Le mieux c'est d'essayer pendant le jeu, on comprend vite la logique.
 

Conclusion

Compilable à partir de Delphi4
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

08 décembre 2007 20:39:21 :
Petite imprécision dans le texte de présentation
08 décembre 2007 22:21:02 :
Suite à la remarque de Cirec (ça compile pas sous D7), j'ai remplacé la constante typée par une variable dans MainForm, ligne 371.
08 décembre 2007 22:45:31 :
2ème tentative de modification du zip.
09 décembre 2007 00:42:44 :
Explications concernant la signification des cases à cocher.
09 décembre 2007 00:45:30 :
Modification mineure de la description.
09 décembre 2007 12:35:56 :
Correction radicale du problème de la variable ligne 371. On entend maintenant "tic" et "tac"...

Commentaires et avis

signaler à un administrateur
Commentaire de cirec le 08/12/2007 21:05:58 administrateur CS

Salut,

Dans l'unité Main ligne 382 : Error: Left side cannot be assigned to

Pourquoi avoir choisi une constante ?

Pour le reste j'ai pas encore regardé le code ....
mais j'y travail ;-)

signaler à un administrateur
Commentaire de cirec le 08/12/2007 21:39:16 administrateur CS

Voir mines et indication sous mine n'a aucun effet chez moi ?

signaler à un administrateur
Commentaire de japee le 08/12/2007 21:57:35 administrateur CS

Salut Cirec,

Bizarre.
J'ai pourtant vérifié 2 fois plutôt qu'une avant d'envoyer.
Je télécharge le zip et je vérifie...

Ah oui...
Pour que "voir indices" et "voir mines" soient opérationels, il faut que "tricher" soit coché.
Et pour "indications sous mines", il faut que "voir mines" soit décoché, sinon les mines empêchent de voir.

signaler à un administrateur
Commentaire de cirec le 08/12/2007 22:05:35 administrateur CS

J'ai tout essayé et rien à faire
je n'obtiens pas le résultat escompté

et la seule modification que j'ai apporté au code pour qu'il compile c'est :

Var
  IsTic: Boolean  = True;
{ Gestion du temps écoulé, affichage et son }
procedure TMainForm.TimerTimer(Sender: TObject);
{Const
  IsTic: Boolean  = True;}
Begin
  ...

signaler à un administrateur
Commentaire de japee le 08/12/2007 22:05:48 administrateur CS

OK.

Je viens de vérifier sous D7, effectivement la constante typée ne passe pas (il doit y avoir une option d'environnement à cocher.
En attendant que je corrige, ceux à qui ça pose problème peuvent remplacer par :

var
  IsTic: Boolean;// = True;
à la ligne 382.

Désolé.

signaler à un administrateur
Commentaire de cirec le 08/12/2007 22:18:06 administrateur CS

Bon en cherchant un peut ...
MatrixFlag est toujours à zéro chez moi et du coup ne peut donc pas afficher les images

Pourquoi .... mystère et boule de gomme ;-)

signaler à un administrateur
Commentaire de japee le 08/12/2007 22:36:27 administrateur CS

Bon, et en plus mon zip qui ne veut pas se mettre à jour...

Cirec, en corrigeant la ligne 371, ça fonctionne chez moi sous D7, je viens de tester.

Par contre, je n'aime pas du tout l'aspect que ça donne avec le XPMan sous D7... Berk... (voir capture pour la différence)

signaler à un administrateur
Commentaire de cirec le 08/12/2007 22:51:54 administrateur CS

Bon décidément je suis maudit ;)

j'ai compilé le code sous D7 et Turbo Delphi et rien à faire ...
les deux me donne le même résultat !!!

Si tu le veux bien envoie moi l'exe (sur ma boite Hotmail ... tu sais ou la trouver ;-)  ) afin de pouvoir comparer

signaler à un administrateur
Commentaire de cirec le 08/12/2007 22:58:35 administrateur CS

Attention,
la modification que tu as apportée à la ligne 371 ne jouera qu'un seul son

pour que les deux sons soient joués il faut la déclarer en globale comme je l'ai fait dans mon post

signaler à un administrateur
Commentaire de japee le 08/12/2007 23:16:22 administrateur CS

Bah, c'est pas grave, le son du tic tac n'est pas terrible de toute manière, et le tic vaut le tac (et toc!) ^^
Je verrai ça en profondeur plus tard, là je gave grave sur ce code, le débogage m'a vraiment pris la tête.
C'est pas sympa pour toi, mais j'espère que tu es le seul à avoir la poisse avec mon code, car j'aurais aimé avoir ton avis, même s'il doit être sévère (mais juste, hein ?) ;-)

signaler à un administrateur
Commentaire de John Dogget le 08/12/2007 23:28:06

Pour info, ça compile nickel du premier coup chez moi (D7 pro)

signaler à un administrateur
Commentaire de japee le 08/12/2007 23:38:48 administrateur CS

Merci John Dogget, j'étais prêt à sauter par la fenêtre...

signaler à un administrateur
Commentaire de cirec le 09/12/2007 00:01:00 administrateur CS

Pour la compilation ce n'est pas une question de version
mais de Directive de compilation

sinon pour le reste je dois être trop mauvais ou trop c...
puisque même avec les trois versions que tu m'as envoyé je n'y arrive toujours pas !!!! j'ai toujours le même résultat à savoir pas de changement pour ces deux options (Voir mines et Indication sous mine)

Pour ce soir je laisse tomber
peut être que demain ça fonctionnera mieux ;-)

signaler à un administrateur
Commentaire de cantador le 09/12/2007 00:17:58

çà compile sous D7.
j'aime bcp l'explosion de la mine..
@+

signaler à un administrateur
Commentaire de Caribensila le 09/12/2007 00:23:58

Salut,

Après avoir changé:

var   IsTic : Boolean;// = True;
begin
  IsTic := true;

dans "procedure TMainForm.TimerTimer(Sender: TObject);"

ça compile à l'aise sur D7.

Mais comme je n'avais jamais joué au démineur... attends un peu avant la défenestration, Japee!  ;)

signaler à un administrateur
Commentaire de japee le 09/12/2007 00:38:47 administrateur CS

Le démineur, on s'y éclate, Cari ! ^^

Justement, en trichant, on voit mieux la logique, il me semble, et ça vaut toutes les explications et règles du jeu du monde, toujours un peu ch...es.

Je vais rajouter là-haut quelques explications concernant les options des checkboxes, car ce n'est forcément évident d'en intégrer la logique.

Bien content que ça compile chez toi aussi, Cantador.

Sinon, vous, ça boume ?

signaler à un administrateur
Commentaire de Caribensila le 09/12/2007 00:46:38

J'avais ma chaîne à donf...
Alors le 1er coup, pour boumer ça a boumé!
'suis tout estourbi...

En tout cas, le son y marche super bien !

signaler à un administrateur
Commentaire de cirec le 09/12/2007 13:42:46 administrateur CS

'a y est ... j'ai enfin réussit à faire fonctionner le jeu :-p

C'est le menu "Tricher" qui m'a "enduit d'erreur" (© Japee)  ^^
Et tout comme Caribensila je n'ai jamais joué au démineur ...

enfin grâce à ton explication "PRÉCISIONS CONCERNANT LES CASES A COCHER : " tout fonctionne correctement.

Pour le code :
On pourrait certainement le accourcir mais il y perdrait en lisibilité

Par contre dans DGUtils (même si la fonction n'est plus utilisée c'est juste pour faire avancer le schmilblik)
à la place de créer un bitmap pour récupérer l'image et ensuite la dessiner
pourquoi ne pas avoir utiliser directement la méthode Draw de l'ImageList ?

à mon avis (je n'ai pas testé) ça sera aussi rapide que la méthode actuellement utilisée voir même moins lourd que l'utilisation de plusieurs TImage .... non ?

Dans tous les cas c'est du chouette boulot ... Bravo

et désolé de t'avoir fait tant de frayeurs ^^

signaler à un administrateur
Commentaire de japee le 09/12/2007 16:35:32 administrateur CS

@Cirec

"à la place de créer un bitmap pour récupérer l'image et ensuite la dessiner pourquoi ne pas avoir utiliser directement la méthode Draw de l'ImageList"

Oui, il faut que j'essaye, ça me plait. Et si on peut grignoter en rapidité d'affichage...

"et désolé de t'avoir fait tant de frayeurs ^^"
Bah, t'en fais pas, même pas eu peur...
Quoi que... S'il avait fallu que je refasse tout (cas extrême, certes) parce que ça compilait nulle part... pas lol du tout ! :-(

Et merci pour ton appréciation. :-)

signaler à un administrateur
Commentaire de khawarizm le 09/12/2007 17:50:44

Bonjour ; un des rares sources intéressant et surtout claire et bien commenté que j'ai pu lire et suivre  (à part, bien sur,  quelques commendes que je connaissais pas et que j'ai chercher dans l'aide de Delphi et aussi l'unite Matrix et j'essai de me concentrer pour l'assimiler ) tu a tout a fait raison de dire que c'est un didacticiel , je l'est bien vu de cette façon  et comme  je ne me permet pas de noter le source vu ton niveau de programmation (par rapport au mien)  , je me contente de te REMERCIER .

Question : l'utilisation d'un thread dans ce code serait elle une erreur ?

signaler à un administrateur
Commentaire de japee le 10/12/2007 00:51:13 administrateur CS

Salut  khawarizm,

Merci pour ton appréciation.

"l'utilisation d'un thread dans ce code serait elle une erreur ? "
Cela dépend. Je ne vois pas à priori quelle tâche je pourrais vouloir placer dans un thread.
Je pense améliorer la vitesse d'affichage en utilisant la méthode que me suggère Cirec. Ca devrait largement suffire.

Je serai très heureux si ce source peut te rendre service.

signaler à un administrateur
Commentaire de cirec le 10/12/2007 13:04:31 administrateur CS

Regarde ce bout de code :

C'est une alternative pour le son afin d'éviter de nombreux accès au disque inutiles ;-)

Var
  PTic, PTac : Pointer;
procedure TForm1.Button1Click(Sender: TObject);
begin
  PlaySound(PTic, 0, SND_SYNC Or SND_MEMORY);
  PlaySound(PTac, 0, SND_SYNC Or SND_MEMORY);
end;

procedure TForm1.FormCreate(Sender: TObject);
Var
  Data : PByte;
begin
  //ReportMemoryLeaksOnShutDown := True;
  With TMemoryStream.Create do Try
    LoadFromFile('Tic.Wav');
    GetMem(Data, Size);
    ReadBuffer(Data^, Size);
    PTic := Data;
    FreeMem(Data);
  Finally
    Free;
  End;

  With TMemoryStream.Create do Try
    LoadFromFile('Tac.Wav');
    GetMem(Data, Size);
    ReadBuffer(Data^, Size);
    PTac := Data;
    FreeMem(Data);
  Finally
    Free;
  End;
end;

et il n'y a pas de fuites de mémoire ^^

signaler à un administrateur
Commentaire de japee le 10/12/2007 14:42:30 administrateur CS

Ah oui, l'utilisation des flux...
J'ai pas trop l'habitude de faire joujou avec.
Mais il me semble que tu libère trop vite le stream et que les pointers sont désalloués avant leur utilisation dans Button1Click1 => donc pas de son.
Je l'ai refait comme ça, mais je ne suis pas sûr qu'ainsi il n'y a pas de fuites mémoire :

var
  MemoryStream: TMemoryStream;
  Data : PByte;
  PTic, PTac : Pointer;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //ReportMemoryLeaksOnShutDown := True;
  MemoryStream := TMemoryStream.Create;
  with MemoryStream do
  begin
    LoadFromFile('Tic.Wav');    
    GetMem(Data, Size);
    ReadBuffer(Data^, Size);
    PTic := Data;

    LoadFromFile('Tac.Wav');    
    GetMem(Data, Size);
    Seek(0, soFromBeginning);
    ReadBuffer(Data^, Size);
    PTac := Data;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  PlaySound(PTic, 0, SND_ASYNC Or SND_MEMORY);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin  
  PlaySound(PTac, 0, SND_ASYNC Or SND_MEMORY);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FreeMem(Data);
  MemoryStream.Free;
end;

Qu'en penses-tu ? That's right ?
(j'ai aussi remplacé SND_SYNC par SND_ASYNC, mon côté prudent, même si les sons utilisés ici sont très brefs).

signaler à un administrateur
Commentaire de John Dogget le 10/12/2007 14:58:04

Moi quand je veux verifier une fuite de mémoire, je mets la procedure/fonction dans un timer très court, et je lance le timer.
Ensuite direction le gestionnaire de tâche, si il y a une fuite on voit très rapidement la charge dediée augmenter sans raison.

Bien sûre ça ne dit pas précisement où est le problème mais ça peut permettre de gagner du temps si on utilise beaucoup de procedures "douteuses".

Si ca peut aider ...

signaler à un administrateur
Commentaire de cirec le 10/12/2007 15:12:19 administrateur CS

@ Japee :

tu penses bien que j'ai testé le code avant de le poster ici ^^

et je te garanti que ça fonctionne tel quel

l'as tu au moins essayé ?

je sais le code prête à confusion mais ça fonctionne (je viens refaire les teste)

sinon pour SND_SYNC je l'ai mis dans l'exemple c'est justement pour être sur d'entendre les deux sons

Pour les fuites de mémoire il existe une variable très pratique :
ReportMemoryLeaksOnShutDown  mais que pour les utilisateur de Turbo Delphi pour les autres il y a MemCheck qui, me senble-t-il, est gratuit

signaler à un administrateur
Commentaire de cirec le 10/12/2007 15:29:33 administrateur CS

@ Japee :

je confirme tes craintes ...

avec ton code tu as des fuites de mémoire ;-(

ce qui est normal en soit.

Je m'explique, tu alloues deux fois de la mémoire pour "Data" et tu la libères qu'une fois. Donc ton premier appel à GetMem est perdu. (#^.^#)

signaler à un administrateur
Commentaire de japee le 10/12/2007 16:14:10 administrateur CS

Cirec,

Oui, j'ai testé ton code dans des conditions rigoureuses :

- nouveau projet (donc aucun code qui puisse interférer),
- fichiers .wav placés dans le répertoire (sinon plantage),
- compilation sous D4, puis sous D7 (on ne sait jamais ;-) )

Résultat : aucun son au click de Button1.

2 explications à priori :

1) tu n'as pas testé dans les mêmes conditions que moi,
2) nous sommes dans la 4ème dimensions, nous vivons dans deux mondes parallèles qui n'auraient jamais dû se rencontrer, et l'univers va incessament s'autodétruire. Brrrr....

Sérieux, je ne comprends pas.

signaler à un administrateur
Commentaire de japee le 10/12/2007 16:51:10 administrateur CS

... et haut parleur branchés aussi, j'avais oublié de préciser dans les conditions du test...

Décidément, c'est pas que je sois têtu (enfin un peu quand même...), mais chez moi, il n'y a que ce code qui marche, et j'ai trouvé comment tout libérer/désallouer proprement :

uses MMSystem;

var
  MemoryStream: TMemoryStream;
  Data1, Data2: PByte;
  PTic, PTac : Pointer;

procedure TForm1.Button1Click(Sender: TObject);
begin
  PlaySound(PTic, 0, SND_SYNC Or SND_MEMORY);
  PlaySound(PTac, 0, SND_SYNC Or SND_MEMORY);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MemoryStream := TMemoryStream.Create;
  with MemoryStream do
  begin
    LoadFromFile('Tic.Wav');
    GetMem(Data1, Size);
    ReadBuffer(Data1^, Size);
    PTic := Data1;
    LoadFromFile('Tac.Wav');
    GetMem(Data2, Size);
    Seek(0, soFromBeginning);
    ReadBuffer(Data2^, Size);
    PTac := Data2;
  end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FreeMem(Data2);
  FreeMem(Data1);
  MemoryStream.Free;
end;

Si le code de Cirec fonctionne sur un autre PC que le sien (qui est certainement ensorcelé), pourrait-il nous le faire savoir ?
Ca fairai avancer le aaachimilimili...achimilimilimilblic.

signaler à un administrateur
Commentaire de cirec le 10/12/2007 16:58:50 administrateur CS

J'aime bien la deuxième explication ... lol

Bon plus sérieusement, j'ai été jusqu'à redémarrer la machine pour être sûr du coup et ... (plus de trace dans la mémoire)

J'annonce que ça fonctionne éffectivement sous Turbo Delphi
et ne fonctionne pas sous Delphi7  ... Dommage

Il semblerait donc que le nouveau compilateur permet plus de flexibilité dans le code tout en assurant et la disponibilité des données et leurs libérations.

Que c'est beau le progrès ;-)

Mais c'est pas bien grave, pour D7 au lieu de ne déclarer qu'une variable
tu en déclares deux que tu libère à la fin et plus de fuites et le code reste compatible entre version.  

signaler à un administrateur
Commentaire de cirec le 10/12/2007 17:18:38 administrateur CS

je vous écrit du PC de mon fils pour affirmer
que l'application fonctionne également très bien sur cette machine !!!

C'est bien le compilateur !!!

et j'ajoute aussi ... que si j'enlève les deux fichiers vaw
ben ça fonctionne pas ... ce n'est donc pas dans l'application sous quelques formes que ce soit.

voilà ... désolé lol

signaler à un administrateur
Commentaire de japee le 10/12/2007 17:23:57 administrateur CS

Ah, j'aime mieux ça...
Tout s'éclaire d'un coup.
Et la fin du monde (des mondes ?), c'est peut-être pas pour tout de suite. ^^
C'est donc finalement dû au fait que Turbo Delphi et D7 (et antérieur) ne compilent pas de la même manière.
Quoi qu'il en soit, tu m'as ouvert des horizons, et je vais m'intéresser d'un peu plus près à cette utilisation des Streams.

signaler à un administrateur
Commentaire de Kenavo le 10/12/2007 20:45:30

Mon bon Japee,
Pour les constantes typées (premiers posts) c'est une option du compilateur sous D7 ("constantes typées affectables" à cocher ou {$J+})
Pour la taille max en mode personnalisé, j'ai poussé à 70 x 56 (écran 1280 x 1024) ... et ça tourne !
Pour le nombre de mines, en mode personalisé tu peux limiter à col x row - 1. J'ai mis  -1 parcequ'il est quand même plus intéressanat de jouer à la roulette russe en ayant au moins un trou dans un barillet ayant 3920 balles (ça laisse une chance ! Sinon autant y aller au kinder-suicide)
Du coup l'affichage du nombre de mines est trop petit (que 3 caractères)....

Par contre là, sans le truc du click simultané droite-gauche, c'est galère !
(pour mémoire, ce click simultané sur une case découverte portant le nombre de mines adjacentes peut produire deux effets :
- si le nombre de "drapeaux" est inférieur au nombre de mines indiquées, les cases adjacentes non découvertes changent d'aspect (mise à plat sans effet 3D).
- si le le nombre de "drapeaux" est égal au nombre de mines indiquées, toutes les autres cases adjacentes sont cliquées.
(si le le nombre de "drapeaux" est supérieur au nombre de mines indiquées, rien ne se passe)
Et pour finir je te conseille d'apposer une mention du type :
"Attention, tout abus de ce jeu peut causer des névralgies cervicobrachiales !"

signaler à un administrateur
Commentaire de Kenavo le 10/12/2007 20:50:16

Ah si ! encore un truc pour faire un clone  : quand ça pète, quand ça ventile, quand ça disperse, toutes les cases sont découvertes !

signaler à un administrateur
Commentaire de japee le 10/12/2007 21:46:51 administrateur CS

Salut, Kenavo*.

Bien compris pour le double clic, en théorie ça ne devrait pas être trop difficile à mettre en oeuvre (si j'ose dire).

Oui, si on tombe sur une mine, les cases contenant les autres mines doivent être dispersées façon puzzle, sinon c'est vrai que c'est frustrant. J'avais pas fait attention, mais il faut avouer que j'ai beaucoup triché pour le débogage, et du coup ça m'a échappé.

Je n'avais pas limité le nombre de mines pour que les curieux s'en donnent à coeur joie, dans la mesure où ça ne plante pas le jeu. Je voulais faire de même pour les dimensions de la grille, mais en-dessous d'une certaine taille c'est pas beau, et au-delà, ça risque de déborder de l'écran. C'est une sorte de démineur expérimental, quoi. Mais si je fait une version "normale", je tiendrai compte de tes remarques. Je note aussi que l'affichage des mines est un peu exigü.

"Attention, tout abus de ce jeu peut causer des névralgies cervicobrachiales !". Et pourquoi pas des hémorroïdes, tant qu'on y est ?

Ce démineur, il va finir par me causer quelques nuits blanches, et des "nervous breakdown" comme on dit de nos jours.

Merci pour tes remarques utiles et constructives, je les mettrai en pratique dans une future mise à jour, mais pas tout de suite. Je suis un peu fatigué et je me demande si je ne vais pas me retirer, je sais pas moi, à Montauban par exemple, pour y vendre... bof pourquoi pas des tracteurs ou des bâtonneuse moisseuses.

A +.

* je suis parfaitement bilingue.

signaler à un administrateur
Commentaire de Kenavo le 10/12/2007 23:38:38

Te pête pas trop les neurones,j'voudrais pas qu'tu finisses au terminus des prétentieux !

signaler à un administrateur
Commentaire de japee le 10/12/2007 23:53:54 administrateur CS

C'est curieux chez les marins ce besoin de faire des phrases...
N'aurais-tu pas fait ton service national dans la marine éponyme ?  ;-)

signaler à un administrateur
Commentaire de Caribensila le 11/12/2007 00:11:09

Sniff?..  Sniff!..
Y'a comme une odeur d'éther quand on arrive au bout de ce couloir...
Nix a médicalisé le service?

Bon! Vous allez dire que j'ai encore un métro de retard... Mais pourquoi n'utilisez-vous pas "getHeapStatus.TotalAllocated" pour détecter les fuites de mémoire?
Ca marche pas bien?

signaler à un administrateur
Commentaire de cirec le 11/12/2007 14:04:46 administrateur CS

Pourquoi faire simple quand on peut faire compliqué ?

Voici une méthode très simple propre et rapide ;-)

Le fichier ressource ressemble à ça :
Tic                 WAV           "Tic.wav"
Tac                 WAV           "Tac.wav"


{$R Sound.res}
Uses MMSystem;
var
  PTic, PTac : Pointer;

procedure TForm2.FormCreate(Sender: TObject);
Var
  HRes       : THandle;
begin
  {Charge la ressource en mémoire}
  HRes := LoadResource(hInstance, FindResource(hInstance, 'Tic', 'WAV'));
  {Renvoie un pointeur sur la ressource
   Il n'est pas utile de faire appel UnLockResource
   Les libérations se font automatiquement par Windows à la fin de l'application
   http://msdn2.microsoft.com/en-us/library/ms648047.aspx}
  PTic := LockResource(HRes);

  HRes := LoadResource(hInstance, FindResource(hInstance, 'Tac', 'WAV'));
  PTac := LockResource(HRes);
end;

Penses tu que ce soit assez rapide ;-)
En l'appliquant sur tous les sons l'application peut ainsi devenir autonome,
pas de fichiers annexe.

@Caribensila :
"Mais pourquoi n'utilisez-vous pas "getHeapStatus.TotalAllocated"
pour détecter les fuites de mémoire?"

Turbo Delphi le fait très bien juste en mettant un boolean à vrai
et qu'il me dit dans la majorité des cas quel objet en est responsable ;)

J'avais déjà fait des testes avec "getHeapStatus.TotalAllocated" sous D4
mais il ne détectait pas toujours toutes les fuites, mais je m'y suis peut être mal pris ?

L'autre possibilité est d'utiliser MemCheck  " http://v.mahon.free.fr/pro/freeware/memcheck/ "

signaler à un administrateur
Commentaire de Caribensila le 11/12/2007 16:58:35

@ Cirec
Tu avais peut-être utilisé  "getHeapStatus.totalFree" au lieu de  "getHeapStatus.TotalAllocated", non?

"getHeapStatus.totalFree" est en effet peu fiable à cause du système d'exploitation qui alloue de l'espace quand nécessaire...

Enfin, j'dis ça, j'dis rien. Car on peut te faire confiance en général, quand ton PC n'est pas envouté.  ;)

signaler à un administrateur
Commentaire de japee le 12/12/2007 18:17:44 administrateur CS

J'ai bien pris note de vos suggestions.

To do pour la prochaine version :

- chargement des ressources son en mémoire pour éviter un accès répétitif au disque dur, comme me le suggère Cirec (ta dernière solution me convient tout à fait) ;
- ajout du clic simultané droit et gauche comme suggéré par Kenavo. Mais pour ça il faut que je refasse complètement le logigramme... y'a du boulot.

A plus.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Taille d'un stringgrid [ par padsou ] Salut! J'ai besoin de réduire un stringgrid automatiquement. En fait j'incrémente par programmation le nombre de cases selon le volume des information Fuite mémoire avec StringGrid [ par Stauf ] Bonjour,J'ai le problème suivant:Je crée dynamiquement des données puis libère l'espace une fois affichées. Jusque là, pas de soucis, l'espace est all récuperer les L et C visible à l'écran d'une Stringgrid [ par mik38 ] Bonjour,j'ai créé un composant dérivé de la stringgrid et effectuant un traitement très lourd sur le drawcell.Comment faire pour récuperer seulement l Griser les cellules differement d'une StringGrid? [ par bougste ] Bon Voilà mon problème...J'aimerais pouvoir griser certaine cellules de ma stringGrid...mais pas toute....(ou changer de couleur..)...Apparement on ne Enregistrer données d'un StringGrid dans un fichier [ par elguevel ] voila j'ai crée un programme, avec une StringGrid, et l'utilisateur peut la remplir a son gré, mais j'aimerai (sans passé par les bases de données) en Matrice triangulaire, Equation [ par ryadus ] Salut,j'aimerai savoir si quelqu'un pourrais m'aider sur ça,je voudrais resoudre un systeme Ax=bA etant une matrice triangulaire, x un vecteur et b un aide stringgrid [ par Smeito79 ] 2 ptit question:-Comment peut-on faire pour avoir le numero de la colonne et de la ligne d'une cellule selectionné dans une stringgrid?-Comment peut-o Stringgrid [ par beruco ] Comment peut-on mettre le focus sur une cellule (non directement visible à l'écran) dans un StringGrid ? Création dynamique de StringGrid et Variable [ par ryadus ] Bonjour;j'ai crée dynamiquement des StringGrid;j'ai un bouton, un Edit, j'entre un nombre 'n' dans l'edit, je click sur le bouton, et n stringgrid app Problèe dynamique [ par ryadus ] Bonjour;Voici mon Probléme;je dois faire construire des tableau(Tableau=StringGrid et dans mon code ça sera des matrices), ensuite lorsque je rempli c


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,468 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.