Advertisement
Guest User

Untitled

a guest
Apr 15th, 2019
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ada 5.99 KB | None | 0 0
  1. with Simon ;
  2. use Simon ;
  3. -- Il y a déjà un problème de logique générale du programme : en effet, si la séquence est la suivante : {HD, BG, BD, BG}
  4. -- Le jeu doit d'abord afficher {HD}, le joueur doit appuyer sur HD
  5. -- Le jeu doit ensuite afficher {HD, BG}, le joueur doit appuyer d'abord sur HD, ensuite sur BG
  6. -- Le jeu doit ensuite afficher {HD, BG, BD}, le joueur doit appuyer sur HD, BG puis BD
  7. -- Le jeu doit ensuite afficher {HD, BG, BD, BG}, le joueur doit appuyer sur HD, BG, BD puis BG
  8. -- et là on a gagné.
  9. -- Dans votre cas , voici ce que vous faites (ou ce que ca aurait fait si il n'y avait pas eu le souci mentionné plus bas):
  10. -- Le jeu doit d'abord afficher {HD}, le joueur doit appuyer sur HD
  11. -- Le jeu doit ensuite afficher {HD, BG}, le joueur doit appuyer sur BG
  12. -- Le jeu doit ensuite afficher {HD, BG, BD}, le joueur doit appuyer sur BD
  13. -- Le jeu doit ensuite afficher {HD, BG, BD, BG}, le joueur doit appuyer sur BG
  14.  
  15. -- Ici, vous ne vérifiez à chaque accroissement de la séquence par le jeu que la dernière direction entrée.
  16. -- Il vous faut un second compteur X, similaire à J mais qui correspondra à la position actuelle de l'utilisateur
  17. -- dans la séquence, et vérifier non pas que Dir = S(J), mais que Dir = S(X), si c'est bon X s'incrémente,on refait, etc ...
  18. -- jusqu'à ce que X = J.
  19. -- Grossièrement, cela donnerait quelque chose dans ce style :
  20. --  __________________________
  21. -- |   Générer la séquence    |
  22. -- |__________________________|
  23. --   ___|_____________________________________________            ______________________________
  24. --  /  Tant qu'on a pas perdu et que J < Seq'Length   \_____sinon____|Afficher Game Over ou Victoire|
  25. --  \_________________________________________________/          |______________________________|
  26. --  |
  27. --  ____|_____________________
  28. -- |   X:=0; J := J + 1;      |
  29. -- |__________________________|
  30. --  |
  31. --   ___|_____________________________________________
  32. --  /  Tant qu'on a pas perdu et que X < J            \<____________________________
  33. --  \_________________________________________________/                 |
  34. --  |                                       |
  35. --  ____|____________________________                           |
  36. -- |   Dir := DetecterDirection      |                          |
  37. -- |_________________________________|                          |
  38. --  |                                       |
  39. --  ____|____________________________          _________________            |
  40. -- |   Est ce que Dir = Seq(X) ?     |__non___| Perdu := True   |           |
  41. -- |_________________________________|        |_________________|           |
  42. --  |                                       |
  43. --  oui                                     |
  44. --  |                                       |
  45. --  ____|____________________________                           |
  46. -- |   X := X + 1            |                          |
  47. -- |_________________________________|                          |
  48. --  |___________________________________________________________________________|
  49. --
  50. -- Il est également nécessaire de gérer le retour au centre : s'assurer qu'on est bien revenu à Immobile entre deux Directions.
  51. procedure missionsimon is
  52.    
  53.    -- Evitez d'utiliser des noms de variables à une seule lettre, ce n'est pas très explicite. L'idéal
  54.    -- reste que le code se documente lui même. IndiceJeu aurait été préférable à la place de J par exemple.
  55.    N : Integer;
  56.    O : T_Direction; -- vous n'utilisez pas O dans le code, est ce normal ?
  57.    J : Integer := 0;
  58.    Test : Boolean := False;
  59.    
  60.    
  61.    procedure Affichage (Dir : T_Direction) is
  62.    begin
  63.       case Dir is
  64.      when Haut_Droit =>
  65.         DessinerPave(Dir, True);
  66.         EcrireEcran(1,1,"Bleu");
  67.        
  68.      when Haut_Gauche=>
  69.         DessinerPave(Dir, True);
  70.         EcrireEcran(1,1,"Jaune");
  71.      when Bas_Droit =>  
  72.         DessinerPave(Dir, True);
  73.         EcrireEcran(1,1,"Vert");
  74.      when Bas_Gauche=>  
  75.         DessinerPave(Dir, True);
  76.         EcrireEcran(1,1,"Rouge");
  77.      when Immobile => EcrireEcran(1,1, "Immobile");
  78.        
  79.       end case;
  80.      
  81.    end Affichage;
  82.    
  83.     procedure Mort (S : T_Sequence; Dir : T_Direction; J : Integer) is
  84.    begin
  85.      
  86.       if Dir = S(J) then
  87.      Affichage(Dir);
  88.       elsif Dir = Immobile then
  89.      -- Je pense que le problème vient d'ici :
  90.      -- Imaginons que DetecterDirection renvoie Immobile car vous n'avez pas encore eu le temps de changer la direction
  91.      -- Vous allez tomber dans ce elsif, qui ne fait rien, et donc votre fonction Mort va terminer.
  92.      -- On arrivera donc à la fin de l'itération de votre boucle, et on est reparti pour un tour avec J qui s'incrémente, etc.
  93.      -- Ca se reproduit ainsi jusqu'à la fin de la séquence, du coup votre condition J < Seq'Last deviens fausse et vous
  94.      -- sortez de la boucle et "gagnez" le jeu (et oui, car Test vaut toujours False).
  95.      -- Il faudrait encapsuler votre if ... elsif ... else dans une boucle While, afin que la condition se répete tant
  96.      -- qu'aucune vraie direction n'a été entrée.
  97.      null;
  98.       else
  99.      Test := True;
  100.       end if;
  101.      
  102.    end Mort;
  103.    
  104.  
  105.    
  106.    
  107. begin
  108.    while True loop
  109.       AttendreToucheA;
  110.       EffacerEcran;
  111.      
  112.       N := SaisirLongueurSequence;
  113.      
  114.       declare
  115.      Seq : T_Sequence(1..N);
  116.      
  117.       begin
  118.      GenererSequence(Seq);
  119.      AfficherSimon;
  120.      
  121.      --Affiche Seq en entier
  122.      --AfficherSequence(Seq);
  123. -- PetitePause;
  124.      
  125.      --Affiche Seq entre 2 bornes
  126.      -- AfficherSequence(Seq(Seq'Last-2..Seq'Last));
  127.      -- PetitePause;
  128.      
  129.      while Test = False and J < Seq'Length  loop
  130.         J := J+1;
  131.         -- Ici vous faites une supposition hasardeuse : que les bornes commencent à 1
  132.         -- en ADA, ce n'est pas une certitude, il est tout à fait possible que Seq commence à 2, 3, etc .
  133.         -- il faudrait donc utiliser non pas Seq(Seq'First..J), mais plutot Seq(Seq'First .. Seq'First + J - 1)
  134.         -- Ici cependant ça fonctionne car Sequence commence effectivement à 1
  135.         AfficherSequence(Seq(Seq'First..J));
  136.         PetitePause;
  137.         Mort(Seq, DetecterDirection, J);
  138.        
  139.      end loop;
  140.      
  141.         if Test = False then
  142.            AfficherGagne;
  143.            EffaceEcranFinDuJeu;
  144.         else
  145.            AfficherGameOver;
  146.            EffaceEcranFinDuJeu;
  147.         end if;
  148.      
  149.       end;
  150.      
  151.    end loop;
  152.    
  153. end missionsimon ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement