shinohinata01
Messages postés18Date d'inscriptionjeudi 18 janvier 2007StatutMembreDernière intervention 8 avril 2007
-
5 avril 2007 à 15:14
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 2010
-
8 avril 2007 à 17:37
Bonjour,
nous rencontrons actuellement un problème sur un de nos programmes qui traite d'un jeux d'échec.
en gros nous avons une fonction dans une classe qui doit déplacer des pièces sur l'échéquier mais il nous met des erreurs comme celle-ci au moment de l'affectation des déplacement de variable :
error C2109: subscript requires array or pointer type
Nous ne nous souvenons plus comment les résoudre...
voila notre bout de code qui pose problème
*************************************************
// piece1.cpp: implementation of the piece class.
//
//////////////////////////////////////////////////////////////////////
et voila la classe ou notre tableau a été déclaré et initialisé :
***************************************************
// partie.h: interface for the partie class.
//
//////////////////////////////////////////////////////////////////////
//Destructeur de la classe
virtual ~Partie(){
cout<<"appel du ~Partie"<<endl; if( j1 NULL && j2 NULL){
delete [] date;
cout<<"destruction de la partie"<<endl;
}
};
yann_lo_san
Messages postés1137Date d'inscriptionlundi 17 novembre 2003StatutMembreDernière intervention23 janvier 201626 5 avril 2007 à 15:28
Tu peux essayer de déclare E comme ceci :
char E[7][7]; // enlever operateur *
Car je ne vois pas ou cela peut nécessiter un pointeur vers un tableau de char à 2 dimentions.
Sinon il aurait fallu faire :
*(E[X2][Y2]) = *(E[X1][Y1]);
shinohinata01
Messages postés18Date d'inscriptionjeudi 18 janvier 2007StatutMembreDernière intervention 8 avril 2007 5 avril 2007 à 15:32
après modification on obtient toujours nos 9erreurs et nos 2warnings :
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\piece1.h(31) : warning C4183: 'piece': member function definition looks like a ctor, but name does not match enclosing class
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\piece1.h(36) : warning C4154: deletion of an array expression; conversion to pointer supplied
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\piece1.cpp(13) : error C2065: 'E' : undeclared identifier
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\piece1.cpp(13) : error C2109: subscript requires array or pointer type
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\piece1.cpp(13) : error C2109: subscript requires array or pointer type
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\piece1.cpp(13) : error C2109: subscript requires array or pointer type
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\piece1.cpp(13) : error C2109: subscript requires array or pointer type
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\piece1.cpp(13) : error C2106: '=' : left operand must be l-value
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\piece1.cpp(14) : error C2109: subscript requires array or pointer type
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\piece1.cpp(14) : error C2109: subscript requires array or pointer type
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\piece1.cpp(14) : error C2106: '=' : left operand must be l-value
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 5 avril 2007 à 17:19
Apparement il reconnaît pas E tout simplement:
d'ailleurs je comprends pas trop votre code non plus : E est un tableau déclaré dans une classe
donc quand vous l'utilisez dans piece1.cpp, il faut mentionner la classe à laquelle il appartient partie1.E[x][y] par exemple
Vous n’avez pas trouvé la réponse que vous recherchez ?
shinohinata01
Messages postés18Date d'inscriptionjeudi 18 janvier 2007StatutMembreDernière intervention 8 avril 2007 5 avril 2007 à 23:43
merci a juju 12 qui a réglé le problème mais maintenant il nous sort cette erreur qui n'est pas logique du tout :
C:\Documents and Settings\mugiw@r@ no luffy\Bureau\POO\poo\jglkdfj\echec vv2.2\piece1.cpp(23) : error C2143: syntax error : missing ';' before '.'
et je voulais savoir également si avec les tableaux que nous avons fait un utilisateur pourra bien rentrer les coordonnées d'une nouvelle case et donc faire avancer la pièce dans cette autre endroit du tableau que l'on a créé tout en remettant la valeur de la case a null?
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 6 avril 2007 à 11:20
Je pense que l'objet n'est pas défini. Avez-vous pensé à déclarer la partie, genre Partie partie1?
De plus, avis personnel : votre définition des classes me paraît un peu étrange, pourquoi pas une classe Echiquier contenant un tableau de classes Piece?
shinohinata01
Messages postés18Date d'inscriptionjeudi 18 janvier 2007StatutMembreDernière intervention 8 avril 2007 6 avril 2007 à 11:33
mais le probleme c'est que chaque piece devra etre différencier de part sa couleur et de part sa fonction (pion, fou, tour,...) comment la case du tableau saura que c'est un fou ou une tour a l'intérieur???
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 6 avril 2007 à 11:38
Ca dépend de l'architecture de votre projet...vous pouvez toujours mettre une fonction GetType dans la classe Piece qui renverra le nom de la pièce...Enfin il y a plusieurs manières d'envisager la chose.
shinohinata01
Messages postés18Date d'inscriptionjeudi 18 janvier 2007StatutMembreDernière intervention 8 avril 2007 6 avril 2007 à 11:54
car nous on été parti pour faire une autre classe ou d'autre classes qui prendrait en héritage la classe pièce.
Puis dans les classes qui auraient pris la classe piece en héritage on aurait fait pour chacune quelques fonctions qui aurait différencié chaque classe en une piece distincte de l'échéquier genre une classe héritant de piece qui serait une classe pion, puis une autre tour,....
void initialisation();
//Affiche le joueur!
void afficherJoueur(void);
//Arrêter la partie
int arreterpartie(Partie * partie);
//Destructeur de classe
virtual ~Joueur(void) {
cout<<"appel du ~Joueur"<<endl;
if (nom!= NULL) {
delete[]nom;
//cout<<"destruction de nomjoueur"<<endl;
}
}
};
#endif // !defined(AFX_JOUEUR_H__198C296E_02BD_4909_A7C7_39BB0F405BF5__INCLUDED_)
// partie.cpp: implementation of the partie class.
//
//////////////////////////////////////////////////////////////////////
//Destructeur de la classe
virtual ~Partie(){
cout<<"appel du ~Partie"<<endl; if( j1 NULL && j2 NULL){
delete [] date;
cout<<"destruction de la partie"<<endl;
}
};
--------------------Configuration: Echec - Win32 Debug--------------------
Compiling...
piece1.cpp
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\piece1.cpp(21) : error C2143: syntax error : missing ')' before '.'
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\piece1.cpp(21) : error C2143: syntax error : missing ';' before '.'
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\piece1.cpp(21) : error C2059: syntax error : ')'
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\piece1.cpp(22) : error C2143: syntax error : missing ';' before '{'
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\piece1.cpp(23) : error C2143: syntax error : missing ';' before '.'
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\piece1.cpp(23) : error C2143: syntax error : missing ';' before '.'
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\piece1.cpp(24) : error C2143: syntax error : missing ';' before '.'
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\piece1.cpp(24) : error C2143: syntax error : missing ';' before '.'
foutour.cpp
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\foutour.h(12) : error C2504: 'Piece' : base class undefined
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\foutour.h(25) : error C2504: 'Piece' : base class undefined
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\foutour.h(38) : error C2504: 'Piece' : base class undefined
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\foutour.h(51) : error C2504: 'Piece' : base class undefined
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\foutour.h(63) : error C2504: 'Piece' : base class undefined
c:\documents and settings\mugiw@r@ no luffy\bureau\poo\poo\jglkdfj\echec vv2.2\foutour.h(73) : error C2504: 'Piece' : base class undefined
Error executing cl.exe.
Echec.exe - 14 error(s), 0 warning(s)
Voila vous avez tous les éléments en main pour pouvoir me répondre!!
int main()
{
system("color 2E");
int joueur_libre =0;
int partie_libre =0;
char * nom=new char [20];
char * date=new char [20];
int choice, test;
test=0;
while (1)
{
cout<<"\t \t \t Menu"<<endl;
cout<<"\t\t1 pour creer votre joueur."<<endl;
cout<<"\t\t2 pour creer votre partie!!"<<endl;
cout<<"\t\t3 Pour afficher un joueur ^-^."<<endl;
cout<<"\t\t4 Pour afficher une belle et jolie partie"<<endl;
cout<<"\t\t5 Suppression d'une partie"<<endl;
cout<<"\t\t6 Suppression d'un joueur"<<endl;
cout<<"\t\t7 Affecter un joueur a une partie"<<endl;
cout<<"\t\t8 Lancement de la partie de votre choix"<<endl;
cout<<"\t\t9 pour.quitter la partie."<<endl;
cout<<"\t\t10 pour quitter le jeu."<<endl;
cout<<"\n";
cout<<"Entrer votre choix !!!!! :"<<endl;
cin>>choice;
cout<<"\n";
switch (choice)
{
case 1:
{cout<<"Tapez le nom du joueur"<<endl;
cin>>nom;
int i=0;
while (i<MAX_JOUEURS)
{
if(lesJoueurs[i]==NULL) {lesJoueurs[i]= new Joueur(nom); break;}
i++;
}
if (i!= MAX_JOUEURS) {cout<<"le joueur numero "<<joueur_libre<<" est "<<lesJoueurs[joueur_libre]->getnom()<<" a ete cree"<<endl;
}
else
cout<<"nombre de joueurs max est atteint, impossible de creer un nouveau joueur"<<endl;
break;}
case 2: if (partie_libre< MAX_PARTIES ) {
cout<<"Tapez une date jj/mm/yy"<<endl;
cin>>date;
Partie * partie= new Partie(date);
lesParties[partie_libre]= partie;
cout<<"la partie numero "<getdate()<<" a ete cree"<<endl;
partie_libre=partie_libre+1;
}
else
cout<<"nombre de parties max est atteint, impossible de créer une nouvelle partie"<<endl;
break;
case 3 : int saisie;
cout <<"Entrez le numero du joueur que vous voulez afficher"<<endl;
cin >>saisie;
if (lesJoueurs[saisie] != NULL)
lesJoueurs[saisie]->afficherJoueur();
else
cout<<" le joueur n'existe pas"<<'\n';
break;
case 4 : int saisie1;
cout <<"Entrez le numero de la partie que vous voulez afficher"<<endl;
cin >>saisie1;
if (lesParties[saisie1] != NULL)
lesParties[saisie1]->afficherPartie();
else
cout<<"la partie n'existe pas"<<'\n';
break;
case 5 : int number;
cout<<"Suppression d'une partie"<<endl;
cout<<"Entrer le numéro de la partie"<<endl;
cin>>number;
if (number < partie_libre) {
delete lesParties[number];
// si ce n'est pas le dernier
if (number < partie_libre -1)
lesParties[number]=lesParties[partie_libre -1];
lesParties[partie_libre -1]=NULL;
partie_libre = partie_libre -1;
}
break;
case 6 : int saisie2;
cout <<"Entrez le numero du joueur que vous voulez supprimer"<<endl;
cin >>saisie2;
if ( saisie2 < joueur_libre ) {
delete lesJoueurs[saisie2];
//si ce n'est pas le dernier
if (saisie2 < joueur_libre - 1) {
lesJoueurs[saisie2]=lesJoueurs[joueur_libre - 1];
}
lesJoueurs[joueur_libre - 1] = NULL;
joueur_libre = joueur_libre - 1;
}
break;
case 7 :
int numJoueur;
int numPartie;
int resultat;
cout <<"Entrez le numero de la partie que vous voulez modifier"<<endl;
cin >>numPartie;
cout <<"Entrez le numero du joueur que vous voulez modifier"<<endl;
cin >>numJoueur;
resultat=lesJoueurs[numJoueur]->setpartie(* lesParties[numPartie]);
switch (resultat) {
case 0: {
cout<<"AfFeCtAtIoN rEuSsI "<<'\n';
break;
}
case 1: {
cout<<"le joueur participe deja a 5 parties"<<'\n';
break;
}
case 2: {
cout<<"la partie a deja 2 joueurs"<<'\n';
break;
}
}
break;
case 8:
int saisie4;
cout <<"Entrez le numero de la partie que vous voulez jouer"<<endl;
cin >>saisie4;
if (lesParties[saisie4]!=NULL)
{
lesParties[saisie4]->initechiquier();
lesParties[saisie4]->afficherechiquier();
}
break;
case 9 :
int saisie3;
cout <<"Entrez le numero de la partie que vous voulez arreter"<<endl;
cin >>saisie3;
if (saisie3 < partie_libre) {
lesParties[saisie3]->terminer();
}
break;
case 10 : test = 1;
//exit (0);
break;
default : cout<<"Erreur, veuillez taper un autre chiffre"<<endl;
}
shinohinata01
Messages postés18Date d'inscriptionjeudi 18 janvier 2007StatutMembreDernière intervention 8 avril 2007 7 avril 2007 à 18:21
J'ai retiré la réponse qui avait été accepter car en faite celle-ci ne fonctionne pas il nous reste des erreurs.Je vais d'abord vosu redournir le morceau de code qui pose toujours problème puis les erreurs qui vont avec! :
acx01b
Messages postés280Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention 8 juillet 20146 7 avril 2007 à 19:57
mais lol
bon déja ton constructeur de Piece il s'appelle piece(int,int,char)
déja ça me parait bizzare pourquoi il s'appelle pas Piece(int,int,char)
ensuite je n'ai pas vu où tu créais des pieces dans ton code!!!
enfin je te propose une implémentation:
la classe Partie gère les pièces, elle a donc un tableau de Piece* qu'elle initialise dans la fonction initialisation où sinon dans le constructeur
ce tableau de Piece* c'est: Piece *echiquier[8][8];
si echiquier[i][j] = NULL alors la case i j est vide
si echiquier[i][j] != NULL alors echiquier[i][j] pointe vers la pièce qu'il y a à la case i j
chaque Piece a un lien vers la Partie à laquelle elle appartient: un champ
Partie &partie; le constructeur de Piece serait donc Piece(int,int,char,Partie&)
donc si tu veux modifier l'échiquier à partir d'une pièce tu peux faire
partie.echiquier[i][j] = ... // un pointeur vers Piece
pour manger une pièce tu peux faire : delete partie.echiquier[i][j];
chaque joueur a un tableau de pointeurs vers ses différentes Partie, là je suis d'accord avec ton code
acx01b
Messages postés280Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention 8 juillet 20146 7 avril 2007 à 20:01
ha oui j'oubliais:
la méthode
bool bouger_piece(int i_from, int j_from, int i_dst, int j_dst)
renverrait false si couleur_piece(i_from,j_from) == couleur(i_to,j_to)
et false si echiquier[i][j]->bouger_piece(i_dst,j_dst) est false
echiquier[i][j]->bouger_piece serait une méthode de la classe Piece: une méthode virtuelle pure, et définit différemment dans Tour, Roi, Rein, Pion ...
acx01b
Messages postés280Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention 8 juillet 20146 8 avril 2007 à 11:50
salut mec
tu aurais dû t'entraîner plus en C++ avant de te lancer dans un projet comme celui là! (qui pourrait très bien être fait en C d'une manière pas plus compliquée, avec un switch(piece.type) par exemple)
en gros voilà ce que je ferais:
class Joueur
{
private:
Partie * parties[5];
public:
Joueur(char * n);
int setpartie(Partie & partie);
Partie * getpartie(int i);
void initialisation();
int arreterpartie(Partie * partie);
virtual ~Joueur(void);
};
class Partie
{
friend class Piece;
private:
int nombre_de_pieces[2];
Joueur &j1;
Joueur &j2;
Piece *echiquier[8][8];
public:
Partie(Joueur &j1,Joueur &j2);
bool move(int x1, int y1, int x2, int y2);
void draw();
void initechiquier();
~Partie();
bool est_terminee();
};
enum { BLANC=0, NOIR=1 };
class Piece
{
protected :
int _x;
int _y;
char coul;
char * _nom;
int equipe;
void *draw_data;
Partie &partie;
public:
piece(int x,int y, int equipe);
~Piece(void);
void get_pos(int *x, int *y);
virtual void move(int x, int y)=0;
int get_equipe();
};
class Tour: public Piece{
public:
Tour(int x,int y, int equipe);
~Tour();
void move(int x, int y);
};
class Fou: public Piece{
public:
Fou(int x,int y, int equipe);
~Fou();
void move(int x, int y);
};
bool Partie::move(int x1, int y1, int x2, int y2) {
if (echiquier[x1][y1]->get_equipe() == echiquier[x2][y2]->get_equipe()) return false;
return echiquier[x1][y1]->move(x2,y2);
}
bool Tour::move(int x, int y) {
if (x != _x && y != _y) return false;
if (partie.echiquier[x][y] != null) {
partie.nombre_de_pieces[equipe]--;
delete partie.echiquier[x][y];
}
partie.echiquier[x][y] = this;
partie.echiquier[_x][_y] = null;
return true;
}
#define VALEUR_ABSOLUE(X) (((X) > 0) ? (X) : - (X))
bool Fou::move(int x, int y) {
if (VALEUR_ABSOLUE(_x - x) != VALEUR_ABSOLUE(_y - y)) return false;
if (partie.echiquier[x][y] != null) {
partie.nombre_de_pieces[equipe]--;
delete partie.echiquier[x][y];
}
partie.echiquier[x][y] = this;
partie.echiquier[_x][_y] = null;
return true;
}