Démineur utilisant une tdrawgrid et avec lequel on peut tricher

Soyez le premier à donner votre avis sur cette source.

Vue 9 640 fois - Téléchargée 612 fois

Description

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.

Source / Exemple :


Dans le zip.

Conclusion :


Compilable à partir de Delphi4

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

japee
Messages postés
1715
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
2 décembre 2019
2 -
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.
Caribensila
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13 -
@ 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é. ;)
cirec
Messages postés
3810
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
9 décembre 2019
34 -
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/ "
Caribensila
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13 -
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?
japee
Messages postés
1715
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
2 décembre 2019
2 -
C'est curieux chez les marins ce besoin de faire des phrases...
N'aurais-tu pas fait ton service national dans la marine éponyme ? ;-)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.