Bonjour
Depuis une heure j'essaye de faire un début de programme pour un coder un morpion .
Pour l'instant j'essaye d'afficher la grille du morpion remplis de "o" et ensuite je tente de rentrer une coordonnée pour placer une croix dans la grille .
Je pense avoir un début de code juste pourtant ,mon programme bug et quand je veux essayer de placer une croix dans la grille (3x3) , le programme en place 2 au lieu d'une ! J'utilise les tableaux multidimensionnels pour info .
Voici le code source :
--------------------------------------------------
---------------------
using namespace std;
void reni(char tableau[2][2]);
void afficher(char tableau[2][2]);
int main()
{
char tableau[2][2];
int r(0);
int x(0),y(0),v(0);
reni(tableau);
cout<<endl<<endl;
while (v<9)
{
x=0;
y=0;
cout<<" Quel coordonne voulez vous taper ? [x],[y] de 0 a 2 "<<endl<<endl;
cout << " x = ";
cin>>x;
cout<<endl;
cout<<" y = ";
cin>>y;
cout<<endl;
tableau[y][x]='x';
afficher(tableau);
v++;
}
return 0;
}
void reni(char tableau[2][2])
{
for(int i(0);i<3;i++)
{
cout<<endl;
for(int u(0);u<3;u++)
{
tableau[i][u]='o';
cout<<tableau[i][u];
}
}
}
void afficher(char tableau[2][2])
{
for(int i(0);i<3;i++)
{
cout<<endl;
for(int u(0);u<3;u++)
{
cout<<tableau[i][u];
}
}
}
--------------------------------------------------
--------------------
et un screen de la console :
J'ai aussi un autre souci qui peut paraitre bête : quand j’enlève le : int r ; ça plante tout le programme alors que la variable r n'intervient pas dans le programme ... Essayez vous verrez .
Je ne comprends vraiment rien ... Je précise que je débute mon apprentissage du c++ .
Merci d'avance
verifie les dimensions de tes tableaux.
void afficher(char tableau[2][2]) pour info, ceci ne fait pas ce qui est écrit. C'est en effet équivalent à ceci :
void afficher(char tableau[2][])
Je préfère le premier car ça donne plus d'informations sur ce qu'on attend en entrée, mais comme le souligne godrik, il faut quand même vérifier les dimensions du tableau.
Après, le main est très bizarre, au sens où il n'y a aucune vérification de fait avant d'écrire dans le tableau.
Enfin, Code::Blocks a un débogueur, c'est fait pour s'en servir.
Les dimensions de tes tableaux sont incorrectes.
L'auteur, tu confonds les dimensions d'un tableau a la declaration et l'offset que tu passes entre crochet pour acceder a un element de ton tableau.
Dans le cas des dimensions, par exemple char tab[2][2], ce sera un tableau de 2 par 2 qui sera declare, mais lorsque tu souhaiteras acceder au dernier element, ce sera tab[1][1].
D'accord merci de votre aide
j'ai essayé de corrigé et de prendre en compte vos commentaire et voici le nouveau code source et ça a l'air de marcher .
---------------------------------------
using namespace std;
void afficher(char tableau[3][3]);
int main()
{
char tableau[3][3]= {{'o', 'o','o'},{'o', 'o', 'o'},{'o', 'o', 'o'}};
int r(0);
int x(0),y(0),v(0);
for(int i(0);i<3;i++)
{
cout<<endl;
for(int u(0);u<3;u++)
{
cout<<tableau[i][u];
}
}
cout<<endl<<endl;
while (v<9)
{
x=0;
y=0;
cout<<" Quel coordonne voulez vous taper ? [x],[y] de 0 a 2 "<<endl<<endl;
cout << " x = ";
cin>>x;
cout<<endl;
cout<<" y = ";
cin>>y;
cout<<endl;
tableau[y][x]='x';
afficher(tableau);
v++;
}
return 0;
}
void afficher(char tableau[3][3])
{
for(int i(0);i<3;i++)
{
cout<<endl;
for(int u(0);u<3;u++)
{
cout<<tableau[i][u];
}
}
}
--------------------------------------------------
--
C'est vrai que je me suis emmêlé les pinceaux avec les déclaration et accès au tableau .
Par contre , je n'ai pas compris cette phrase :" l'offset que tu passes entre crochet pour acceder a un element de ton tableau".
Et si vous voyez une autre erreur , n’hésitez pas , ça peut me faire progresser
Hmmm, et bien comment dire... Dans le cas de ton tableau de char[3][3], c'est en realite un pointeur qui contient l'adresse de ce tableau et pointe sur le premier element.
Ce que j'entend par offset, c'est un decalage par rapport a la premiere case de ton tableau, c'est a dire que tu rajoutes la taille d'une case multiplie par ce que tu passes entre crochet pour acceder a l'element. C'est pour ca que tab[0][0] va etre la premiere case du tableau, car en realite c'est "position de la premiere case + 0 * la taille d'un char". C'est un peu difficile a comprendre si tu ne connais pas bien les notions de pointeurs et d'adressage.
Nightmarez => je crois comprendre ce que tu veux dire , mais il est clair que je ne connais pas assez les notion sur les pointeur , je pense que developpez.com pourra m'en faire apprendre d'avantage sur ce sujet .
je sais pas si sa peut t'aider mais voicie le code que j'avais fais à mes TOUT DEBUT ,AVANT DE CONNAITRE LE TABLEAU (c'est pour dire ... )
sans aucune aide je precise ,et je n'avais que 15 ans ...
voila retranscris sa avec un tableau mutlidimensionel
using namespace std;
int main()
{
char const croix('X');
char const rond('O');
string A1("."), A2("."), A3("."); // initialisation des variables correspondants aux cases
string B1("."), B2("."), B3(".");
string C1("."), C2("."), C3(".");
cout << " A B C" << endl; // création du morpion
cout << "D" << " |" << A1 << " |" << B1 << " |" << C1 << " |" << endl;
cout << " _________" << endl;
cout << "E" << " |" << A2 << " |" << B2 << " |" << C2 << " |" << endl;
cout << " _________" << endl;
cout << "F" << " |" << A3 << " |" << B3 << " |" << C3 << " |" << endl;
cout << endl << "----------------" << endl << endl;
int nbTours(0);
string lettresCase("inconnue");
bool faux(false); // true = case non jouer
bool AD(true);
bool AE(true);
bool AF(true);
bool BD(true);
bool BE(true);
bool BF(true);
bool CD(true);
bool CE(true);
bool CF(true);
for(int nbTours = 1; nbTours < 10; nbTours++) // compteur de tours
{
if (nbTours == 1 || nbTours == 3 || nbTours == 5 || nbTours == 7 || nbTours == 9) // joueur 1
{
cout << "joueur 1 a vous de jouer ! saisissez la lettre d'une colonne puis la lettre de la ligne de la case souhaiter !" << endl;
cin >> lettresCase;
string const ad("AD");
string const ae("AE");
string const af("AF");
string const bd("BD");
string const be("BE");
string const bf("BF");
string const cd("CD");
string const ce("CE");
string const cf("CF");
if (lettresCase == ad && AD)
{
A1 = croix;
AD = faux;
}
else if (lettresCase == ae && AE)
{
A2 = croix;
AE = faux;
}
else if (lettresCase == af && AF)
{
A3 = croix;
AF = faux;
}
else if (lettresCase == bd && BD)
{
B1 = croix;
BD = faux;
}
else if (lettresCase == be && BE)
{
if (nbTours == 1)
{
cout << "vous ne pouvez pas prendre cette case au premier tour !" << endl;
}
else
{
B2 = croix;
BE = faux;
}
}
else if (lettresCase == bf && BF)
{
B3 = croix;
BF = faux;
}
else if (lettresCase == cd && CD)
{
C1 = croix;
CD = faux;
}
else if (lettresCase == ce && CE)
{
C2 = croix;
CE = faux;
}
else if (lettresCase == cf && CF)
{
C3 = croix;
CF = faux;
}
else
{
cout << "selectionner une case existante !" << endl;
}
cout << " A B C" << endl;
cout << "D" << " |" << A1 << " |" << B1 << " |" << C1 << " |" << endl;
cout << " _________" << endl;
cout << "E" << " |" << A2 << " |" << B2 << " |" << C2 << " |" << endl;
cout << " _________" << endl;
cout << "F" << " |" << A3 << " |" << B3 << " |" << C3 << " |" << endl;
cout << endl << "----------------" << endl << endl;
}
else // joueur 2
{
cout << "joueur 2 a vous de jouer ! saisissez la lettre d'une colonne puis la lettre de la ligne de la case souhaiter !" << endl;
cin >> lettresCase;
string const ad("AD");
string const ae("AE");
string const af("AF");
string const bd("BD");
string const be("BE");
string const bf("BF");
string const cd("CD");
string const ce("CE");
string const cf("CF");
if (lettresCase == ad && AD)
{
A1 = rond;
AD = faux;
}
else if (lettresCase == ae && AE)
{
A2 = rond;
AE = faux;
}
else if (lettresCase == af && AF)
{
A3 = rond;
AF = faux;
}
else if (lettresCase == bd && BD)
{
B1 = rond;
BD = faux;
}
else if (lettresCase == be && BE)
{
B2 = rond;
BE = faux;
}
else if (lettresCase == bf && BF)
{
B3 = rond;
BF = faux;
}
else if (lettresCase == cd && CD)
{
C1 = rond;
CD = faux;
}
else if (lettresCase == ce && CE)
{
C2 = rond;
CE = faux;
}
else if (lettresCase == cf && CF)
{
C3 = rond;
CF = faux;
}
else
{
cout << "selectionner une case existante ou qui n'a pas deja ete jouer !" << endl;
}
cout << " A B C" << endl;
cout << "D" << " |" << A1 << " |" << B1 << " |" << C1 << " |" << endl;
cout << " _________" << endl;
cout << "E" << " |" << A2 << " |" << B2 << " |" << C2 << " |" << endl;
cout << " _________" << endl;
cout << "F" << " |" << A3 << " |" << B3 << " |" << C3 << " |" << endl;
cout << endl << "----------------" << endl << endl;
}
}
return 0;
}
pour la case centrale c'est mon pere qui m'avait dit qu'il valait mieux empecher l'utilisateur au premier tour mais tu peux la remettre en suivant le reste du code
ps : dev cpp > codeblock
Ps : Le post datait d'il y a deux ans
PS: Dev C++ n'est plus maintenu depuis des années.