Projet jeux d'échecs : déplacement d'une pièce dans une case

Signaler
Messages postés
250
Date d'inscription
lundi 9 mars 2009
Statut
Membre
Dernière intervention
4 décembre 2013
-
Messages postés
92
Date d'inscription
samedi 26 mars 2005
Statut
Membre
Dernière intervention
23 septembre 2015
-
Bonjour à tous , je débute en C++ et je travaille sur projet de jeu d'échec en ce moment ; dans un premier je voulais simplifier les chose en mettant 3 classes .
en fait chaque case s'il est vide est marquée '_' (type char) à l'affichage et les pièces par exemple Pion devra être marqué 'P' .
mon problème c'est que j'arrive à déplacer une pièce d'une case vers une autre disons case 1 vers case 2 , mais dans case 1 l'étiquette marquant le pion reste toujours au lieu de '_' pour prouver que la case est vide après déplacement d'un pion tandis que dans case 2 il est bien marqué 'P'

voici le code :

// ProgrammeC.cpp : définit le point d'entrée pour l'application console.
//

#include "stdafx.h"
#include
#include<string>
using namespace std;

class Case {
private:
int x ; //ligne
int y ; //colonne
char etiq ; // etiquette pour savoir si c'est un pion P ou vide '_'

public:
// getters et setters 
int getX()const {return x;}
int getY()const {return y;}
void setX(int a){x =  a;}
void setY(int b){y=b;}
void setEtiq(char C){etiq = C;}
char getEtiq()const{return etiq;}

// constructeur 
Case();
Case(const Case& C); // constructeur par recopie je ne sais pas si la déclaration est bonne 
Case(int lig,int col,char etiqette);
~Case();
void Afficher();
ostream &operator<<(Case B); // surcharge de l'operateur << afin d'afficher une case
ostream &operator<<(Case* B); // on surcharge pour pouvoir afficher un pointeur sur Case
ostream &operator=(Case B);

};
// deinition des méthodes Case 
Case::Case():x(0),y(0),etiq('_'){}

Case::Case(const Case& D){

x= D.x;
y = D.y;
etiq = D.etiq;
}
Case::Case(int lig,int col,char etiqette):x(lig),y(col),etiq(etiqette){}

ostream &operator<<(ostream &out, Case B){


out << "ligne= "<getX() <<" "<<"colonne= " << B->getY() <<" "<<"etiquette= "<getEtiq()<< endl;
return out ;
}

void Case::Afficher(){

cout << "renseignement sur cette case" << *this << endl ;
}

Case::~Case(){}

// Class Piece 



class Piece {
protected:
Case place; // je pensais qu'une pièce pointe sur une case 
//char etiquette;

public:
Piece();
Piece(int li , int col);
~Piece();
Case getPiece()const{return place;}
//char Getetiquette()const{return etiquette;}
void setPiece( Case& B1){place = B1;}
     
void Afficher1();
//ostream &operator<<(Piece B) ;


};

Piece::Piece(){
//place = new Case();

//etiquette = 'P';

}	
Piece::Piece(int li, int col){
place.setX(li);
place.setY(col);

}
Piece::~Piece(){}	





   


void Piece::Afficher1(){

cout << "renseignement sur cette pièce " << "*this" << endl ;

}

/*
ostream &operator<<(ostream &out, Piece B){


out << "ligne= "<<(B.getPiece())->Afficher() << endl;
return out ;
}
*/	



// classe Pion : un pion est une pièce 
class Pion:public Piece {
private:
string couleur;
char etiquette ;
public:
Pion(string noir);
~Pion();
void setCouleur(string N){couleur = N;}
string getCouleur()const{return couleur;}
char getEtiquette()const{return etiquette;}

void Deplacer(int ligne , int colonne); // pour pouvoir le déplacer 
     void DeplacerCase(Case& B); // délacement à partir d'une case 




};

Pion::Pion(string noir){
Piece();// on fait appel au constructeur de base 
couleur = "noir";
etiquette = 'P';

}

 Pion::~Pion(){}

 void Pion::Deplacer(int ligne , int colonne){

Piece(ligne , colonne);
place.setEtiq(etiquette);

 }


 void Pion::DeplacerCase(Case& C1){
int ligne1;
//on change la case
ligne1 = C1.getX();
int colonne1 = C1.getY();
char eti = this->getEtiquette();

//on change la case précedente
place.setEtiq('_');
place.setX(ligne1);
place.setY(colonne1);
C1.setEtiq(this->getEtiquette());


}	

// more pointers
#include 
using namespace std;

int main ()
{
Case P1;
Case P2(2,3,'C');
P2.Afficher();
Pion P3("noir");
Pion P4("noir");
//P2.Deplacer(5,6);
P3.DeplacerCase(P2);
 
P1.Afficher();
P2.Afficher();
P3.DeplacerCase(P1); // ici le pion P3 se déplace  dans la case P1 
cout <<"après déplacement dans case P1" << endl ;
P1.Afficher();
P2.Afficher(); // ici normalement après déplacement de la case l'affichage devra être '_'

  
  return 0;
}




console :
renseignement sur cette caseligne= 2 colonne= 3 etiquette= C

renseignement sur cette caseligne= 0 colonne= 0 etiquette= _

renseignement sur cette caseligne= 2 colonne= 3 etiquette= P

aprÞs dÚplacement dans case P1
 renseignement sur cette caseligne= 0 colonne= 0 etiquette= P 

renseignement sur cette caseligne = 2 colonne= 3 etiquette= P

Appuyez sur une touche pour continuer...



vos remarques seront toujours les bienvenues , en fait dans case j'ai rajouté une étiquette , car après je dois encore faire un classe plateau composé de plusieurs cases et par défaut une case vide est marquée '_'

merci d'avance

3 réponses

Messages postés
92
Date d'inscription
samedi 26 mars 2005
Statut
Membre
Dernière intervention
23 septembre 2015

Dans ton 2eme déplacement, tu ne modifies pas la case P2, tu attribues a P1 l'étiquette de P3, mais comme tu n'as jamais dit à P3 que sa case est P2, P2 n'est pas modifiée quand tu redéplaces P3.

Vu que tu dois faire un plateau, autant que ce soit lui qui ait les cases et les pièces en statique et soit :
-les pièces ont des pointeurs sur les cases du plateau. Ainsi, quand tu déplacerais une pièce, elle pointerait sur sa nouvelle case
-les cases ont des pointeurs sur les pièces qui sont dessus (NULL quand pas de pièce)
-Les 2 en même temps


Coin coin !
Messages postés
250
Date d'inscription
lundi 9 mars 2009
Statut
Membre
Dernière intervention
4 décembre 2013

salut ,
oui mais quand tu dis j'attribue à P1 l'étiquette de P3 et vu que P3 est un pion avec etiquette 'P'l'étiquette de la case P1 sera aussi 'P' . et après qd je déplace vers une autre case en partant de P1 toujours le même pion comment faire pour que la case P1 reprenne son étiquette initiale '_' ??
Messages postés
92
Date d'inscription
samedi 26 mars 2005
Statut
Membre
Dernière intervention
23 septembre 2015

C'est pour ça que je pense qu'il faut que tu stockes tes cases en dur quelque part (classe plateau par exemple) et que tes pions n'aient qu'un pointeur sur leur case actuelle, du coup dans ta fonction DeplacerCase, tu peux faire ceci :
void Pion::DeplacerCase( Case * C1)
{
if (place != NULL)
{
place->setEtiq( '-');
}
place = C1;
if (place != NULL)
{
place->setEtiq( this->getEtiquette());
}
}



Coin coin !