C++ : Jeu Damier (aide) - Programmation
Marsh Posté le 10-02-2012 à 15:34:04
L'erreur de base, c'est déjà de tout mettre dans un main unique, ce qui ne te permet plus de comprendre pourquoi l'affichage n'est pas appelé (pour le 2) tellement ton code est monobloc.
A+,
Marsh Posté le 10-02-2012 à 18:04:49
Pour l'affichage c'est facile : tu as une belle boucle while qui ne se termine qu'a l'appui d'une touche et elle se trouve avant le code d'affichage, donc forcément, tant que n'appuie pas sur une touche le code d'affichage n'est pas appelé.
Comme gilou te le conseille, commence par découper ton code avec des fonctions ou des classes, on dirait un vieux code non structuré.
Une classe 'Damier' qui contient ta matrice, des méthodes de déplacement qui font les vérifications de validité, une méthode d'affichage, et on verrait bcp plus clair.
Ensuite par exemple :
Code :
|
Si par hasard Mat[Lig][Col]==1 au début, tu le passes à 2 PUIS tu tests s'il est == 2 et tu le passes à 3 ET tu testes == 3 et tu le passes à 4...
En fait dans tous les cas tu va mettre 4 comme valeur pour Mat[Lig][Col]...
Quel intérêt de mettre un while ici ? Tu peut soit faire un switch/case soit utiliser if/else.
En plus tu testes "while (!DValide)" donc:
- Si ton déplacement est invalide tu modifies les valeurs de ta case (en écrivant toujours 4)
- Si ton déplacement est valide tu ne change pas les valeurs
Marsh Posté le 10-02-2012 à 19:04:34
Tout fonctionne.... MAIS à l'exception de...
J'ai un autre problème (que j'ai oublié de mentionner)... mon pointage ne s'accumule pas. Il est toujours à 0. Le problème c'est surement que je ne l'ai pas mis dans la grande boucle (while<15), mais je ne sais pas où exactement mettre la variable Points. Je l'ai mise à certaines place dans la boucle mais, lors de l'exécution, la ligne 27 "cout << "D\x82" "couvrez et amassez 15 cases $$$$"<< setw(44) << "Points:" << Points;" s'affiche un peu partout sur mon jeu mais le pointage s'accumule par contre. Je voudrais qu'elle reste au point (0,0).
Marsh Posté le 10-02-2012 à 23:32:25
C'est pas bien d'effacer son sujet alors que je tape une version qui passe sous code::blocks et ne necessite pas le bousin propriétaire et pas portable de conio.h
Bon, c'est pas un modèle du genre, et si j'avais fait ça en C++, j'aurais fait autrement, mais partant de ton code, et grosso modo, en découpant un peu ça de manière plus logique, ça donne ceci:
Code :
|
J'espère que tu vois la qu'en découpant de manière logique ton switch en deux:
un pour la validité du déplacement et un pour le déplacement lui même, ça devient bien plus clair et simple comme code.
J'ai écrit des procédures assez génériques si tu modifies la taille des cases, mais celle d'affichage du curseur ne l'est pas.
A+,
Marsh Posté le 10-02-2012 à 02:31:28
Bonjour,
Est-ce qu'il y a quelqu'un qui peut me dire quel est le problème dans mon code:
Instructions:
Le jeu est composé d'un damier de 8 lignes et de 12 colonnes. L'objectif est en se déplaçant sur le damier, de découvrir 15 cases où il y a des $$$$ cachés, et bien sûr de ramasser ces $$$$. Le jeu se termine lorsqu'on a cumulé 15 point (ou si on ferme la fenêtre de jeu). Tout déplacement illégal sera signalé par un beep (tentative de déplacement hors du jeu ou sur une case de type mur noir).
Chaque case du jeu est visible sous une des formes suivant:
-pierre blanche;
-pierre grise;
-mur noir;
-$$$$;
Au début toutes les case forment un mur noir ou sont composées de pierre blanche. Lorsque vous quitterez une case pierre blanche, celle-ci deviendra pierre grise ou bien $$$$.
Si on découvre une case $$$, retournez-y pour amasser votre fortune. En quittant la case $$$$, celle-ci devient pierre grise.
Lorsqu'on quitte une case pierre grise elle devient mur noir et on ne peut plus passer par là.
Diagramme d'action (avant première ébauche):
Afficher le jeu
Tant que point < 15
Lire ToucheValide (une touche valide étant une touche de déplacement)
Valider le déplacement
Calculer le nouvelle position courante (si le déplacement est valide)
Modifier le code de la nouvelle case courante (si le déplacement est valide)
Afficher le jeu (Si nécessaire)
Les problèmes:
1) Lorsque je clique 2x sur les extrémités (ex: je suis au coin de départ Mat[0][0], je descend d'une case pour ensuite appuyer sur "haut" "haut" ) l'empreinte du curseur reste à la case Mat[0][0] mais, mon curseur se déplace quand même. Si je clique 3x sur une touche (directionnant vers le hors-champ) lorsque je suis à une extrémité, mon curseur ne se déplace plus.
2) Au départ, l'écran est noir avec seulement la ligne "cout << "D\x82" "couvrez et amassez 15 cases $$$$"<< setw(44) << "Points:" << Points;". Je dois appuyer sur une touche directionnelle pour afficher le jeu, alors que le jeu doit s'afficher immédiatement lorsque j'ouvre l'exécutable.
3) Les cases sont toutes grises au départ (elles sont supposées d'être blanches) et aucun changement ne se fait lorsque je me déplace.
4) Devrais-je plutôt mette la "MODIFICATION DE LA MATRICE ET ACCUMULATION DE POINTS" dans aucune boucle? Est-ce que le while est inutile?
Message édité par CH0622 le 10-02-2012 à 02:32:55