PROGRAMME C : TIC TAC TOE [Résolu]

Messages postés
17
Date d'inscription
dimanche 17 octobre 2010
Dernière intervention
12 mai 2011
- - Dernière réponse : cptpingu
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
- 29 mars 2011 à 14:34
Bonjour ,
je suis débutante en programmation C et je voudrais programmer un tic tac toe mais je galere un peu .

donc il s'agit de declarer une variable plateau 3X3 dans le main et de l'initialiser en indiquant que less cases sont vides.

=>
int main()
{
int Plateau[3][3]=({},{},{});

puis, il me faut ecrire une fonction AFFICHE qui nous permet d'avoir un plateau du genre
| | | |
| | | |
| | | |

=>
void Affiche ( int Plateau[3][3]);
{
printf("| %d | %d | %d |\n"Plateau[0][0],Plateau[0][1],Plateau[0][2]);
printf("| %d | %d | %d |\n"Plateau[1][0],Plateau[1][1],Plateau[1][2]);
printf("| %d | %d | %d |\n"Plateau[2][0],Plateau[2][1],Plateau[2][2]);
}

il faut ensuite ecrire une fonction QUELCASE? qui demande au joueur de saisir les coordonnées ( ligne,colonne) de la case , et qui marque la case d'un ( 1 ou 2 suivant le joueur) si la case est vide ... sinon recommencer.

=>
void QuelCoup? ( int Plateau[3][3], int joueur);
{
int x;
int y;
printf ("joueur %d choisissez les coordonnées de votre case \n",joueur);
scandf ("%d,%d",&x,&y);
if ????? et la je sais pas comment exprimer le "si la case est prise alors recommencer sinon marquer...


ensuite il faut ecrire une fonction LIGNE , COLONNE ET DIAGONALE qui permettent de savoir si la ligne colonne ou diagonale sont entierement remplies par le meme joueur

puis la fonction " GAGNE!! et puis une fonction qui indique si toutes les cases sont remplies...

est ce que quelqu un peut m'aider???
Afficher la suite 

Votre réponse

20/23 réponses

Meilleure réponse
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
3
Merci
Je te propose de le faire par étape.
Tout d'abord poste ton code, que je vois où tu en es.
Ensuite, je te corrigerais l'existant, et on verra comment faire la suite.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de cptpingu
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
3
Merci
Important: N'essaie pas de coder tout d'un coup. La bonne manière de faire, quelque soit ton niveau, c'est de faire les choses petit à petit. D'abord tu fais:
1) Un programme qui ne fait rien, à part afficher à l'écran: Tic Tac Toe.
2) Tu modifies le programme pour qu'il demande à chacun des joueurs de jouer, et demande une valeur. Pour l'instant, on n'exploitera pas la valeur.
3) Lorsque ça fonctionne, on créer le tableau de Tic Tac Toe (3x3), et on initialise ses cases à 0.
4) Ensuite on passe aux choses sérieuses: On écrit la fonction Affiche.
5) Écriture de la fonction quelCoup()
6) Écriture de la fonction qui teste si on a un gagnant.

Envoi moi le code de chacun des points mentionnés en commençant par le premier. Tu verras que tout sera bien plus facile si tu procèdes comme cela. Je te corrigerais sur chacune des étapes.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de cptpingu
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
3
Merci
L'opérateur modulo (le '%'), sert à garder le résultat de la division de a par b.
Ex:
Si 12 / 7 => 1 et il reste 5. Donc 12 % 7 => 5
De même 12 / 2 => 6 et il reste 0. Donc 12 % 6 => 0

Enfin:
0 % 2 => 0
1 % 2 => 1
2 % 2 => 0
3 % 2 => 1
4 % 2 => 0
5 % 2 => 1
6 % 2 => 0
7 % 2 => 1

Donc
(0 % 2) + 1 => 1
(1 % 2) + 1 => 2
(2 % 2) + 1 => 1
(3 % 2) + 1 => 2
(4 % 2) + 1 => 1
(5 % 2) + 1 => 2
(6 % 2) + 1 => 1
(7 % 2) + 1 => 2

C'est l'astuce que j'utilise ici:
#include <stdio.h>
#include <stdlib.h>

