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

timon44 Messages postés 56 Statut Membre -  
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   -
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. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    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
  2. timon44 Messages postés 56 Statut Membre 4
     
    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
  3. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    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
  4. timon44 Messages postés 56 Statut Membre 4
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    ç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