Forums Rue-Montgallet.com
Rue-Montgallet.comRue-Hardware.comRue-Occasion.comRue-DVD.comRue-Jeuxvideo.comRue-AudioVideo.comRue-Telephone.comForums
S'inscrire | S'identifier |
| Recherche avancée | Aide
 
 

Il y a 44 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet :

Probleme de sortie de boucle.

 
n°18919
pagu
Profil : Jeune recrue
Posté le 28-08-2007 à 16:01:22  profilanswer
 

Bonjours, j'essaye de faire une simulation de jeux de combat simple: deux adversaire ( jouer et ordinateur ) lance chaqu'un leur tour un dés, celui qui fait le plus petit score perd des points de vie.
La boucle est sensée s'arreter des que l'un des adversaires n'a plus de points de vie, cependant j'utilise dev c++ et mon programme se ferme dès qu'il atteint la ligne "break", j'ai essayer de mettre des pauses un peut partout mais sa ne resoud pas le probleme.
voici le code :
 
#include <time.h>
#include <stdlib.h>
#include <iostream.h>
#include <stdio.h>
 int main()
 
{
     int pv =30;
     int pvc=10;
     char combat;
     cout << " Combat ! \n Appuyer sur 1 pour lancer le des ";
     cin >> combat;
     if (combat == 1)
     system (" pause" );
    while (pv>0)
     {
     srand((unsigned) time(NULL));  
int a = rand()%6+1;
cout << a;
cout <<". \n";
system (" pause" );
 
int b = rand()%6+1;
cout << "La créature fait un score de ";
cout << b;
cout << ". \n";
 
if (a<b)
{
        pv -= 2;
}
if (b<a)
{  
        pvc -= 2;
        }
cout << "il vous reste ";
cout << pv;
cout << " points de vie \n";
cout << "il reste a la creature ";
cout << pvc;
cout << " points de vie \n";
system ( "pause" );
 
if (pvc == 0); //si j'enlève cette partie là, la boucle marche mais le combat ne s'arrete pas quand l'ordinateur perd.
{
        break;
        system ( "pause" );
}
cout << " vous avez gagné ce combat!";
system ( "pause" );
 
}
}

n°18921
cmoila
Profil : Membre
Posté le 28-08-2007 à 19:41:50  profilanswer
 

J'ai modifié et commenté  ton code :

Code :
  1. int main()
  2. {
  3.   int pv = 30;
  4.   int pvc = 10;
  5.   char combat;     // combat est un char
  6.   cout << " Combat ! \n Appuyer sur 1 pour lancer le des ";
  7.   cin >> combat;
  8.   if ( combat == '1' ) {           // tu dois tester le code ascii du caractère '1' et pas le nb 1
  9.     system (" pause" );          // je me demande a quoi sert ce test et cette pause ?
  10.   }
  11.   srand((unsigned) time(NULL));    // ici car le rand() a besoin d'etre initialisé qu'une fois
  12.   while ( pv > 0 ) {
  13.     int a = rand()%6 + 1;
  14.     int b = rand()%6 + 1;         // fais les 2 tirages a la suite c plus lisible
  15.     cout << a  << ". \n";           // ca tient en une ligne (mais faut pas en abuser)
  16.     system(" pause" );
  17.     cout << "La créature fait un score de " << b << ". \n";   // pourquoi tu ne donnes pas le tirage du joueur ?
  18.     if ( a < b ) {
  19.       pv -= 2;
  20.     }
  21.     if ( b < a ) { // 2 fois le mm test ?   et si égale ?  
  22.       pvc -= 2;
  23.     }
  24.     cout << "il vous reste " << pv << " points de vie \n";
  25.     cout << "il reste a la creature " << pvc << " points de vie \n";
  26.     system("pause" );
  27.     if ( pvc == 0 )     //faut surtout enlever le point virgule qui perturbe le compilo
  28.     {
  29.         break;
  30.         system("pause" );
  31.     }
  32.     cout << "Vous avez gagné ce combat!\n";
  33.     system ("pause" );
  34.   }
  35.   return 0;
  36. }


Message édité par cmoila le 28-08-2007 à 19:45:31
n°18922
pagu
Profil : Jeune recrue
Posté le 28-08-2007 à 20:06:16  profilanswer
 

Merci mais malgré les modifications sa ne marche toujours pas. Je pense que le probleme vien du compilateur, j'aimerais essayer Borland mais j'ai lu qu'il y avais un probleme sous xp ( fichier a modifier qui n'est pas sous xp je crois ).
PS: merci pour le "<< b << " je savais pas ^^

n°18924
cmoila
Profil : Membre
Posté le 28-08-2007 à 20:13:35  profilanswer
 

Explique moi ce que fait ton compilo.
Tu peux aussi faire du débogage ligne à ligne pour voir ou ca plante.  
 
Quand tu mets le pointvirgule apres le test ligne 35, le compilo ne sait pas quoi faire du code suivant qui est en fait inaccessible, et qui comporte une instruction brutale "break".
 