int main()
{
  int joueur = 0;
  int x;
  int y;
  int fin = 0;

  while (!fin)
  {
    printf("Joueur %d saissisez les coordonnées de la case: ", (joueur % 2) + 1);
    scanf("%d,%d", &x, &y);
    printf("Joueur %d a saisi: %d,%d\n\n", (joueur % 2) + 1, x, y);
    ++joueur;
    /* fin = 1, selon une condition qui ne nous intéresse pas encore à cette étape */
  }

  return 0;
}



________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de cptpingu
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
3
Merci
Pour l'instant "fin" ne sert à rien. Il sera utilisé plus tard, dans les autres étapes. On mettra "fin = 1" quand on voudra arrêter le programme. Par exemple, si l'on voit qu'un joueur a gagné la partie.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de cptpingu
Messages postés
17
Date d'inscription
dimanche 17 octobre 2010
Dernière intervention
12 mai 2011
0
Merci
merci, mais deja est ce que le debut est juste ?
et je ne sais pas comment coder la case choisie...

if (x,y)!={} ( je sais pas comment ecrire cette ligne , mon erreur doit etre honteuse ... je veux dire par là que la case saisie n'est pas vide)
else
printf("la case %d,%d n'est pas valide, recommencez!",&x,&y);

???
Commenter la réponse de celialita
Messages postés
17
Date d'inscription
dimanche 17 octobre 2010
Dernière intervention
12 mai 2011
0
Merci
ok merci .

1)Affiche TIC TAC TOE.


#include <stdio.h>
#include <stdlib.h>

int main()
{
printf("Tic Tac Toe\n");
return 0;
}

2) Modification

#include <stdio.h>
#include <stdlib.h>

int main()
{
int joueur;
int x;
int y;
for(joueur=1;joueur<3;joueur++)
printf("joueur %d saissisez les coordonnées de la case\n",joueur);
scanf("%d,%d",&x,&y);
return 0;
}


Le deuxieme algorithme je vois pas comment faire pour quil demande au premier joueur les coordonnées et après au 2em...
Commenter la réponse de celialita
Messages postés
17
Date d'inscription
dimanche 17 octobre 2010
Dernière intervention
12 mai 2011
0
Merci
d'accord je comprends un peu ... mais j'ai quelques questions...
la variable "fin" concrètement correspond à quoi ?
j'aurais penser au debut faire un truc du genre " tant que les 9cases ne sont pas remplies faire "printf etc ... ""

Je vais essayer de faire la suite
Commenter la réponse de celialita
Messages postés
17
Date d'inscription
dimanche 17 octobre 2010
Dernière intervention
12 mai 2011
0
Merci
Je déclare la variable plateau 3X3 et l’initialise en indiquant que toutes ses cases sont libres

#include <stdio.h>
#include <stdlib.h>

int main()
{
int Plateau[3][3];
int i;
int j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
Plateau[i][j]=0;
}
return 0;
}


fonction affiche

void Affiche ( int Plateau[3][3]);
{
printf("| %d | %d | %d |\n"Plateau[0][0],Plateau[0][1],Plateau[0][2]);
printf("| %d | %d | %d |\n"Plateau[1][0],Plateau[1][1],Plateau[1][2]);
printf("| %d | %d | %d |\n"Plateau[2][0],Plateau[2][1],Plateau[2][2]);
}
Commenter la réponse de celialita
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
0
Merci
C'est bien, par d'erreur.
Toutefois, il serait plus judicieux de faire une fonction: "vider" qui permet de mettre toutes les cases du tableaux à 0.
En effet, si l'on veut refaire une partie, il n'y aura qu'a appeler cette fonction (juste appelée avant chaque début de partie).


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
17
Date d'inscription
dimanche 17 octobre 2010
Dernière intervention
12 mai 2011
0
Merci
il y a pas plus court pour ecrire la fonction Affiche ?
Comment je fais pour la fonction vider?
j'écris:

void Vider (int Plateau[3][3]);
{
int Plateau[0][0]=0;
int Plateau[0][1]=0;
int Plateau[0][2]=0;
(etc...)
printf("| %d | %d | %d |\n"Plateau[0][0],Plateau[0][1],Plateau[0][2]);
printf("| %d | %d | %d |\n"Plateau[1][0],Plateau[1][1],Plateau[1][2]);
printf("| %d | %d | %d |\n"Plateau[2][0],Plateau[2][1],Plateau[2][2]);
}

