Jump to content
Laurent GODEFROY

Mini-Projet de C++

Recommended Posts

Tu as raison il faut l'initialiser je m'en suis rendu compte quand j'ai tester ceci:

Ange::Ange()
{
    Plateau plateau = Plateau();
    ligne = plateau.getDim()/2;
    colonne = plateau.getDim()/2;
    cout<<ligne<<colonne<<endl;
}

si je le passe en paramètre au constructeur il sera initialisé pour toute les méthodes d'ange ?

 

enfaite si j'utilise la méthode en le passant en paramètre ça met une erreur : passing 'const Plateau' as 'this' argument of 'int Plateau::getDim()' discards qualifiers [-fpermissive].

Edited by Paul VENET

Share this post


Link to post
Share on other sites

 

 

si je le passe en paramètre au constructeur il sera initialisé pour toute les méthodes d'ange

 

Non, tu y auras accés uniquement s'il fait parti de ta classe en tant que variable membre et que tu l'initialises correctement.

 

 

 

passing 'const Plateau' as 'this' argument of 'int Plateau::getDim()' discards qualifiers [-fpermissive].

 

const-correctness: getDim() devrait être déclarée const.

Share this post


Link to post
Share on other sites

Salut,

 

Relit bien le sujet la il me semble que tu t'égare... ton objet de la classe Plateau est instancié dans la classe Partie et pas Ange.

 

Donc soit tu passe au constructeur de la classe Ange les valeurs de ligne et colonne, soit tu lui passe l'objet et tu appelle une méthode qui te retourne dim, ou encore par référence tu passe a une méthode de la classe Partie les variables ligne et colonne …. ou un pointeur ? Il y a plein de solutions ^^

Share this post


Link to post
Share on other sites

Bonjour.

Je suis d'accord avec toi mais dans la façon ou est tournée le sujet si on dev étape par étape en suivant l'ordre ou est écris le sujet c'est assez compliqué de si retrouver.

Share this post


Link to post
Share on other sites

Bonjour, j'ai de nouveau une question.

Dans la classe partie on déclare un tableau de deux joueurs.

Quand j'instancie une partie je fais ceci:

Partie::Partie(int l, string j1, string j2 )
{
    Plateau plateau = Plateau(l);
    Joueur *joueur = new Joueur[2];
}

j'essaye ensuite de convertir joueur[1] en ange mais je n'y arrive pas j'ai essayé ces queslques méthodes:

joueur[1] = Ange(j1, plateau.getDim()/2, plateau.getDim()/2);

joueur[1] = new Ange(j1, plateau.getDim()/2, plateau.getDim()/2);

joueur[1]->Ange(j1, plateau.getDim()/2, plateau.getDim()/2);

Ange joueur[1] = new Ange(j1, plateau.getDim()/2, plateau.getDim()/2);

Mais a chaque fois je me retrouve avec le message d'erreur comme quoi joueur[1] est un joueur.

 

Vous auriez une idée ?

 

Merci d'avance

Share this post


Link to post
Share on other sites

je pencherais plutôt pour cette methode

joueur[1] = new Ange(j1, plateau.getDim()/2, plateau.getDim()/2);

 de plus du créer ton ange et demon dans le constructeur de la partie.

quand je fais ça je me retrouve avec cette erreur : no match for 'operator=' (operand types are 'Joueur' and 'Ange*')|

Share this post


Link to post
Share on other sites

 

Visiblement, tu as déclaré un tableau de type Joueur et non Joueur*:

Joueur* joueurs[2] = {
    new Ange(j1, plateau.getDim() / 2, plateau.getDim() / 2),
    new Demon(j2)
};

d'accord mais dans le .h on déclare :

class Partie
{
    public:
        Partie();
        virtual ~Partie();
    protected:
    private:
        Plateau plateau;
        Joueur *joueur;

};

et non l'inverse.

 

Et quand je fais ce que tu m'a montré, lorsque que je fais :

joueur[1]->modifierCase(plateau.getDim()/2, plateau.getDim()/2);

Il ne le prend pas comme étant un ange mais comme étant un joueur

Share this post


Link to post
Share on other sites

Bah dans le .h, il suffit de déclarer Joueur *joueurs[2]; et non Joueur* joueur;

 

 

 

Il ne le prend pas comme étant un ange mais comme étant un joueur

 

As-tu bien respecté les règles inhérentes au polymorphisme ? i.e modifierCase doit être virtual (elle doit être virtuelle pure dans Joueur idéalement).

Share this post


Link to post
Share on other sites

Bah dans le .h, il suffit de déclarer Joueur *joueurs[2]; et non Joueur* joueur;

 

 

As-tu bien respecté les règles inhérentes au polymorphisme ? i.e modifierCase doit être virtual (elle doit être virtuelle pure dans Joueur idéalement).

