Probleme POO jeu de stratégie
Résolu
toufeux
Messages postés
43
Date d'inscription
Statut
Membre
Dernière intervention
-
toufeux Messages postés 43 Date d'inscription Statut Membre Dernière intervention -
toufeux Messages postés 43 Date d'inscription Statut Membre Dernière intervention -
salut,
je suis en train de coder un petit jeu de stratégie :
mon problème est que lorsque j'appelle la fonction plus_Niveau_Mine() avec un objet (exemple joueur1.plus_Niveau_Mine()) la fonction s'applique sur un autre objet comme si je faisait joueur2.plus_Niveau_Mine().
Quelqu’un aurait une idée pourquoi ça fait ?
Merci d'avance pour vos réponse
je suis en train de coder un petit jeu de stratégie :
void Personnage::plus_Niveau_Mine() { int saisieTouche(0); if(m_argent < m_prix_Mine || m_niveau_Mine == 3) { std::cout<< "amelioration impossible"<< std::endl; } if(m_argent >= m_prix_Mine || m_niveau_Mine < 3) { system("cls"); std::cout<< "nom :"<< m_nom<< "pays :"<< m_pays<< std::endl; std::cout<< std::endl; std::cout<< "L'amelioration de vos troupe coute "<< m_prix_Mine<<"$"<< std::endl; std::cout<< "Presse SUPPR. pour revenir au menu"<< std::endl; std::cout<< "Presse ENTRER pour continer"<< std::endl; saisieTouche = getch(); switch(saisieTouche) { case ENTER: m_argent = m_argent - m_prix_Mine; m_prix_Mine = m_prix_Mine + 300; m_rendement_Mine = m_rendement_Mine + (m_rendement_Mine / 2); m_niveau_Mine ++; std::cout<< "Vos troupes sont niveaux "<< m_niveau_Mine<< std::endl; getch(); break; case BACK_SPACE: std::cout<<" retour au menu"<< std::endl; getch(); system("cls"); break; } } }
mon problème est que lorsque j'appelle la fonction plus_Niveau_Mine() avec un objet (exemple joueur1.plus_Niveau_Mine()) la fonction s'applique sur un autre objet comme si je faisait joueur2.plus_Niveau_Mine().
Quelqu’un aurait une idée pourquoi ça fait ?
Merci d'avance pour vos réponse
A voir également:
- Probleme POO jeu de stratégie
- 94 jeu - Télécharger - Puzzle & Réflexion
- 94 degrés jeu - Télécharger - Divers Jeux
- Jeu zuma - Télécharger - Jeux vidéo
- Logo jeu - Télécharger - Jeux vidéo
- Jeux de moto: jeu de course 3d - Télécharger - Course
3 réponses
Bonjour toufeux,
Peux-tu nous montrer comment tu crées t'es objets ?
Peux-tu nous montrer comment tu crées t'es objets ?
toufeux
Messages postés
43
Date d'inscription
Statut
Membre
Dernière intervention
le constructueur :
Bonjour,
Ce qui amène des objets à écrire en dehors de leur contexte, se sont des U.B. (undefined behaviour), il n'y en a apparemment pas dans ce code.
Il faut utiliser un debugger et rechercher à quel moment les données utilisées ne sont pas les bonnes. C'est certainement dans le code qui appelle cette fonction qu'il faut rechercher (utilisation d'un tableau en dehors de ses indices valides, écriture dans une mémoire non alouée, ...)
Ce qui amène des objets à écrire en dehors de leur contexte, se sont des U.B. (undefined behaviour), il n'y en a apparemment pas dans ce code.
Il faut utiliser un debugger et rechercher à quel moment les données utilisées ne sont pas les bonnes. C'est certainement dans le code qui appelle cette fonction qu'il faut rechercher (utilisation d'un tableau en dehors de ses indices valides, écriture dans une mémoire non alouée, ...)
Bonjour,
Est-ce qu'il n'y aurait pas des static qui se promènerait dans le code ?
NB. Il serait utile que tu nous transmette le code complet qui permette de reproduire le bug... là on joue aux devinettes !La confiance n'exclut pas le contrôle
Est-ce qu'il n'y aurait pas des static qui se promènerait dans le code ?
NB. Il serait utile que tu nous transmette le code complet qui permette de reproduire le bug... là on joue aux devinettes !La confiance n'exclut pas le contrôle
merci pour ta réponse rapide.
Non il n'y a pas de de static qui se balade dans le code, par contre tu veux quelle partie de mon code ?
fichier gestionJeux.cpp :
fichier Personnage.cpp :
fichier Personnage.h :
PS : je suis novice en programmation donc je pense que tu trouveras un certain nombre d’erreurs .
Non il n'y a pas de de static qui se balade dans le code, par contre tu veux quelle partie de mon code ?
fichier gestionJeux.cpp :
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <fstream>
#include "Personnage.h"
void gotoxy(int x, int y)
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
Personnage joueur1 (1, "test1", "tes1"), joueur2(0, "test2", "tes2");
void Personnage::selecteur()
{
system("cls");
int choix(0);
std::cout<< "nom :"<< m_nom<< "\t pays :"<< m_pays<< std::endl;
std::cout<< std::endl;
gotoxy(2, 9);
afficher_Etat();
gotoxy(2, 3);
std::ifstream selecteurG("selecteurG.txt");
if(selecteurG)
{
std::string lecture("");
while(std::getline(selecteurG, lecture))
{
std::cout<< lecture<< std::endl;
}
}
else
std::cout<< "ERREUR: impossible d'ouvrir le fichier"<< std::endl;std::cin>> choix;
switch(m_difference)
{
case 0:
switch(choix)
{
case 1: joueur1.affichage_A();
break;
case 2: joueur1.affichage_P();
break;
case 3:
break;
}
case 1:
switch(choix)Personnage::Personnage(int difference, std::string nom, std::string pays)
{
m_argent = 2500;
m_troupe = 500;
m_main_Oeuvre = 100;
m_rendement_Mine = 2,1;
m_difference = difference;
m_prison = 0;
m_progression = 0;
m_nombre_Mine = 1;
m_niveau_Troupe = 1;
m_nom = nom;
m_pays = pays;
m_prix_Mine = 1200;
m_prix_Troupe = 1300;
}
{
case 1: joueur2.affichage_A();
break;
case 2: joueur2.affichage_P();
break;
case 3:
break;
}
}
}
void Personnage::affichage_A()
{
system("cls");
int choix(0);
std::cout<< "nom"<< joueur1.m_nom<< "\t pays :"<< joueur1.m_pays<< std::endl;
std::cout<< std::endl;
gotoxy(2,9);
joueur1.afficher_Etat();
gotoxy(2, 3);
std::ifstream selecteurA("selecteurA.txt");
if(selecteurA)
{
std::string lecture("");
while(std::getline(selecteurA, lecture))
{
std::cout<< lecture<< std::endl;
}
}
else
std::cout<< "ERREUR: impossible d'ouvrir le fichier"<< std::endl;std::cin>> choix;
switch(m_difference)
{
case 0:
switch(choix)
{
case 1: joueur1.moins_Troupe(joueur2);
break;
case 2: joueur1.plus_Troupe();
break;
case 3: joueur1.plus_Niveau_Troupe();
break;
case 4: break;
default: std::cout<< "ERREUR: choix incorecte"<< std::endl;
getPersonnage::Personnage(int difference, std::string nom, std::string pays)
{
m_argent = 2500;
m_troupe = 500;
m_main_Oeuvre = 100;
m_rendement_Mine = 2,1;
m_difference = difference;
m_prison = 0;
m_progression = 0;
m_nombre_Mine = 1;
m_niveau_Troupe = 1;
m_nom = nom;
m_pays = pays;
m_prix_Mine = 1200;
m_prix_Troupe = 1300;
}ch();
break;
}
break;
case 1:
switch(choix)
{
case 1: joueur2.moins_Troupe(joueur1);
break;
case 2: joueur2.plus_Troupe();
break;
case 3: joueur2.plus_Niveau_Troupe();
break;
case 4: break;
default: std::cout<< "ERREUR: choix incorecte"<< std::endl;
getch();
break;
}
break;
}
}
void Personnage::affichage_P()
{
system("cls");
int choix(0);
std::cout<< "nom :"<< joueur1.m_nom<< "\t pays :"<< joueur1.m_pays<< std::endl;
std::cout<< std::endl;
gotoxy(2,9);
joueur1.afficher_Etat();
gotoxy(2, 3);
std::ifstream selecteurP("selecteurP.txt");
if(selecteurP)
{
std::string lecture("");
while(std::getline(selecteurP, lecture))
{
std::cout<< lecture<< std::endl;
}
}
else
std::cout<< "ERREUR: impossible d'ouvrir le fichier"<< std::endl;std::cin>> choix;
switch(m_difference)
{
case 0:
switch(choix)
{
case 1: joueur2.plus_Mine();
break;
case 2: joueur2.liberer_Prisonier(joueur1);
break;
case 3: joueur2.desarmement(joueur1);
break;
case 4: break;
default: std::cout<< "ERREUR: choix incorect"<< std::endl;
break;
}
case 1:
switch(choix)
{
case 1: joueur1.plus_Mine();
break;
case 2: joueur1.liberer_Prisonier(joueur2);
break;
case 3: joueur1.desarmement(joueur2);
break;
case 4: break;
default: std::cout<< "ERREUR: choix incorect"<< std::endl;
break;
}
break;
}
}
int jeu_2pers()
{
joueur1.get_Nom();
joueur2.get_Nom();
while(joueur1.gagne() != true || joueur2.gagne() != true)
{
joueur1.selecteur();
joueur1.plus_Argent();
if(joueur1.gagne() == true)
{
system("cls");
std::cout<< "le joueur 1 a gagne cette partie"<< std::endl;
break;
}
joueur2.selecteur();
joueur2.plus_Argent();
if(joueur2.gagne() == true)
{
system("cls");
std::cout<< "le joueur 2 a gagne cette partie"<< std::endl;
break;
}
}
return 0;
}
fichier Personnage.cpp :
#include <iostream>
#include <windows.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#define ENTER 13
#define BACK_SPACE 8
#include "Personnage.h"
Personnage::Personnage(int difference, std::string nom, std::string pays)
{
m_argent = 2500;
m_troupe = 500;
m_main_Oeuvre = 100;
m_rendement_Mine = 2,1;
m_difference = difference;
m_prison = 0;
m_progression = 0;
m_nombre_Mine = 1;
m_niveau_Troupe = 1;
m_nom = nom;
m_pays = pays;
m_prix_Mine = 1200;
m_prix_Troupe = 1300;
}
void Personnage::moins_Troupe(Personnage& cible)
{
srand(time(0));
int bataille(rand() % 31);
if(m_argent < 3000 )
{
std::cout<< "Vous n'avez pas asseze d'argent"<< std::endl; // si m_argent < a 3000
getch();
}
if(m_troupe <= 0) // si m_troupe = 0
{
std::cout<< "Vous n'avez pas de troupe"<< std::endl;
}
if(m_argent >= 3000 && m_troupe > 0) //si toute les conditions sont validées
{
m_argent = m_argent - 3000;
int chance(0);
switch(m_niveau_Troupe) // affection des chance de réussite suivant m_niveau_Troupe
{
case 1: chance = 5;
break;
case 2: chance = 15;
break;
case 3: chance = 20;
break;
}
if (cible.m_troupe > m_troupe) // révaluation des chances si m_troupe < a cible.m_troupe
{
switch(m_niveau_Troupe)
{
case 1: chance = chance - rand() % 4;
break;
case 2: chance = chance - rand() % 11;
break;
case 3: chance = chance - rand() % 16;
break;
}
}
if(chance <= bataille) // si joueurAPPELER gagne
{
m_prison = cible.m_troupe - m_troupe;
if(cible.m_prison <= 0)
{
m_prison = 0;
cible.m_troupe = 0;
std::cout<< "Vous avez fait un carnage ..."<< std::endl;
std::cout<< "Vous n'avez fait aucun prisonier."<< std::endl;
getch();
}
else if(m_prison > 0)
{
cible.m_troupe = cible.m_troupe - m_prison;
m_prison = m_prison - rand() % m_prison;
std::cout<< "Vous avez gagné !!!"<< std::endl;
std::cout<< "Vous avez fait "<< m_prison<< " prisonier(s)."<< std::endl;
getch();
}
}
if (chance >= bataille) // si joueurAPPELER perd
{
cible.m_prison = m_troupe - cible.m_troupe;
if(cible.m_prison <= 0)
{
cible.m_prison = 0;
m_troupe = 0;
std::cout<< "C'est une defaite ..."<< std::endl;
std::cout<< "Vous vous etes fait defoncer"<< std::endl;
getch();
}
else if(cible.m_prison > 0)
{
m_troupe = m_troupe - cible.m_prison;
cible.m_prison = cible.m_prison - rand() % cible.m_prison;
std::cout<< "Vous avez perdu !!!"<< std::endl;
std::cout<< "Vous avez perdu "<< cible.m_prison<< " soldat"<< std::endl;
getch();
}
}
}
}
void Personnage::desarmement(Personnage& cible)
{
srand(time(0));
int negociation(rand()%31);
if (m_argent < 1200)
{
std::cout<< "Vous n'avez pas assez d'argent !"<< std::endl;
}
if (m_argent >= 1200)
{
m_argent = m_argent - 1200;
if (negociation < 25)
{
cible.m_troupe = cible.m_troupe - rand()% 60;
std::cout<< "La conferance a reussit"<< std::endl;
m_progression = m_progression + 15;
}
else if(negociation > 25)
{
std::cout<< "La conferance a echoue"<< std::endl;
m_progression = m_progression + 5;
}
}
}
void Personnage::liberer_Prisonier(Personnage& cible)
{
srand(time(0));
if(m_argent < 2000)
{
std::cout<< "Vous n'avez pas assez d'argent"<< std::endl;
}
if(m_argent >= 2000)
{
int negociation(rand()% 31);
if(negociation < 20)
{
m_troupe = m_troupe + cible.m_prison;
cible.m_prison = 0;
m_progression = m_progression + 20;
std::cout<< "Les negociations ont reussi"<< std::endl;
getch();
}
if(negociation >= 20)
{
std::cout<< "Les negocition ont echoue"<< std::endl;
getch();
}
}
}
void Personnage::plus_Mine()
{
int saisieTouche(0);
if(m_argent < m_prix_Mine || m_nombre_Mine == 3) // si on n'a pas assez d'argent ou assez de mine
{
std::cout<< "construction d'une mine supplementaire impossible"<< std::endl;
}
if(m_argent >= m_prix_Mine || m_nombre_Mine < 3)
{
system("cls");
std::cout<< "nom :"<< m_nom<< " pays :"<< m_pays<< std::endl;
std::cout<< std::endl;
std::cout<< "Appuye sur [ENTRER] pour construire une nouvelle mine"<< std::endl;
std::cout<< "Appuye sur [RETOUR ARRIERE] pour revenir au menu"<< std::endl;
saisieTouche = getch();
switch(saisieTouche)
{
case 13: // si on appuye sur [entrer]
m_argent = m_argent - m_prix_Mine;
m_prix_Mine = m_prix_Mine + (m_prix_Mine / 2);
m_nombre_Mine++;
std::cout<< "vous avez maintenant "<< m_nombre_Mine<< " mine"<< std::endl;
break;
case 8: // si on appuye sur retour arrière
selecteur();
break;
}
}
}
void Personnage::plus_Niveau_Troupe()
{
int saisieTouche(0);
if(m_argent < m_prix_Troupe || m_niveau_Troupe == 3)
{
std::cout<< "amelioration impossible"<< std::endl;
}
if(m_argent >= m_prix_Troupe || m_niveau_Troupe < 3)
{
system("cls");
std::cout<< "nom :"<< m_nom<< "pays :"<< m_pays<< std::endl;
std::cout<< std::endl;
std::cout<< "L'amelioration de vos troupe coute "<< m_prix_Troupe<<"$"<< std::endl;
std::cout<< "Presse SUPPR. pour revenir au menu"<< std::endl;
std::cout<< "Presse ENTRER pour continer"<< std::endl;
saisieTouche = getch();
switch(saisieTouche)
{
case ENTER:
m_argent = m_argent - m_prix_Troupe;
m_prix_Troupe = m_prix_Troupe + 300;
m_niveau_Troupe ++;
std::cout<< "Vos troupes sont niveaux "<< m_niveau_Troupe<< std::endl;
getch();
break;
case BACK_SPACE:
std::cout<<" retour au menu"<< std::endl;
getch();
system("cls");
break;
}
}
}
void Personnage::plus_Argent()
{
m_argent = m_argent + m_rendement_Mine * (m_main_Oeuvre + m_prison);
}
void Personnage::plus_Troupe()
{
int choix(0);
system("cls");
std::cout<< "nom :"<< m_nom<< " pays :"<< m_pays<< std::endl;
std::cout<< std::endl;
std::cout<< "1/ Former 250 troupe (300$)"<< std::endl;
std::cout<< "2/ Former 500 troupe (600$)"<< std::endl;
std::cout<< "choix :"; std::cin>> choix;
switch(choix)
{
case 1:
if(m_argent < 300)
{
std::cout<< "Vous n'avez pas assez d'argent"<< std::endl;
getch();
}
if(m_argent >= 300)
{
m_argent = m_argent - 300;
m_troupe = m_troupe + 250;
std::cout<< "Vous avez forme 250 troupes"<< std::endl;
getch();
}
break;
case 2:
if(m_argent < 600)
{
std::cout<< "Vous n'avez pas assez d'argent"<< std::endl;
getch();
}
if(m_argent >= 600)
{
m_argent = m_argent - 600;
m_troupe = m_troupe + 500;
std::cout<< "Vous avez forme 500 troupes"<< std::endl;
getch();
}
default:
std::cout<< "ERREUR"<< std::endl;
}
}
void Personnage::afficher_Etat()
{
std::cout<< std::endl;
std::cout<< "argent :"<< m_argent<< " niveau mine :"<< m_nombre_Mine<<std::endl;
std::cout<< "troupe :"<< m_troupe<< " niveau :"<< m_niveau_Troupe<<std::endl;
std::cout<< "prisonier(s) :"<< m_prison<< std::endl;
std::cout<< "progression :"<< m_progression<< "/100"<< std::endl;
for(int i=0; i<m_progression; i++)
{
std::cout<< "|";
}
}
void Personnage::get_Nom()
{
system("cls");
switch(m_difference)
{
case 0: std::cout<< "JOUEUR 2"<< std::endl;
break;
case 1: std::cout<< "JOUEUR 1"<< std::endl;
break;
}
std::cout<< "Entrer votre pseudo"<< std::endl;
std::cin>> m_nom;
std::cout<< "Entrer le nom de votre pays"<< std::endl;
std::cin>> m_pays;
std::cout<< "Touchez une touche pour continuer"<< std::endl;
getch();
}
bool Personnage::gagne()
{
if(m_progression >= 100)
{
m_progression = 100;
return true;
}
else
return false;
}
fichier Personnage.h :
#ifndef PERSONNAGE_H
#define PERSONNAGE_H
#include <string>
class Personnage
{
private :
int m_argent;
int m_progression;
int m_prison;
int m_main_Oeuvre;
int m_troupe;
int m_niveau_Troupe;
int m_nombre_Mine;
int m_prix_Mine;
int m_prix_Troupe;
int m_difference;
double m_rendement_Mine;
std::string m_nom;
std::string m_pays;
public :
void plus_Argent();
void plus_Troupe();
void moins_Troupe(Personnage &cible);
void liberer_Prisonier(Personnage &cible);
void plus_Niveau_Troupe();
void plus_Mine();
void desarmement(Personnage& cible);
void afficher_Etat();
void selecteur();
void affichage_A();
void affichage_P();
void get_Nom();
bool gagne();
Personnage(int difference, std::string nom, std::string pays);
};
#endif // PERSONNAGE_H
PS : je suis novice en programmation donc je pense que tu trouveras un certain nombre d’erreurs .
fichier main.cpp :
je ne pense pas que ça viens de là car il n'y a rien qui est lié .. Et qu'est-ce que tu veux dire dans Où est déclaré COORD, STD_OUTPUT_HANDLE ?
#include <iostream>
#include <conio.h>
#include <string>
#include <fstream>
#include <windows.h>
#include "Personnage.h"
int jeu_2pers();
int main()
{
SetConsoleTitle("CONQUERANT V0.0.3 controle pannel");
std::ifstream presantation("presantation.txt");
if(presantation)
{
std::string lecture("");
while(std::getline(presantation, lecture))
{
std::cout<< lecture<< std::endl;
}
getch();
system("cls");
jeu_2pers();
}
else
std::cout<< "ERREUR: impossible d'ouvrir le fichier"<< std::endl;
return 0;
}
je ne pense pas que ça viens de là car il n'y a rien qui est lié .. Et qu'est-ce que tu veux dire dans Où est déclaré COORD, STD_OUTPUT_HANDLE ?