Bonjour j'ai créer un petit morpion pour m'entrainée après avoir appris le C . Seul petit problème j'ai l'impression que mon code est dégueulasse et est un peu bizarre . Je me demandais si des personnes pourraient me donner des conseils pour l'améliorer car j'ai beaucoup de problèmes que ce soit avec le programme ou le code de celui ci .
Trucs dérangant :
- Parfois lorsque je veux mettre un point (pion appeler comme vous le voudrez) sur la grille il ne fait plus rien , le programme ne réagit plus .
- J'ai l'impression que je pourrais vérifier si l'on a gagné autrement et que ce que j'ai fait n'est pas une bonne façon
- Je ne passe pas le tableau qui représente la grille en fonction j'ai une variable globale
Morpion.h :
char tab[3][3]; // Grille du morpion
int i;
int x;
void displayGrid();
void initializeGrid();
int AiPlay();
void gridModification(int line, int column);
int checkWin();
Tu boucles tant que "founded" n'est pas à 1. Sauf que si tu tombes sur autre chose qu'un espace, tu vas boucler à l'infinis (tu ne change jamais la ligne et la colonne si la case qu'il à tiré au hasard n'est pas un espace), rajoute un else.
Dans ton main.c:
Dans ton main tu boucles sur "isFinish", les seuls moment où tu passes ta variable à 1 pour sortir de la boucle, tu "return" directement, donc le "return 0" n'est jamais atteint.
Pas propre non plus d'initialiser un variable à chaque tour de boucle .
> J'ai pas trop compris pour les for dans la fonctions checkWin() . Par contre les variables globales c'est un problème ?
En gros il parcourt toutes les lignes / colonnes puis les deux diagonales. Sauf qu'il vas avoir un "invalid write" à cause de son "for(i=0;i<3;i++)" parce que visiblement le tabeau n'as que deux élément et pas trois.(ça arrive).
Tu pourrais encore un peu plus "simplifier" en nombre de lignes en partant du code de Fvirtman, du genre :
Hey , merci beaucoup @venom0218 ! Donc ducoup je doit prévoire mes fonctions pour qu'ellent recoivent un tableau en paramètre ? Sinon je vais corriger tout ça p:
Hey , merci beaucoup @venom0218 ! Donc ducoup je doit prévoire mes fonctions pour qu'ellent recoivent un tableau en paramètre ? Sinon je vais corriger tout ça p:
- Edité par Asstryfi il y a environ 1 heure
Disons que dans les "best practices", oui. Après ici, dans ton cas, tu utilises le tableau dans toutes tes fonctions donc c'est déjà plus "logique" d'avoir ton tableau en global.
Par contre, pour les variables d’itérations "x,i", là sans aucun doute, il vaudrait mieux que tu les aient dans le corps de ta fonction.
Imaginons que tu ais un programme multi-thread, il suffit que 2 thread bouclent avec les mêmes variables d'itérations et tu vas vite atteindre la fin de la boucle (si il s'agit d'un incrémenteur ++) puisque ils vont incrémenté simultanément la même variable 'globale', ratant ainsi des éléments du tableau. (Je sais pas si j'ai été très clair )
"Skill will accomplish what is denied to force" (Mertvago,1995)
Imaginons que tu ais un programme multi-thread, il suffit que 2 thread bouclent avec les mêmes variables d'itérations et tu vas vite atteindre la fin de la boucle (si il s'agit d'un incrémenteur ++) puisque ils vont incrémenté simultanément la même variable 'globale', ratant ainsi des éléments du tableau. (Je sais pas si j'ai été très clair )
Imaginons que tu ais un programme multi-thread, il suffit que 2 thread bouclent avec les mêmes variables d'itérations et tu vas vite atteindre la fin de la boucle (si il s'agit d'un incrémenteur ++) puisque ils vont incrémenté simultanément la même variable 'globale', ratant ainsi des éléments du tableau. (Je sais pas si j'ai été très clair )
Rien à voir ... Que la variable soit en global ou non, cela n'as rien à voir. Quand une variable est utilisée par plusieurs threads, qu'elle soit global ou non, on la protège avec un mutex.
Maintenant, clairement, mettre des variables en global feront qu'elles seront par défaut accessible dans les deux threads. Si ce sont des variables utilisées pour parcourir un tableau, on se rends compte à quel point c'est incohérent (pour ne pas dire stupide) d'avoir ce type de variable en global.
Une variable globale, si on est pas capable d'expliquer clairement pourquoi on la met en global, alors on ne la mets pas en globale. Sinon c'est un nid a emmerde comme pas quatre.
Imaginons que tu ais un programme multi-thread, il suffit que 2 thread bouclent avec les mêmes variables d'itérations et tu vas vite atteindre la fin de la boucle (si il s'agit d'un incrémenteur ++) puisque ils vont incrémenté simultanément la même variable 'globale', ratant ainsi des éléments du tableau. (Je sais pas si j'ai été très clair )
Rien à voir ... Que la variable soit en global ou non, cela n'as rien à voir. Quand une variable est utilisée par plusieurs threads, qu'elle soit global ou non, on la protège avec un mutex.
Maintenant, clairement, mettre des variables en global feront qu'elles seront par défaut accessible dans les deux threads. Si ce sont des variables utilisées pour parcourir un tableau, on se rends compte à quel point c'est incohérent (pour ne pas dire stupide) d'avoir ce type de variable en global.
Une variable globale, si on est pas capable d'expliquer clairement pourquoi on la met en global, alors on ne la mets pas en globale. Sinon c'est un nid a emmerde comme pas quatre.
Si ce sont des variables utilisées pour parcourir un tableau, on se rends compte à quel point c'est incohérent (pour ne pas dire stupide) d'avoir ce type de variable en global.
Si ce sont des variables utilisées pour parcourir un tableau, on se rends compte à quel point c'est incohérent (pour ne pas dire stupide) d'avoir ce type de variable en global.
Ok , j'avais essayer de le faire au début mais je n'arrive pas a passer un tableau multidimensionel en paramètres .
Tu me demandes si ton cas est un bon cas pour l'utilisation d'une variable globale. Je te réponds que tu prends les chose dans le mauvais sens : Ce n'est pas à moi de dire si tu peux utiliser une VG (variable globale), c'est à toi de justifierpourquoi tu utilises une VG.
Petit indice : Hormis les cas où tu es obligé d'utiliser une VG (gestion des signaux, callback imposé style qsort, ...), tu ne dois pas utiliser de VG. Bon ok, y'a peut-être des exceptions comme une bibliothèque d’envois de log (un log peut s'envoyer de partout, et s'il faut des infos au préalable, alors on passe par une VG), mais généralement, VG = NON.
Quand tu auras suffisamment codé, tu sauras capable de distinguer quand tu dois utiliser une VG. Mais pour le moment, c'est plus de la fainéantise qu'autre chose. Et surtout, ca peut amener des bug difficile à tracer logiquement.
J'avais compris que c'était pour désigner une variable globale, mais je m'interrogeais sur la signification du V et du A. Donc en fait c'était juste une faute de frappe, OK.
[Morpion] Mon code est il bien fait ?
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html