[c++] Jeu d'échec - Pointeurs ...

Bonsoir à tous !
Voilà, je suis en train de développer un jeu d'échec (simplement en mode terminal pour le moment), et j'ai un petit problème de compréhension.

J'ai créé plusieurs classes :
main, debutPartie, echiquier, case, piece, pion

La classe Echiquier a simplement un tableau[][] de Case.
La classe Case a un pointeur sur une Piece : (Piece *m_piece)
La classe Piece a m_couleur, m_posLigne, m_posCol (coordonnées en fait)
La classe Pion (hérité de Piece) a juste : m_nomPion

Je n'arrive pas à faire le cheminement, à comprendre, comment associer, chaque case à une Piéce de départ (pour le moment juste 2 lignes de pions en fait).

Je pensais faire quelque chose de ce style :

Case casePlateau [2][1].(m_piece->m_nomPion)

Je ne sais pas si je suis assez clair ...
Je met mon code si ça peut aider ...

case,cpp
#include "case.h"
#include "piece.h"
#include "pion.h"


//constructeur, pas de retour
Case::Case()
{
	m_piece = new Piece;
}

/*
 Case::~Case()
{
	delete m_piece;
}
 */

void Case::setPiece(Piece nomPiece)
{
	m_piece = &nomPiece;
}

Piece Case::getPiece()
{
	return *m_piece;
}

debutPartie.cpp
#include "debutPartie.h"
#include "echiquier.h"


DebutPartie::DebutPartie()
{
	Echiquier();
	
}

void DebutPartie::lancer()
{
	
	
	//methode deplacer
	// alterne le tour 
	//juska findepartie() true
	
}



echiquier.cpp
#include <iostream>
#include <string>
#include "echiquier.h"
#include "piece.h"
#include "case.h"
#include "pion.h"


using namespace std;

Echiquier::Echiquier()
{
	int ligne = 0;
	int col = 0;
	Case casePlateau[ligne][col];
	
	Pion PN1 ;
	PN1.setNom("PN");
	casePlateau[2][1].setPiece(PN1);
	
       /********  CEST LA QUE CA COINCE  ***************************/
	std::cout << (casePlateau[2][1].getPiece()).getNom() << std::endl;


}

piece.cpp

#include "piece.h"f
#include <iostream>
#include <string>
using namespace std;


Piece::Piece()
{
	
	
}

char Piece::getCouleur()
{
	return m_couleur;
}

void Piece::setCouleur(char couleur)
{
	m_couleur = couleur;
}


int Piece::getPosLigne()
{
	return m_posLigne;
}

void Piece::setPosLigne (int ligne)
{
	m_posLigne = ligne;
}


int Piece::getPosCol()
{
	return m_posCol;
}

void Piece::setPosCol (int col)
{
	m_posCol = col;
}

string Piece::getNom()
{
	return m_nom;
}

void Piece::setNom(string nomp)
{
	m_nom = nomp;
}



pion.cpp
#include <iostream>
#include <string>
#include "pion.h"

using namespace std;

Pion::Pion() : Piece()
{
	

}

string Pion::getNom()
{
	return m_nom;
}

void Pion::setNom(string nomp)
{
	m_nom = nomp;
}


C'est donc dans échiquier, que je veux appeler le nom de mon pion, mais ça ne marche pas ...

Merci !
Configuration: Mac OS X / Firefox 3.5.8

5 réponses

  1. Contributeur
    Salut.
    Sans les .h, difficile de répondre. As tu pensé à déclarer ta fonction virtuelle ?
    Ton code est bien aéré et clair, mais pour la lecture à l'écran de ce site : trop de retours à la ligne, du coup on s'y perd un peu.
    0
    1. ma fonction virtuelle ? quezako ? je ne connais pas ...

      sinon voici les h :
      piece
      #ifndef DEF_PIECE
      #define DEF_PIECE
      #include <iostream>
      #include <string>
      using namespace std;
      
      class Piece
      {
      public:
      	Piece();
      	//~Piece();
      	
      	char getCouleur();
      	void setCouleur(char couleur);
      	int getPosLigne();
      	int getPosCol();
      	void setPosLigne(int ligne);
      	void setPosCol(int col);
      	
      	string getNom();
      	void setNom(string nomp);
      	
      	
      protected:
      	char m_couleur;
      	int m_posLigne;
      	int m_posCol;
      	string m_nom;
      
      	
      		
      };
      #endif


      echiquier
      #ifndef DEF_ECHI
      #define DEF_ECHI
      #include <iostream>
      #include <string>
      #include "case.h"
      using namespace std;
      
      
      class Echiquier
      { 
      public:
      	Echiquier();
      	
      protected:
      	string m_nomPiece;
      	Case casePlateau;
      
      }; 
      
      
      
      #endif


      case
      #ifndef DEF_CASE
      #define DEF_CASE
      #include "piece.h"
      #include "pion.h"
      
      class Case
      {
      public:
      	Case(); //constructeur
      	// destructeur ?
      	void setPiece(Piece nomPiece);
      	Piece getPiece();
      	
      protected:
      	// Joueur *m_joueur;
      	Piece *m_piece; //pointeur vers une piece
      	
      };
      #endif


      et enfin pion

      #ifndef DEF_PION
      #define DEF_PION
      #include <iostream>
      #include <string>
      #include "piece.h"
      
      using namespace std;
      
      class Pion : public Piece
      {
      public:
      	Pion();
      	string getNom();
      	void setNom(string nomp);
      	
      private:
      	string m_nom;
      };
      
      #endif
      0
      1. Contributeur
        Tu utilises l'héritage sans utiliser le polymorphisme, c'est dommage.
        Le mieux c'est que tu te renseigne sur le polymorphisme, l'héritage et les fonctions virtuelles (virtual) en C++, je ne vais pas te refaire un cours ;-)
        Dans ton programme Piece ET Pion ont toutes les deux un membre nommé m_nom (Piece::m_nom et Pion::m_nom), si tu ne déclares pas ta fonction getNom() virtuelle dans Piece, il ira chercher la fonction Piece::getNom (et donc Piece::m_nom) plutôt que la fonction Pion::getNom() (et donc Pion::m_nom).
        0
        1. ok merci ! voila une chose de plus que j'ai compris !
          le problème c'est que ça ça n'affiche rien :
          std::cout << (casePlateau[2][1].getPiece()).getNom() << std::endl;

          alors que ça oui
          std::cout << PN1.getNom() << std::endl;

          Pourtant PN1 devrait être dans casePlateau[2][1] ...
          0
          1. Contributeur
            ça c'est surement parceque tu stockes un objet et nom un pointeur.
            Si tu fais en sorte que l'appel se transforme en :
            (casePlateau[2][1].getPiece())->getNom()
            alors ça devrais fonctionner.
            0