Jump to content
Laurent GODEFROY

Mini-Projet de C++

Recommended Posts

Ce fil de discussion est créé pour que vous puissiez échanger autour de votre mini-projet de C++ dont les sujets sont disponibles ce jour même.

Ce projet est individuel, et vous avez jusqu'au 8 mars pour le réaliser. Je vous renvoie à la première partie du sujet pour tous les détails à ce propos.

Bon courage à vous !

Share this post


Link to post
Share on other sites

une petite question, elle a l'aire bête mais j'ai remplis mon tableau 

mais quelqu'un sait t'il comment je peux remplir mon tableau avec des "X" ou "O" selon que la case soit en false ou true comme indiqué dans le sujet ?

 

merci.

Share this post


Link to post
Share on other sites

/*
Affiche la grille du morpion
_ indique case vide, O pion joueur 1 et X pion jour 2
*/
void afficheGrille() {
int i, j;
for (i=0; i<NB_LIG; i++) {
for (j=0; j<NB_COL; j++) {
switch (grille[i][j]) {
case VIDE:
cout << "_ " ;
break;
case ROND:
cout << "O " ;
break;
case CROIX:
cout << "X " ;
break;
}
}
cout << "\n" ; /* fin de la ligne */
}
}

Share this post


Link to post
Share on other sites

Merci de ta réponse mais nous avons un tableau qui aura comme type cette classe.

class Toto{
private:
   bool x;
   bool y;
public:
   Toto()
}


et nous devons remplir les cases du tableau par rapport au champs x,y qui sont des bool

a ma connaissance le swich ne fonctionne pas avec des bool

 

et donc comment afficher un "X" ou "O" selon l'etat bool d'une case dans le tableau

Share this post


Link to post
Share on other sites

Bonjour,

 

Tu demandes ici une partie de la solution au projet, ce n'est pas le but du forum.

On te demande simplement d'afficher "X", "." ou "O" selon la valeur booléenne de la case, si tu lis bien la consigne ça ne devrait pas te poser de souci, c'est la base d'une condition.

Share this post


Link to post
Share on other sites

Bonjour, j'ai une question concernant le sujet,

il est dit :

"Le jeu s’arrête quand l’ange ne peut plus bouger ou quand il a atteint le bord du plateau. "

 

est-ce que dans ce cas là la partie est finie ou faut-il que l'ange continue de jouer et aille sur le bord du plateau ?

miniprojet_2_CPP.jpg

Share this post


Link to post
Share on other sites

d'accord, moi j'avais compris que l'ange ne pouvais pas gagner et qu'il perdait en arrivant au bord ,

la partie continuait donc tant que le démon ne gagne pas.

cf : "Le démon gagne la partie quand il arrive à entourer l’ange de huit cases détruites. L’ange cherche lui à éviter indéfiniment une telle situation."

 

mais merci, je comprends enfin que l'ange peut gagner ^^

Share this post


Link to post
Share on other sites

Bonjour.

J'ai un soucis pour la création du plateau de jeu avec le double pointeur.
Pour commancer je fais un premier malloc pour allouer la taille des lignes:

dim = 35;
gameboard = malloc(dim * sizeof(*gameboard));

 

mais j'ai l'erreur suivante:

error: invalid conversion from 'void*' to 'Case**' [-fpermissive]|

 

j'ai essayer de mettre un typedef mais rien n'y fait. j'ai chercher sur le net et ^d'après ce que j'ai vu ma ligne et juste.

 

avez-vous une idée ?

Share this post


Link to post
Share on other sites

C'est normal, en C++, il est assez rare d'avoir besoin d'utiliser malloc. La raison de l'erreur est que malloc retourne un pointeur de type void *

 

En C, la conversion void * -> T * est implicite, donc il n'y a pas besoin de caster le retour de malloc (certains le font mais c'est redondant). En C++, cette conversion n'est pas implicite

et le compilateur te signale donc l'erreur. Si tu veux utiliser malloc, il faut utiliser une conversion de type explicite :

gameboard = static_cast<Case **>malloc(dim * sizeof(*gameboard));

Mais comme a dit Sylva, ne t'ennuie pas avec malloc et utilise new[]

Share this post


Link to post
Share on other sites

Merci beaucoup pour vos réponse.
J'ai trouvé ceci qui marche très bien:

gameboard = new Case * [dim];
        for(int i=0; i < dim; i++)
        {
           gameboard = new Case [dim];
        }

 

Maintenant j'ai une question par rapport au sujet. Le tableau de base fais 35/35 ça d'accord. Mais quel est son minimum ? Je ne trouve pas la réponse dans le sujet ou alors je ne la voie pas.

Share this post


Link to post
Share on other sites