????
Commenter la réponse de celialita
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
0
Merci
La fonction affiche est très bien. Puisque tu n'as que 3x3 cases, tu peux l'écrire comme tu l'as fait. On pourrait faire une double boucle, mais ça serait plus long à écrire.

Tu confonds déclaration et affectation, il faut réviser les bases !
int Plateau[0][0]=0;
int Plateau[0][1]=0;
int Plateau[0][2]=0;
(etc...)


Devrait être:
Plateau[0][0]=0;
Plateau[0][1]=0;
Plateau[0][2]=0;
(etc...)


Pour vider le plateau, rien ne t'empêche de faire une double boucle, comme tu l'as fait pour l'étape 3.


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
17
Date d'inscription
dimanche 17 octobre 2010
Dernière intervention
12 mai 2011
0
Merci
Ah mais c'est pas tout simplement qu'on prends l'algorithme 3 et on remplace le int main blabla par

void Vider(int Plateau[3][3])
{
int Plateau[3][3];
int i;
int j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
Plateau[i][j]=0;
}
}
Commenter la réponse de celialita
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
0
Merci
Pourquoi redéclares-tu Plateau si tu l'as déjà en argument ?

Tu as l'air d'éprouver des difficultés avec les concepts suivants:
- Portée d'une variable
- Passage en argument
- Masquage d'argument

Je t'invite à faire une petite recherche Google sur ces principes. Ce sont des bases importantes, et les approfondir t'aiderait énormément. Une fois que tu auras bien saisi ces principes, je pense que la plupart de tes problèmes se seront envolés.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
17
Date d'inscription
dimanche 17 octobre 2010
Dernière intervention
12 mai 2011
0
Merci
je trouve pas la notion de masquage d'argument

void Vider(int Plateau[3][3])
{
int i;
int j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
Plateau[i][j]=0;
}
}

pour ma défense je me suis planté quand j'ai recopié je voulais ecrire ça ...
:$
Commenter la réponse de celialita
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
0
Merci
Le masquage d'argument c'est juste le fait d'avoir une variable qui cache un argument.

Exemple:
void maFonction(int a)
{
  int a = 2; /* Cette variable "a" cache l'argument aussi appelé "a" */
  printf("%d\n", a); // Affichera 2 au lieu de 5
}
maFonction(5); // Affichera 2 au lieu de 5


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
17
Date d'inscription
dimanche 17 octobre 2010
Dernière intervention
12 mai 2011
0
Merci
ah d'accord ...
mais je suis peut etre bête mais je vois pas d'autre manière d'écrire la fonction VIDER...
et pourtant ça fait 30ans que je cherche ...
Commenter la réponse de celialita
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
0
Merci
La fonction "vider", telle que tu l'as corrigé, est correcte.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
17
Date d'inscription
dimanche 17 octobre 2010
Dernière intervention
12 mai 2011
0
Merci
ah bé c'etait une erreur de copié collé !!
je continue ...
Commenter la réponse de celialita
Messages postés
17
Date d'inscription
dimanche 17 octobre 2010
Dernière intervention
12 mai 2011
0
Merci
void QUELCOUP?(intPlateau[][],int joueur);
{
int joueur = 0;
int x;
int y;
int fin = 0;

while (!fin)
{
printf("Joueur %d saissisez les coordonnées de la case: ", (joueur % 2) + 1);
scanf("%d,%d", &x, &y);
printf("Joueur %d a saisi: %d,%d\n\n", (joueur % 2) + 1, x, y);
++joueur;
}
if (joueur%2)+1 ==1)
{
Plateau[x][y]='1';
}
else
{
Plateau[x][y]='2';
}

et comment ecrire "marquer la case si elle est valide" ??
Commenter la réponse de celialita
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Dernière intervention
19 novembre 2018
0
Merci
Tu mélanges un peu trop de chose. La fonction quelcoup() , ne fait QUE demander des coordonnées pour UN joueur et marquer une case, si elle n'est pas occupée.

La logique est donc:
1- Demander coordonnées
2- Si case est vide, alors mettre le numéro du joueur
3- Si case non vide ou si coordonnées invalide, alors revenir à l'étape 1

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.