Morpion

charon123 Messages postés 15 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 30 mars 2004 - 11 nov. 2003 à 19:29
charon123 Messages postés 15 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 30 mars 2004 - 12 nov. 2003 à 19:53
Bon, 1), je suis débutant et je viens de commencer il y a une semaine. 2)j'utilise dev-cpp es ce que c'est bien? 3)alors voila, j'essaye de faire un morpion en utilisant un tableau et des pointeurs mais il y a un probleme a la declaration des pointeurs sa dit:
12(ligne) C:\Dev-Cpp\morpion1.1.cpp
ISO C++ forbids declaration of `aa' with no type
et:
12(ligne) C:\Dev-Cpp\morpion1.1.cpp
redefinition of `int aa'
et:
5 C:\Dev-Cpp\morpion1.1.cpp
`int aa' previously declared here
et sa recommence pour tous les pointeurs

voila la source, je me doute que c'est pas parfait et il manque encore quelque fontions au programme mais j'essaye déja d'arranger les merdes qu'il y a déja.

#include
int grille[3][3];
int play1xy;
int play2xy;
int *aa, *ab, *ac, *ba, *bb, *bc, *ca, *cb, *cc;
void jeu();
void refresh();
void commandep1();
void commandep2();
void xxx();
void yyy();
aa=grille[0][0];
ab=grille[0][1];
ac=grille[0][2];
ba=grille[1][0];
bb=grille[1][1];
bc=grille[1][2];
ca=grille[2][0];
cb=grille[2][1];
cc=grille[2][2];

int main(void)
{
{
do
{
commandep1;
xxx;
commandep2;
yyy;
}
while (a1!=0; a2!=0; a3!=0; b1!=0; b2!=0; b3!=0; c1!=0; c2!=0; c3!=0;)
}
}

void commandep1() //interface p1
{
refresh();
jeu();
cout << "Joueur 1, entrez x suivi de y (ex: a3): ";
cin >> play1xy;
}

void commandep2 //interface p2
{
refresh();
jeu();
cout << "Joueur 2, entrez x suivi de y (ex: a3) :";
cin >> play2xy;
}

void refresh() //fonction pour effacer
{
system("cls");
}

void jeu() //affichage tableau
{
cout << "\n\n";
cout << grille[0][0] << " | " << grille[0][1] << " | " << grille[0][2] << "\n";
cout << "---------\n";
cout << grille[1][0] << " | " << grille[1][1] << " | " << grille[1][2] << "\n";
cout << "---------\n";
cout << grille[2][0] << " | " << grille[2][1] << " | " << grille[2][2] << "\n\n";
}

void xxx //modification de le valeur de la grille par p1
{
switch(play1xy)
{
case aa: *aa+1;
break;
case ab: *ab+1;
break;
case ac: *ac+1;
break;
case ba: *ba+1;
break;
case bb: *bb+1;
break;
case bc: *bc+1;
break;
case ca: *ca+1;
break;
case cb: *cb+1;
break;
case cc: *cc+1;
break;
default: cout <<"Erreur, entrée non valide, recommencer svp.";
commandep1;
}
}

void yyy //modification de le valeur de la grille par p2
{
switch(play2xy)
{
case aa: *aa+2;
break;
case ab: *ab+2;
break;
case ac: *ac+2;
break;
case ba: *ba+2;
break;
case bb: *bb+2;
break;
case bc: *bc+2;
break;
case ca: *ca+2;
break;
case cb: *cb+2;
break;
case cc: *cc+2;
break;
default: cout <<"Erreur, entrée non valide, recommencer svp.\n";
commandep2;
}
}

Alors sa serai simpa de m'aider a trouver tout ce qui ne va pas, pkoi, et comment l'arranger. Merci.

22 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 nov. 2003 à 19:37
a un pointeur on affecte une adresse memoire.
BruNews, ciao...
0
D1m3x Messages postés 402 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 21 juillet 2005 1
11 nov. 2003 à 21:08
Si tu as réussi à compiler ce code avec si peui d'erreur je comprend plus rien, voici les premières erreurs:

do
{
commandep1;
xxx;
commandep2;
yyy;
}


des appels de fonction de cette manière sont interdit, tu dois placer les parenthèses derrière les noms :) donc tu devras appeler tes fonctions de cette manière:

do
{
commandep1( );
xxx( );
commandep2( );
yyy( );
}


je crois que si tu as au moins oser apprendre les bases du C++ cela devrais être stocké dans le cerveau, ce n'est tout de même pas tellement compliqué... Continuons à amélioré (réparer) ton code:

while (a1!=0; a2!=0; a3!=0; b1!=0; b2!=0; b3!=0; c1!=0; c2!=0; c3!=0;)


serait-il possible de me dire où sont déclarée les variables ? parce que la je les vois pas !!!!

Donc essaye avec ceci:

int a1, a2, a3, b1, b2, b3, c1, c2, c3;
do
{
...
}
while ( 
( a1 != 0 ) && ( a2 != 0 ) && ( a3 != 0 ) &&
( b1 != 0 ) && ( b2 != 0 ) && ( b3 != 0 ) &&
( c1 != 0 ) && ( c2 != 0 ) && ( c3 != 0 )
        );


Voilà pour ce petit problème. Prochaine erreur, ce n'est pas vraiment une erreur mais c'est plutôt du code inutile:

void refresh( )
{
system( "cls" );
}


Pourquoi ne pas utiliser la fonction system() directement. Ou bien te programmer une fonction qui fait la même chose que system( "cls" ); mais qui n'utilise pas celle-ci, mais tu n'as pas l'air de t'y connaître à fond et pour faire ça faudrait connaître les structures... !

void xxx //modification de le valeur de la grille par p1
{
...
}

et

void yyy //modification de le valeur de la grille par p2
{
...
}


Je ne comprend pas où tu as trouver ton tutoriel C++ mais là c'est plus normal!!! tu ne peux pas déclarer de fonction sans y mettre des paranthèses puisque celles-ci permettent d'introduire des paramètre si cette fonction en demande. Même si la fonction ne demande pas de paramètre, tu dois mettre les parenthèses!

Bon je crois que c'est tout, je n'ai pas eu le temps de regarder tout tout tout. Mais je crois que c'est déjà assez, si après remplacement des choses que tu avais avant par mes choses, il y a toujours des erreurs repose une deuxième petite question :)

Allez a+ et j'espère que ton jeu sera bientôt fini :p

[DmX]
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
11 nov. 2003 à 23:44
aa=&grille[0][0];
...
0
charon123 Messages postés 15 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 30 mars 2004
12 nov. 2003 à 13:45
OK, merci tt le monde.
D1m3x, dsl, qd les pointeurs ne marchaient pas (a1, ...) j'ai essayer de les remplacer par aa, ab... et j'ai oublié de tout modifié dsl. Effectivement, je vais essayer de me trouver un autre tutoriel...
ps: je n'avait pas réussi a le compiler ^^.
0

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

Posez votre question
charon123 Messages postés 15 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 30 mars 2004
12 nov. 2003 à 14:07
Voila, alors j'ai essayé de corrigé tout ce que je pouvais mais j'ai toujours les problemes avec les pointeurs a la compilation.

#include
int *a1, *a2, *a3, *b1, *b2, *b3, *c1, *c2, *c3;
int tab[3][3];
int play1xy;
int play2xy;
void jeu();
void refresh();
void commandp1();
void commandp2();
a1=&tab[0][0];
a2=&tab[0][1];
a3=&tab[0][2];
b1=&tab[1][0];
b2=&tab[1][1];
b3=&tab[1][2];
c1=&tab[2][0];
c2=&tab[2][1];
c3=&tab[2][2];

void jeu() //affichage tableau
{
cout << "\n\n";
cout << tab[0][0] << " | " << tab[0][1] << " | " << tab[0][2] << "\n";
cout << "---------\n";
cout << tab[1][0] << " | " << tab[1][1] << " | " << tab[1][2] << "\n";
cout << "---------\n";
cout << tab[2][0] << " | " << tab[2][1] << " | " << tab[2][2] << "\n\n";
}

int main(void)
{
{
do
{
commandp1();
xxx();
commandp2();
yyy();
}
while ( ( a1 != 0 ) && ( a2 != 0 ) && ( a3 != 0 ) &&( b1 != 0 ) && ( b2 != 0 ) && ( b3 != 0 ) &&( c1 != 0 ) && ( c2 != 0 ) && ( c3 != 0 ));
}
}

void commandep1() //interface p1
{
refresh();
jeu();
cout << "Joueur 1, entrez x suivi de y (ex: a3): ";
cin >> play1xy;
}

void commandep2() //interface p2
{
refresh();
jeu();
cout << "Joueur 2, entrez x suivi de y (ex: a3) :";
cin >> play2xy;
}

void refresh() //fonction pour effacer
{
system("cls");
}

void xxx() //modification de le valeur de la grille par p1
{
switch(play1xy)
{
case aa: *a1+1;
break;
case ab: *a2+1;
break;
case ac: *a3+1;
break;
case ba: *b1+1;
break;
case bb: *b2+1;
break;
case bc: *b3+1;
break;
case ca: *c1+1;
break;
case cb: *c2+1;
break;
case cc: *c3+1;
break;
default: cout <<"Erreur, entrée non valide, recommencer svp.";
commandp1();
}
}

void yyy() //modification de le valeur de la grille par p2
{
switch(play2xy)
{
case aa: *a1+2;
break;
case ab: *a2+2;
break;
case ac: *a3+2;
break;
case ba: *b1+2;
break;
case bb: *b2+2;
break;
case bc: *b3+2;
break;
case ca: *c1+2;
break;
case cb: *c2+2;
break;
case cc: *c3+2;
break;
default: cout <<"Erreur, entrée non valide, recommencer svp.\n";
commandp2();
}
}
0
D1m3x Messages postés 402 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 21 juillet 2005 1
12 nov. 2003 à 14:35
Pourquoi veux-tu absolument utiliser des pointeur de int? je ne veux pas t'en empêcher, mais si tu pouvais me donner la raison pour laquelle tu utilise absolument des pointeurs ce serait pas mal :). Juste une ou deux petites remarques:

int main(void)
{
{
do
{
commandp1();
xxx();
commandp2();
yyy();
}
while ( ( a1 != 0 ) && ( a2 != 0 ) && ( a3 != 0 ) &&( b1 != 0 ) && ( b2 != 0 ) && ( b3 != 0 ) &&( c1 != 0 ) && ( c2 != 0 ) && ( c3 != 0 ));
}
}


entre le '{' du main et '}' du main tu met encore deux '{}' tu n'es pas obligé de placer ce code dans ces {}, car le code est déjà dans une fonction, si tu aurait mit ce code en dehors des fonctions tu aurais du placer les {} mais elle ne sont pas utile ici, encore je me demande s'il est possible de faire un do while hors d'une fonction, ça n'aurait pas trop de sens... :) Remplace donc par:

int main(void)
{

do
{
commandp1();
xxx();
commandp2();
yyy();
}
while ( ( a1 != 0 ) && ( a2 != 0 ) && ( a3 != 0 ) &&( b1 != 0 ) && ( b2 != 0 ) && ( b3 != 0 ) &&( c1 != 0 ) && ( c2 != 0 ) && ( c3 != 0 ));

}


Ce n'est qu'un conseil ;)

Ensuite c'est un FAUTE qui intervient, en incluant la lib standard du C++ (iostream) tu as oublié le:
using namespace std;


qui est indispensable si tu ne met pas le .h derrière iostream. Si tu ne le met pas tu sera obligé d'utiliser les fonctions de la STL de cette manière:

int main ( void )
{
int nmb;
std::cout << "entrez un nombre : ";
std::cin << nmb;

std::cout << "Le nombre entré est: " << nmb << sdl::endl;

return 0;
}


Je ne trouve pas ça très beau..!

Ensuite je vois que tu as changé les prototype de commandep1(); en commandp1( ); mais que quand tu les implémente tu laisse le vieux prototype... !

Je crois que c'est tout essaye de changer cela et recompile :)

Ciao ;)

[DmX]
0
charon123 Messages postés 15 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 30 mars 2004
12 nov. 2003 à 14:40
bah un pointeur c'est ce qui me parait le plus simple non?
en fait je suis peut etre un peu trop con...
0
D1m3x Messages postés 402 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 21 juillet 2005 1
12 nov. 2003 à 16:56
lol, non rien avoir avec trop con. Les pointeurs c'est pas tout à fait le plus simple, le plus simple c'est tout simplement d'utiliser des simple int, car tu n'est pas obligé de leur attribué une adresse mémoire, tu peux simplement leur donné une valeur...

JE TIENS ENCORE A MEXCUSER POUR LE DOUBLE POST! JAVAIS UN PROBLEME AVEC IE!! excusez moi ^^

[DmX]
0
charon123 Messages postés 15 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 30 mars 2004
12 nov. 2003 à 17:24
Bon, maintenan j'ai fait sa:

#include
int tab[3][3];
char play1xy;
char play2xy;
void jeu();
void refresh();
void commandp1();
void commandp2();
void xxx();
void yyy();

int main(void)
{
do
{
commandp1();
xxx();
commandp2();
yyy();
}
while ( ( tab[0][0] != 0 ) && ( tab[0][1] != 0 ) && ( tab[0][2] != 0 ) &&( tab[1][0] != 0 ) && ( tab[1][1] != 0 ) && ( tab[1][2] != 0 ) &&( tab[2][0] != 0 ) && ( tab[2][1] != 0 ) && ( tab[2][2] != 0 ));
}

void jeu() //affichage tableau
{
cout << "\n\n";
cout << tab[0][0] << " | " << tab[0][1] << " | " << tab[0][2] << "\n";
cout << "---------\n";
cout << tab[1][0] << " | " << tab[1][1] << " | " << tab[1][2] << "\n";
cout << "---------\n";
cout << tab[2][0] << " | " << tab[2][1] << " | " << tab[2][2] << "\n\n";
}

void commandp1() //interface p1
{
refresh();
jeu();
cout << "Joueur 1, entrez x suivi de y (ex: a3): ";
cin >> play1xy;
}

void commandp2() //interface p2
{
refresh();
jeu();
cout << "Joueur 2, entrez x suivi de y (ex: a3) :";
cin >> play2xy;
}

void refresh() //fonction pour effacer
{
system("cls");
}

void xxx() //modification de le valeur de la grille par p1
{
switch(play1xy)
{
case a1: tab[0][0]+1;
break;
case a2: tab[0][1]+1;
break;
case a3: tab[0][2]+1;
break;
case b1: tab[1][0]+1;
break;
case b2: tab[1][1]+1;
break;
case b3: tab[1][2]+1;
break;
case c1: tab[2][0]+1;
break;
case c2: tab[2][1]+1;
break;
case c3: tab[2][2]+1;
break;
default: cout <<"Erreur, entrée non valide, recommencer svp.";
commandp1();
}
}

void yyy() //modification de le valeur de la grille par p2
{
switch(play2xy)
{
case a1: tab[0][0]+2;
break;
case a2: tab[0][1]+2;
break;
case a3: tab[0][2]+2;
break;
case b1: tab[1][0]+2;
break;
case b2: tab[1][1]+2;
break;
case b3: tab[1][2]+2;
break;
case c1: tab[2][0]+2;
break;
case c2: tab[2][1]+2;
break;
case c3: tab[2][2]+2;
break;
default: cout <<"Erreur, entrée non valide, recommencer svp.\n";
commandp2();
}
}

a la compilation, le seul probleme je croi c'est qu'il me dit que dans

void yyy() //modification de le valeur de la grille par p2
{
switch(play2xy)
{
case a1: tab[0][0]+2;
break;
case a2: tab[0][1]+2;
break;
case a3: tab[0][2]+2;
break;
case b1: tab[1][0]+2;
break;
case b2: tab[1][1]+2;
break;
case b3: tab[1][2]+2;
break;
case c1: tab[2][0]+2;
break;
case c2: tab[2][1]+2;
break;
case c3: tab[2][2]+2;
break;
default: cout <<"Erreur, entrée non valide, recommencer svp.\n";
commandp2();
}
}

et bien a1, a2... ne sont pas déclaré. de ce que j'ai compris, dans cet exemple c'est en fonction de la valeur de play2xy on execute la fonction tab[0][0]+2... et donc je ne vois pas pkoi il me dit que a1, a2, a3... ne sont pas déclaré...

comme play1xy contient une valeur a1, a2... il faut le déclaré en "char"?
0
D1m3x Messages postés 402 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 21 juillet 2005 1
12 nov. 2003 à 17:40
tab[0][0] n'est pas une fonction mais une variable...

a1, a2.... ne seront jamais déclaré si tu ne le fait pas toi même, c'est pas le bon dieu qui fait ça quand même :p

je crois savoir se que tu veux faire avec a1... tu crois que :
L'utilisateur doit entrer a1, a2 ... alors tu crois qu'une variable a1 est directement délclarée, ce qui est totalement faux. ce que tu pourrais faire:

/*
    * Les variables booléenne (bool), sont utilisée pour vérifier
    * si quelque chose est juste ou faux, en effet elle ne 
    * accepté que deux valeur: true et false! Donc je vais 
    * m'en servir dans pour compléter ton switch!!
 */

bool a1 = false; 
bool a2 = false;

// ... Je n'ai pas tout déclarer, ce n'est pas trop compliqué

void commandp1( )
{
    refresh();
    jeu();
    cout << "Joueur 1, entrez x suivi de y (ex: a3): ";
    cin >> play1xy;

    if ( !strcmp( play1xy, "a1" ) )
    {
        a1 = true; 
    }
    else if ( !strcmp( play1xy, "a2" ) )
    {
        a2 = true;
    }
}


Dans ton switch tu aura donc:

void yyy() 
{
    switch(play2xy)
    {
        case a1: tab[0][0]+2;
        break;
        case a2: tab[0][1]+2;
        break; 
        case a3: tab[0][2]+2;
        break;
        case b1: tab[1][0]+2;
        break;
        case b2: tab[1][1]+2;
        break;
        case b3: tab[1][2]+2;
        break;
        case c1: tab[2][0]+2;
        break;
        case c2: tab[2][1]+2;
        break;
        case c3: tab[2][2]+2;
        break;
        default: cout <<"Erreur, entrée non valide, recommencer svp.\n";
        commandp2();
    }
}

Le case a1 true: .. vérifiera si a1 true.. donc!

Sinon tu devais faire:
if ( !strcmp( play1xy, "a1" )
{
    ...
}


Allez corrige moi ça et tu veras que ça ira déjà mieux ;)

Ciao...
[DmX]
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 nov. 2003 à 17:57
D1m3x, bravo pour toute la patience manifestee mais il ne faut pas hesiter a dire a un debutant que rien ne remplacera l'etude dans un bouquin surtout quand les bases sont manquantes, ce qui me semble etre le cas.
charon123, si tu as besoin de bouquins et que tu es sur Paris, tu demandes.
BruNews, ciao...
0
charon123 Messages postés 15 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 30 mars 2004
12 nov. 2003 à 18:00
Et tu me conseille quels bouquins pour commencer?
Parceque a ce que je vois il y en a plein.
0
charon123 Messages postés 15 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 30 mars 2004
12 nov. 2003 à 18:05
bon, dsl mais ya un truc que je comprend pas:

if ( !strcmp( play1xy, "a1" ) )
{
a1 = true;
}

qu'es ce que signifie:
!strcmp

merci d'etre patien avec moi comme le dit brunews
0
D1m3x Messages postés 402 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 21 juillet 2005 1
12 nov. 2003 à 18:05
ben drien, j'avais envie d'aider, parce que le code avait vraiment l'air désastreux, et je crois qu'il méritait d'être corrigé avec des explications :) Ensuite c'est vrai qu'un livre s'impose ^^ lol mais bon je souhaite encore bonne chance à charon123 pour ien apprendre!

Bonne prog,

Ciao

[DmX]
0
D1m3x Messages postés 402 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 21 juillet 2005 1
12 nov. 2003 à 18:09
C'est vrai que j'aurai du expliqué:

strcmp( ) est une fonction qui vérifie s'il y a des différence dans les deux char * étant donné en paramètre. donc ici nous mettons le '!' pour prendre 'le contraire' de la fonction, donc qu'il n'y ait pas de différence entre les deux variables, et si, en effet, il n'y a pas de différence, la variable a1 sera mise à true, et la case sera prise :)

pour utiliser la fonction strcmp tu doi inclure string.h (ou string tt simplement).

'espère que ça t'aura aidé :)

[DmX]
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 nov. 2003 à 18:13
On trouve des bouquins d'inititions au C,C++ pour pas cher dans les FNAC ou autres librairies.
Je repete que si tu es sur Paris je t'en donne.
BruNews, ciao...
0
charon123 Messages postés 15 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 30 mars 2004
12 nov. 2003 à 18:23
Merci c'est simpa, moi je suis a Colombes si tu voi ou s'est.
Je suis a st lazare en 5min...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 nov. 2003 à 18:33
bnutiles@wanadoo.fr
Mets moi un message et sera a prendre Porte de Versailles.
BruNews, ciao...
0
D1m3x Messages postés 402 Date d'inscription samedi 28 décembre 2002 Statut Membre Dernière intervention 21 juillet 2005 1
12 nov. 2003 à 18:47
Bon, maintenant que j'en ai l'occasion, brunews, tu fait partie du staff cppfrance (C S...) ? parce que quand je regarde le nombre de messages que tu as déjà posté sur ce forum, on dirait vraiment que tu ne vis que de ça :p:p:p ;)

bon je crois que c'est tout j'espère surtout que charon123 aura compris ;)

ciao

[DmX]
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 nov. 2003 à 18:57
staff CodeSources = TRUE
que de ça = FALSE, juste que je passe au moins 16h par jour devant mes ecrans.
BruNews, ciao...
0
Rejoignez-nous