PS: pense aussi a aérer ton code pour le rendre lisible et bien indenter.

n°18925
pagu
Profil : Jeune recrue
Posté le 28-08-2007 à 21:10:42  profilanswer
 

Le compilateur me renvoie "probleme avec break.cpp".

n°18926
cmoila
Profil : Membre
Posté le 29-08-2007 à 12:56:44  profilanswer
 

S'il est pas trop long met une copie de ton "break.cpp"
 
Tu devrais retirer ce break. Non pas que je suis contre ce genre de sortie de boucle afin de signifier un cas particulier de terminaison, mais parce que ton "while" teste déja la continuation de la partie. Tu dois reflechir a un meilleur test de boucle.

n°18927
pagu
Profil : Jeune recrue
Posté le 29-08-2007 à 13:42:57  profilanswer
 

oui ! mais while test la continuité de la partie seulement pour pv et non pour pvc ( donc pvc peut atteindre des nombres négatifs ). Est-ce qu'il y a un moyen de mettre plusieur condition de sortie de boucle dans while ou est ce que vous voyez un autre moyen pour résoudre mon problème ?
Sinon pour break.cpp la fonction rechercher le trouve pas donc peut etre que je ne l'ai pas.


Message édité par pagu le 29-08-2007 à 13:46:20
n°18928
pagu
Profil : Jeune recrue
Posté le 29-08-2007 à 13:56:56  profilanswer
 

ok j'ai fait ça mais la boucle ne marche toujours pas...
   
   

Code :
  1. #include <time.h>
  2.     #include <stdlib.h>
  3.     #include <iostream.h>
  4.     #include <stdio.h>
  5.    
  6.    
  7.      int main()
  8.    
  9.    
  10.     {
  11.          int pv =30;
  12.          int pvc=10;
  13.          char combat;
  14.          cout << " Combat ! \n Appuyer sur 1 pour lancer le des ";
  15.          cin >> combat;
  16.          if (combat == 1)
  17.          system (" pause" );
  18.         while (pv>0 || pvc >0)
  19.          {
  20.        
  21.     srand((unsigned) time(NULL));
  22.     int a = rand()%6+1;
  23.     cout << a;
  24.     cout <<". \n";
  25.     system (" pause" );
  26.    
  27.     int b = rand()%6+1;
  28.     cout << "La creature fait un score de ";
  29.     cout << b;
  30.     cout << ". \n";
  31.    
  32.     if (a<b)
  33.     {
  34.             pv -= 2;
  35.     }
  36.     if (b<a)
  37.     {
  38.             pvc -= 2;
  39.             }
  40.     cout << "il vous reste ";
  41.     cout << pv;
  42.     cout << " points de vie \n";
  43.     cout << "il reste a la creature ";
  44.     cout << pvc;
  45.     cout << " points de vie \n";
  46.     system ( "pause" );
  47.    
  48.    
  49.     }
  50.     cout << " vous avez gagné ce combat!";
  51.     system ( "pause" );
  52.     }

n°18929
pagu
Profil : Jeune recrue
Posté le 29-08-2007 à 14:04:35  profilanswer
 

ok ben j'ai un autre probleme en faite, toute ce que je rajoute ou modifie ne change rien... si je met tapez 2 au lieu de 1 dans mon programme je verais toujours "tapez 1".  
Bon j'ai lancé une nouvelle fiche et j'ai refait ma boucle avec Break et sa marche, je comprend pas trop pourquoi mais bon. Merci pour l'aide :)

Message cité 1 fois
Message édité par pagu le 29-08-2007 à 14:12:47
n°18930
cmoila
Profil : Membre
Posté le 29-08-2007 à 15:54:31  profilanswer
 

pagu a écrit :

ok ben j'ai un autre probleme en faite, toute ce que je rajoute ou modifie ne change rien... si je met tapez 2 au lieu de 1 dans mon programme je verais toujours "tapez 1".  


Lis tous les commentaires du code que j'ai donné avant, car j'avais vu et répondu à cette erreur, ainsi qu'à d'autres comme l'initialisation du ramdom. Tu aurais gagné du temps a faire un cop/col de ce listing.
Sur cette partie du prog tu devrais sans doute mettre un "switch" pour gérer un menu de touches au départ.
 
 
Ton code est très dur à lire, car pas indenté correctement. Faut refaire sa mise en page pour le comprendre. Voici la structure logique de ta boucle de jeu :

Code :
  1. while ( pv>0 || pvc >0 ) {    // joue si l'un OU l'autre a encore des points ????  
  2.      
  3.       ...      // ici le prog fait les tirages de dé et calcule et affiche les scores
  4.      
  5.       system ( "pause" );
  6. }
  7.   cout << " vous avez gagné ce combat!";    // Comment sait on QUI a gagné ?
  8.   system ( "pause" );


 
 
 
 


Aller à :
Ajouter une réponse