Problème programme c++

Résolu/Fermé
dqsdqsfds - 12 févr. 2019 à 14:33
 hjsldqdsq - 12 févr. 2019 à 19:07
Bonjour,
Bonjour,

Salut, je commence le c++, et je ne vois pas pourquoi le programme ne fonctionne pas ; le debugger (Code::Blocks) ne dit rien, mais le programme "A cessé de fonctionné. Windows cherche une solution au programme" :

#include <iostream>
#include <cstdlib>
#include <string>
#include <ctime>


//system("cls");

using namespace std;

int main()
{
cout << "Bienvenue dans le systeme de combats" << endl << endl;

//Variables du joueur
int joueur_vie(100);
string joueur_arme;
int degats_arme;
string joueur_armure;
int defense_armure;
int potion_vie(30);

//Variables des monstres

//Monstre 1
string blob("Blob");
string description_blob("Un monstre visqueux et faible");
int vie_blob(20);
int degats_blob(5);
int defense_blob(1);
int taux_apparition_blob(30);

//Monstre 2
string loup("Loup");
string description_loup("Un animal feroce. Prenez garde !");
int vie_loup(50);
int degats_loup(10);
int defense_loup(2);
int taux_apparition_loup(20);

//Monstre 3
string goliath("Goliath");
string description_goliath("Un goliath de pierre. A beaucoup de vie.");
int vie_goliath(100);
int degats_goliath(3);
int defense_goliath(5);
int taux_apparition_goliath(10);

//Monstre 4
string lave("Monstre de lave");
string description_lave("Constitue de lave. Attention aux brûlures.");
int vie_lave(40);
int degats_lave(15);
int defense_lave(2);
int taux_apparition_lave(20);
int brulure(20);

//Monstre 5
string squelette("Squelette");
string description_squelette("Un gentil tas d'os.");
int vie_squelette(10);
int degats_squelette(10);
int defense_squelette(5);
int taux_apparition_squelette(20);
int esquive(50);

//Tableaux regroupants les monstres

string nom[5];
string description[5];
int vie[5];
int degats[5];
int defense[5];

nom[0] = blob;
nom[1] = loup;
nom[2] = goliath;
nom[3] = lave;
nom[4] = squelette;

description[0] = description_blob;
description[1] = description_loup;
description[2] = description_goliath;
description[3] = description_lave;
description[4] = description_squelette;

vie[0] = vie_blob;
vie[1] = vie_loup;
vie[2] = vie_goliath;
vie[3] = vie_lave;
vie[4] = vie_squelette;

degats[0] = degats_blob;
degats[1] = degats_loup;
degats[2] = degats_goliath;
degats[3] = degats_lave;
degats[4] = degats_squelette;

defense[0] = defense_blob;
defense[1] = defense_loup;
defense[2] = defense_goliath;
defense[3] = defense_lave;
defense[4] = defense_squelette;


//Armes
string epee_bois("Epee en bois");
int degat_bois(10);

string epee_fer("Epee en fer");
int degat_fer(15);

string lance_or("Lance d'or");
int degat_or(20);

string excalibur("Excalibur");
int degat_excalibur(30);

string error_404("Error 404");
int degat_error404(42);

//Defense
string armure_bois("Armure en bois");
int defense_bois(2);

string armure_fer("Armure en fer");
int defense_fer(5);

string armure_or("Armure en or");
int defense_or(8);

string error_403("Error 403");
int defense_error403(42);

//Variables joueur au départ du jeu
joueur_arme = epee_bois;
degats_arme = degat_bois;
joueur_armure = armure_bois;
defense_armure = defense_bois;

cout << "Votre aventure commence dans un petit chateau." << endl << "Bla bla bla" << endl << "Vous trouvez une epee en bois et une armure en bois" << endl << "Et vous decidez de partir a l'aventure" << endl << endl;


while (joueur_vie > 0)
{

int choix_du_monstre(0); //Choix du monstre

choix_du_monstre = rand() % 10;

int monstre;


if (choix_du_monstre < 3)
{
int monstre(0);
}
else if (choix_du_monstre < 5)
{
int monstre(1);
}
else if (choix_du_monstre < 6)
{
int monstre(2);
}
else if (choix_du_monstre < 8)
{
int monstre(3);
}
else
{
int monstre(4);
}

//Debut du combat
string nom_monstre;
string description_monstre;
int vie_monstre;
int degats_monstre;
int defense_monstre;


nom_monstre = nom[monstre];
description_monstre = description[monstre];
vie_monstre = vie[monstre];
degats_monstre = degats[monstre];
defense_monstre = defense[monstre];

}

cout << endl << "Vous avez perdu ... Dommage !" << endl;

return 0;

}



Voilà, merci en avance pour votre aide.

3 réponses

Jithel Messages postés 843 Date d'inscription mercredi 20 juin 2018 Statut Membre Dernière intervention 31 août 2021 171
12 févr. 2019 à 16:21
Je pense que tu ne sors jamais de la boucle
while (joueur_vie > 0) 


Vérifie que joueur_vie vaut bien 0 à un moment.
0
Bonjour

Comme l'a dit Jithel, il semble que tu ne modifies jamais joueur_vie, donc tu ne sortiras jamais de ta boucle.
Mais ce n'est pas ce qui provoque "Le programme a cessé de fonctionner". Au contraire, ça l'empêcherait plutôt de cesser !

Le problème est que tu n'initialises pas ta variable monstre, donc une instruction comme
nom_monstre = nom[monstre];
va chercher n'importe où dans la mémoire , et provoque un gros plantage.
Tu crois que tu initialises monstre quand tu fais
if (choix_du_monstre < 3) 
{ 
int monstre(0); 
} 
Ce n'est pas vrai. Pas complètement faux, mais en fait tu déclares une nouvelle variable monstre que tu initialises à 0 et qui est détruite aussitôt, car la portée d'une variable est limitée au bloc dans lequel elle est déclarée , c'est à dire entre l'accolade { qui précède et l'accolade } correspondante. Cette variable n'existe qu'entre ces deux accolades, et cache la variable monstre définie à l'extérieur des accolades.
Pour initialiser la variable dans les accolades, il suffit d'une affectation
monstre = 0;
, il ne faut pas redéfinir monstre.

Voir le 4e exemple du paragraphe IV-A qui correspond exactement à ton cas :
https://www.squalenet.net/fr/ti/tutorial_c/6-variables-type-declaration-portee.php5
0
Ok merci ça fonctionne.
0