Dans le sujet le tableau n'a pas de minimum on te dit juste que le tableau doit être impaire et positif donc si l'utilisateur met -10 et bah tu trouve un moyen pour le convertir en 11. :)

Après c'est a toi de voir si tu veux imposer un minimum ou pas .

Share this post


Link to post
Share on other sites

Je suis d'accord avce toi Sylva mais si l'on met 0, on aura un tableau de taille 1 et donc juste l'ange sur le plateau. C'est pour cela que je voulais savoir si il y avais un minimum ou si l'on considérais que l'utilisateur est "inteligent"

Share this post


Link to post
Share on other sites

D'accord merci de ta réponse.
Et une dernière question: "

La méthode « saisir » demande à l’utilisateur de rentrer un numéro de ligne et un numéro de colonne. Elle n’effectue pas de vérification de leurs validités. Cette opération de contrôle est effectuée par la méthode « incorrect »."

On vérifie quand même que ce son des nombre qui son saisie? Car moi si je ne fais pas de vérification, si la personne rentre en ligne des caractère cela remplie automatiquement la saisie de colonne ...

Share this post


Link to post
Share on other sites

 

 

donc si l'utilisateur met -10 et bah tu trouve un moyen pour le convertir en 11

 

Reporter une erreur serait mieux plutôt que de magiquement changer l'entrée.

 

 

 

Car moi si je ne fais pas de vérification, si la personne rentre en ligne des caractère cela remplie automatiquement la saisie de colonne

 

Je suppose que la méthode incorrect vérifie juste que les nombres entrés par l'utilisateur sont valides ou non, selon que ce soit l'ange ou le démon (peut-il se déplacer sur le plateau à l'endroit indiqué ou non ?).

 

Si tu veux vérifier que l'utilisateur renseigne bien des entiers, et non pas des caractères, il va falloir le faire directement dans la fonction « saisir », vu que ça implique de vérifier directement l'état de std::cin.

 

Attention, faire de la validation d'entrée en C++, comme en C, ce n'est pas simple. Dans l'ordre, il faut:

 

1. Vérifier l'état du flux d'entrée (if !(std::cin >> x))

2. Si l'état n'est pas correct, ré-initialiser le flux avec clear()

3. Ignorer tous les caractères restant dans le flux avec ignore()

4. Tout cela en boucle

Share this post


Link to post
Share on other sites

 

Reporter une erreur serait mieux plutôt que de magiquement changer l'entrée.

Dans le sujet il est dis que l'on devait prendre la valeur absolut et ajouter un si le chiffre était paire donc on peut directement modifier l'entrée client.

 

 

Si tu veux vérifier que l'utilisateur renseigne bien des entiers, et non pas des caractères, il va falloir le faire directement dans la fonction « saisir », vu que ça implique de vérifier directement l'état de std::cin.

Pour être sur de ne pas faire un hors sujet ou perdre des points, je met les entrée dans une string que je concatene avec un delimiter bien particulier. Je retourne le tous a la fonction choisirCase puis je la parse et la convertie en int avec stoi et je le revoie dans la fonction incorect.

Share this post


Link to post
Share on other sites

Je vois pas en quoi faire de la validation comme je l'ai décrit serait du hors sujet. Si ton formateur te pénalise parce que tu t'es permis, à juste titre, de prendre quelques libertés par rapport au sujet, il mériterait la sanction disciplinaire sur le champ.

Share this post


Link to post
Share on other sites

J'ai encore une question (et je crois pas que c'est la dernière en plus):

Pour la classe ange, son constructeur, pour initialiser la ligne et la colonne on doit bien prendre la dimension du plateau donc dim et la diviser par deux pour le placer?

Sauf que quand je fais ça ce cette manière :

Ange::Ange()
{
    ligne = Plateau.dim/2;
    colonne = Plateau.dim/2;
}

erreur:  expected primary-expression before '.' token

Ou

Ange::Ange()
{
    ligne = Plateau->dim/2;
    colonne = Plateau->dim/2;
}

Erreur: expected primary-expression before '->' token

ou encore en passant par un fonction get

Ange::Ange()
{
    ligne = Plateau.getDim()/2;
    colonne = Plateau.getDim()/2;
}

j'ai une erreur: expected primary-expression before '.' token|

 

Vous avez une idée ?

Share this post


Link to post
Share on other sites

Ou est-ce que tu initialises Plateau ? Je suis pratiquement sûr que tu vas devoir le passer en paramètre du constructeur:

Ange::Ange(const Plateau& plateau)
  : ligne(plateau.getDim() / 2)
  , colonne(plateau.getDim() / 2)
{
}

Voire faire une méthode statique:

Ange Ange::positionSurPlateau(const Plateau& plateau) {
    Ange ange(plateau.getDim() / 2, plateau.getDim() / 2);

    return ange;
}

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

×