Après avoir terminé le TP Mario Sokoban, je suis en train de l’améliorer progressivement.
Ma version gère les niveaux. Si le joueur termine le niveau, le suivant s’affiche. En cours de partie, il peut aussi directement passer au niveau suivant ou revenir au précédent avec PageUp/PageDown. J’ai aussi ajouté un système de téléportation (idée que j’ai trouvée sur ce forum). Dès que Mario passe sur le portail 1, il est téléporté au portail 2 et vice-versa.
Je travaille maintenant sur une fonctionnalité qui permet d’annuler les coups. Tous les mouvements de Mario sont enregistrés au fur et à mesure dans un fichier sauvegarde_mouvement.txt via la fonction sauvegardeMouvement(). Si le joueur appuie sur Tab, on revient un coup en arrière de la manière suivante : on fait appel à la fonction annulerMouvement () qui ouvre le fichier de sauvegarde, on se positionne au dernier mouvement et on le renvoie à la fonction dernierCoup(). Puis on supprime le dernier mouvement du fichier en copiant tous les mouvements précédents dans un fichier de sauvegarde temporaire, on vide le fichier de sauvegarde, on copie à nouveau les mouvements dedans et on supprime le fichier temporaire.
Jusque-là, tout marche nickel et on peut annuler tous les coups, du moment que Mario ne déplace pas de caisses ou passe à proximité. La en effet le programme se comporte bizarrement. Les caisses ne retrouvent pas toujours leur emplacement initial et continuent parfois à suivre le déplacement de Mario sur une case ou deux. J’imagine que l’erreur doit provenir quelquepart de ma fonction dernierCoup() dans jeu.c, peut-être au niveau de la gestion des caisses avec déplacerCaisse() mais je vois pas où.
Peut-être que vos lumières me permettront d’y voir plus clair
Je vous mets l’intégralité du code, et je suis toujours preneur de tous vos commentaires d’amélioration !
En fait, j'ai compris d'où vient le problème. Prenons l'exemple suivant
-Mario (0;0) se déplace d'une case vide vers le bas (0;1), puis de deux cases vides vers la droite(2;1), arrive devant une caisse et la pousse d'une case vers la droite(Mario : 3;1 / Caisse : 4;1).
-En appuyant sur Tab, Mario recule d'une case vers la gauche(2;1) et la caisse également (3;1). Jusque là tout va bien, la caisse est à sa position initiale.
-Mais en appuyant à nouveau deux fois sur Tab, pour faire revenir Mario à la position (0;1), la caisse suit le mouvement car la fonction deplacerCaisse() est vérifiée (carte[pos->x+2][pos->x] contient bien une caisse) et donc effectuée.
-Le dernier mouvement de retour, vers le haut (0;0) ne permet pas de vérifier déplacerCaisse donc la caisse reste à son emplacement.
(J'espère avoir été clair ^^)
Du coup, il faudrait pouvoir garder en mémoire le nombre de déplacement qu'une caisse effectue dans chaque direction et décrémenter ce nombre si le joueur annule ses coups. Si le nombre de déplacement atteint 0, on ne déplace plus la caisse.
Mais ça me semble très compliqué à mettre en place, d'autant qu'il y a plusieurs caisses parfois par niveau, donc il faudrait pouvoir également distinguer les mouvements de chacune d'entre elles...
Bref, si vous avez un début d'idée ou de piste, je suis preneur. Peut-être que je complique trop la tête et qu'une solution plus simple peut-être trouvée, mais là je ne vois pas pas
pour attaquer dans le vif du sujet, je vais m'en prendre au TP du sokoban : Il ne s'agît là que d'un petit exercice qui permet peu de sortir des règles fixées. Je suis globalement autodidacte en la matière, même si je profite toujours de l'aide des autres, mais l'expérience m'a amené à croire que mélanger une carte (tilemap) et les éléments actifs (ou mobiles) est une très mauvaise idée, la gestion proposée par ce TP est, selon moi, très mauvaise.
Pour faire ce que tu souhaites sans péter tout le code, j'utiliserais une structure de mémorisation d'un coup joué puis une table de cette structure.
Il suffirait de "remonter" dans la table pour suivre l'historique des coups, quelque chose comme ça :
typedef struct S_Position
{
int x,
y;
}
Position;
typedef struct S_Memoire
{
Position mario,
caisse[10];
}
Memoire;
//*dans le programme :
Memoire historique[50];
Idéalement, il faudrait mettre des tables dynamiques pour adapter le nombre de caisses et "agandir" l'historique au fur et à mesure.
à chaque coup joué, tu mémorises la position de mario et des caisses que tu n'auras plus qu'à relire pour revenir en arrière.
Je n'avais pas encore atteint la dernière partie du cours et en la lisant aujourd'hui, je me rends compte que je pourrai effectivement me simplifier la vie avec les structures de données. Je vais potasser tout ça et voir ce que j'arrive à faire
Pour ta remarque sur le TP en lui-même, si je comprends bien, ce que tu conseillerais c'est de séparer tout ce qui concerne l'affichage de la map des déplacements du joueur/caisse ?
Merci
TP Mario Sokoban - annuler les coups
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Bonhomme !! | Jeu de plateforme : Prototype.