J'ai fais tous ça oui mon tableau de joueur est de taille 2 et :

class Joueur
{
    public:
        Joueur();
        Joueur(string p);
        virtual ~Joueur();
        void saisir();
        virtual bool incorrect(int l, int c);
        void choisirCase();
        virtual void modifierCase();
        void Jouer();
        void setPseudo(string j);
        string getPseudo();
    protected:
        string pseudo;
        int sLigne;
        int sColonne;
    private:





#include "Joueur.h"

using namespace std;

class Ange : public Joueur
{
    public:
        Ange();
        Ange(string j, int l, int c);
        virtual ~Ange();
        void modifierCase(int l, int c);
        bool incorrect(int l, int c);
    protected:
    private:
        int ligne;
        int colonne;
};

Share this post


Link to post
Share on other sites

Bonjour,

J'aimerais savoir comment vérifier que les coordonnées rentrées par l'ange soient bien une case autour de sa position.

Si vous avez quelques pistes a me donner je suis preneur.

Merci d'avance.

 

Tu compare la case rentré avec x+1 ,x-1 , y+1,y-1 de la case actuelle.

Share this post


Link to post
Share on other sites

Tu compare la case rentré avec x+1 ,x-1 , y+1,y-1 de la case actuelle.

 

C'est faux, quand est t-il des t'es déplacement {0;1}, {1;0}, {0;-1}, {-1;0} avec t'as méthode?

 

Pour vérifier si les coordonnées de l'ange sont bien une case autour de sa position, tu dois utiliser le principe mathématique des vecteurs. Soit position de l'ange notée Ax et Ay et le point rentré de coordonnée x, y.

Si la valeur absolue de Ax - x, et la valeur absolue de Ay - y sont inférieur ou égale à la puissance de l'ange (ici 1) alors, le déplacement est autorisé.

 

A comprendre, si il y a le même nombre de case, ou moins, entre l'ange et le point, en abscisse et en ordonnée, alors le déplacement est possible sous reserve qu'elle ne soit pas détruite ou contiene déjà l'ange.

 

Bonne modification de code! :ph34r:

Share this post


Link to post
Share on other sites

C'est faux, quand est t-il des t'es déplacement {0;1}, {1;0}, {0;-1}, {-1;0} avec t'as méthode?

 

Pour vérifier si les coordonnées de l'ange sont bien une case autour de sa position, tu dois utiliser le principe mathématique des vecteurs. Soit position de l'ange notée Ax et Ay et le point rentré de coordonnée x, y.

Si la valeur absolue de Ax - x, et la valeur absolue de Ay - y sont inférieur ou égale à la puissance de l'ange (ici 1) alors, le déplacement est autorisé.

 

A comprendre, si il y a le même nombre de case, ou moins, entre l'ange et le point, en abscisse et en ordonnée, alors le déplacement est possible sous reserve qu'elle ne soit pas détruite ou contiene déjà l'ange.

 

Bonne modification de code! :ph34r:

 

oui je me suis pal exprimé : 

if (abs(ligne - x) != 1 && abs(colonnes - y) != 1){
			cout << "Erreur: Vous pouvez selement voux deplacer d'une case." << endl; ok = false;
		}

Share this post


Link to post
Share on other sites

Bonjour,

 

Je pensais que parvenir à faire en sorte que l'ange ne puisse pas jouer une case broken serait facile, mais, en fait, je bloque sur les conditions (ou l'implémentation des conditions).

L'ange rentre x et y pour les coordonnées sur le plateau, et je pensais faire quelque chose de ce genre :

if (x == jeu.Gameboard[i].getbroken()== true && y == jeu.Gameboard[j].getbroken() == true)
            {
                cout << "La case est detruite." << endl;
                Saisir(jeu);
            }
  

Sauf que j'imagine que le compilateur n'apprécie pas trop que l'on mette deux fois le " == " dans une condition.

Comment faire pour lui faire comprendre que si la case est casée (getbroken == true ?), alors les coordonnées sont invalides ? 

Merci d'avance. 

Share this post


Link to post
Share on other sites

en fait là tu teste que x est égal à gameboard.getbroken() et en même temps tu test si gameboard.getbroken est vrai.

 

SI tu veux choisir une case avec ton couple x y, il vaudrait mieux faire

if(gameboard[x][y].getbroken() == true)
{
cout << "La case est détruite." << endl;
Saisir(jeu);
}

Comme ça tu teste une case précise. Car dans ton exemple tu testais sur toute une ligne, puis sur une autre ligne. (si tu as suivi le sujet on est censé faire une matrice de case, donc il y a deux[ ] quant tu cherche à trouver une case précise).

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

×