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

Fermé
timon44 Messages postés 53 Date d'inscription dimanche 28 décembre 2008 Statut Membre Dernière intervention 17 décembre 2010 - 22 févr. 2010 à 17:02
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 3 mars 2010 à 08:08
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 !
A voir également:

5 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
22 févr. 2010 à 17:14
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
timon44 Messages postés 53 Date d'inscription dimanche 28 décembre 2008 Statut Membre Dernière intervention 17 décembre 2010 4
22 févr. 2010 à 17:58
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
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
23 févr. 2010 à 08:07
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
timon44 Messages postés 53 Date d'inscription dimanche 28 décembre 2008 Statut Membre Dernière intervention 17 décembre 2010 4
2 mars 2010 à 17:58
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
3 mars 2010 à 08:08
ç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