Signaler

Probleme POO jeu de stratégie [Résolu]

Posez votre question toufeux 40Messages postés vendredi 24 février 2017Date d'inscription 8 juillet 2017 Dernière intervention - Dernière réponse le 4 juil. 2017 à 20:11 par toufeux
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
Afficher la suite 
Utile
+0
plus moins
Bonjour toufeux,

Peux-tu nous montrer comment tu crées t'es objets ?
toufeux 40Messages postés vendredi 24 février 2017Date d'inscription 8 juillet 2017 Dernière intervention - 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");
Répondre
Donnez votre avis
Utile
+0
plus moins
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, ...)
toufeux 40Messages postés vendredi 24 février 2017Date d'inscription 8 juillet 2017 Dernière intervention - 1 juil. 2017 à 11:47
J'utilise le debugger de code block mais il me dit rien :(
Répondre
Donnez votre avis
Utile
+0
plus moins
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 !
toufeux 40Messages postés vendredi 24 février 2017Date d'inscription 8 juillet 2017 Dernière intervention - 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 .
Répondre
Felice_ 266Messages postés mardi 25 avril 2017Date d'inscription 20 juillet 2017 Dernière intervention - 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 ?
Répondre
toufeux 40Messages postés vendredi 24 février 2017Date d'inscription 8 juillet 2017 Dernière intervention - 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 ?
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !