Probleme POO jeu de stratégie

Résolu/Fermé
toufeux Messages postés 43 Date d'inscription vendredi 24 février 2017 Statut Membre Dernière intervention 28 novembre 2017 - 30 juin 2017 à 21:36
toufeux Messages postés 43 Date d'inscription vendredi 24 février 2017 Statut Membre Dernière intervention 28 novembre 2017 - 4 juil. 2017 à 20:11
salut,
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:

3 réponses

Felice_ Messages postés 265 Date d'inscription mardi 25 avril 2017 Statut Membre Dernière intervention 20 juillet 2017 11
1 juil. 2017 à 10:49
Bonjour toufeux,

Peux-tu nous montrer comment tu crées t'es objets ?
0
toufeux Messages postés 43 Date d'inscription vendredi 24 février 2017 Statut Membre Dernière intervention 28 novembre 2017
Modifié le 1 juil. 2017 à 11:45
le constructueur :

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;
}


Personnage joueur1 (1, "test1", "tes1"), joueur2(0, "test2", "tes2");
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
1 juil. 2017 à 11:32
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, ...)
0
toufeux Messages postés 43 Date d'inscription vendredi 24 février 2017 Statut Membre Dernière intervention 28 novembre 2017
1 juil. 2017 à 11:47
J'utilise le debugger de code block mais il me dit rien :(
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié le 1 juil. 2017 à 12:07
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
0
toufeux Messages postés 43 Date d'inscription vendredi 24 février 2017 Statut Membre Dernière intervention 28 novembre 2017
3 juil. 2017 à 09:18
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 :

#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 .
0
Felice_ Messages postés 265 Date d'inscription mardi 25 avril 2017 Statut Membre Dernière intervention 20 juillet 2017 11
3 juil. 2017 à 09:58
Outre les truc liés à Windows :-/.

Il nous manque des choses :
Où est ta fonction main ?
Où est déclaré COORD, STD_OUTPUT_HANDLE etc ?
0
toufeux Messages postés 43 Date d'inscription vendredi 24 février 2017 Statut Membre Dernière intervention 28 novembre 2017
4 juil. 2017 à 20:11
fichier main.cpp :

#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 ?
0