Fonction gagnant

Skyyaeee Messages postés 9 Statut Membre -  
paly2 Messages postés 261 Statut Membre -
Bonjour,
J'ai besoin d'une fonction avec des if pour, dans mon puissance 4 qu'il détecte si il y a un gagnant, voila mon code -->



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

int main()
{
    char j1[10], j2[10];
    int choix, quitter=0;

    printf("Nom du premier joueur ?\n");
    scanf("%s",&j1);
    printf("Nom du deuxieme joueur ?\n");
    scanf("%s",&j2);

    printf("\n");
    printf("\n");
    printf("\n");
    printf("\n");
    printf("\n");
    printf("\n");

    char Tableau[43];
    int i=0;
    while(quitter==0)
    {
        while(i<42)
        {
            Tableau[i]=' ';
            i++;
        }
        printf("| 1 | 2 | 3 | 4 | 5 | 6 | 7 |\n");
        printf("+---+---+---+---+---+---+---+\n");
        printf("| %c | %c | %c | %c | %c | %c | %c |\n",Tableau[0],Tableau[1],Tableau[2],Tableau[3],Tableau[4],Tableau[5],Tableau[6]);
        printf("+---+---+---+---+---+---+---+\n");
        printf("| %c | %c | %c | %c | %c | %c | %c |\n",Tableau[7],Tableau[8],Tableau[9],Tableau[10],Tableau[11],Tableau[12],Tableau[13]);
        printf("+---+---+---+---+---+---+---+\n");
        printf("| %c | %c | %c | %c | %c | %c | %c |\n",Tableau[14],Tableau[15],Tableau[16],Tableau[17],Tableau[18],Tableau[19],Tableau[20]);
        printf("+---+---+---+---+---+---+---+\n");
        printf("| %c | %c | %c | %c | %c | %c | %c |\n",Tableau[21],Tableau[22],Tableau[23],Tableau[24],Tableau[25],Tableau[26],Tableau[27]);
        printf("+---+---+---+---+---+---+---+\n");
        printf("| %c | %c | %c | %c | %c | %c | %c |\n",Tableau[28],Tableau[29],Tableau[30],Tableau[31],Tableau[32],Tableau[33],Tableau[34]);
        printf("+---+---+---+---+---+---+---+\n");
        printf("| %c | %c | %c | %c | %c | %c | %c |\n",Tableau[35],Tableau[36],Tableau[37],Tableau[38],Tableau[39],Tableau[40],Tableau[41]);
        printf("+---+---+---+---+---+---+---+\n");

        printf("joueur 1, sur quelle colonne voulez-vous mettre votre jeton ?");
        scanf("%d",&choix);

        system("pause");

        int compteur=5;
        while(compteur>=0)
        {
            if(Tableau[compteur*7+choix-1]==' ')
            {
                Tableau[compteur*7+choix-1]='X';
                compteur=-1;
            }
            else
            {
                compteur--;
            }
        }

        system("cls");
        printf("| 1 | 2 | 3 | 4 | 5 | 6 | 7 |\n");
        printf("+---+---+---+---+---+---+---+\n");
        printf("| %c | %c | %c | %c | %c | %c | %c |\n",Tableau[0],Tableau[1],Tableau[2],Tableau[3],Tableau[4],Tableau[5],Tableau[6]);
        printf("+---+---+---+---+---+---+---+\n");
        printf("| %c | %c | %c | %c | %c | %c | %c |\n",Tableau[7],Tableau[8],Tableau[9],Tableau[10],Tableau[11],Tableau[12],Tableau[13]);
        printf("+---+---+---+---+---+---+---+\n");
        printf("| %c | %c | %c | %c | %c | %c | %c |\n",Tableau[14],Tableau[15],Tableau[16],Tableau[17],Tableau[18],Tableau[19],Tableau[20]);
        printf("+---+---+---+---+---+---+---+\n");
        printf("| %c | %c | %c | %c | %c | %c | %c |\n",Tableau[21],Tableau[22],Tableau[23],Tableau[24],Tableau[25],Tableau[26],Tableau[27]);
        printf("+---+---+---+---+---+---+---+\n");
        printf("| %c | %c | %c | %c | %c | %c | %c |\n",Tableau[28],Tableau[29],Tableau[30],Tableau[31],Tableau[32],Tableau[33],Tableau[34]);
        printf("+---+---+---+---+---+---+---+\n");
        printf("| %c | %c | %c | %c | %c | %c | %c |\n",Tableau[35],Tableau[36],Tableau[37],Tableau[38],Tableau[39],Tableau[40],Tableau[41]);
        printf("+---+---+---+---+---+---+---+\n");


        system("pause");
        printf("joueur 2, sur quelle colonne voulez-vous mettre votre jeton ?");
        scanf("%d",&choix);

        compteur=5;

        while(compteur>=0)
        {
            if(Tableau[compteur*7+choix-1]==' ')
            {
                Tableau[compteur*7+choix-1]='O';
                compteur=-1;
            }
            else
            {
                compteur--;
            }
        }

        printf("| 1 | 2 | 3 | 4 | 5 | 6 | 7 |\n");
        printf("+---+---+---+---+---+---+---+\n");
        printf("| %c | %c | %c | %c | %c | %c | %c |\n",Tableau[0],Tableau[1],Tableau[2],Tableau[3],Tableau[4],Tableau[5],Tableau[6]);
        printf("+---+---+---+---+---+---+---+\n");
        printf("| %c | %c | %c | %c | %c | %c | %c |\n",Tableau[7],Tableau[8],Tableau[9],Tableau[10],Tableau[11],Tableau[12],Tableau[13]);
        printf("+---+---+---+---+---+---+---+\n");
        printf("| %c | %c | %c | %c | %c | %c | %c |\n",Tableau[14],Tableau[15],Tableau[16],Tableau[17],Tableau[18],Tableau[19],Tableau[20]);
        printf("+---+---+---+---+---+---+---+\n");
        printf("| %c | %c | %c | %c | %c | %c | %c |\n",Tableau[21],Tableau[22],Tableau[23],Tableau[24],Tableau[25],Tableau[26],Tableau[27]);
        printf("+---+---+---+---+---+---+---+\n");
        printf("| %c | %c | %c | %c | %c | %c | %c |\n",Tableau[28],Tableau[29],Tableau[30],Tableau[31],Tableau[32],Tableau[33],Tableau[34]);
        printf("+---+---+---+---+---+---+---+\n");
        printf("| %c | %c | %c | %c | %c | %c | %c |\n",Tableau[35],Tableau[36],Tableau[37],Tableau[38],Tableau[39],Tableau[40],Tableau[41]);
        printf("+---+---+---+---+---+---+---+\n");


    }
    system("pause");

    return 0;
}
EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.






A voir également:

3 réponses

paly2 Messages postés 261 Statut Membre 25
 
Poster le code avec les balises <code c>, en l'état je ne peux pas le lire (et je ne l'ai pas lu).

Pour ta fonction, verifier en ligne ou en colonne c'est facile, je pense que tu peux le faire. En diagonale, c'est un peu plus compliqué: Il faut que tu vérifies en incrémentant le numéro de la ligne ET de la colonne puis en incrémentant le numéro de la ligne et en décrémentant le numéro de la colonne (4 fois bien sûr, en vérifiant à chaque fois la couleur du jeton obtenu).
0
NHenry Messages postés 15483 Date d'inscription   Statut Modérateur Dernière intervention   367
 
Edition faite.
0
Skyyaeee Messages postés 9 Statut Membre
 
tu ne saurait pas m'aider juste pour les lignes et colonnes ?
0
Dalfab Messages postés 720 Statut Membre 101
 
Bonjour,

Le moyen le plus intuitif, tu envisages chacune des cases occupée du plateau. Pour chaque, on vérifie si cette position est suivie de 3 pions de même couleur en envisageant :
  • les 3 cases successives au-dessus;
  • les 3 cases successives à droite;
  • les 3 cases en diagonale montante;
  • les 3 cases en diagonale descendante.
    for ( int co = 0 ; co < 7 ; co++ ) {
       for ( int li = 0 ; li < 6 ; li++ ) {
          char coul = Tableau[li*7+co]; // couleur de la case a verifier
          if ( coul != ' ' ) {
             int h;
             // verifier les 3 au dessus
             for ( h = 1 ; h < 4 && (li+h)<6 ; h++ ) { // 3 autres si possible
                 if ( coul != Tableau[(li+h)*7+co] ) // autre couleur ou vide
                    break;       // stop avant le 4ieme
             }
             if ( h == 4 )   // tous etaient de la meme couleur
                return coul; // on retourne la couleur du gagnant
             // verifier les 3 a droite
             // verifier la diagonale montante
             // verifier la diagonale descendante
          }
       }
    }
    return ' '; // personne n'a gagne
0
Skyyaeee Messages postés 9 Statut Membre
 
Bonjour,
Merci pour ton aide, mais je vais t'en demander encore :)

Sa fait un bout de temps que je n'ai plus toucher au C donc, cela veut dire que ce que tu m'a envoyé, je n'ai aucune idée ou le mettre.

Merci de m'aider.
0
Dalfab Messages postés 720 Statut Membre 101 > Skyyaeee Messages postés 9 Statut Membre
 
Désolé
0
Skyyaeee Messages postés 9 Statut Membre
 
Tu ne serrait pas m'aider ducoup ?
0
paly2 Messages postés 261 Statut Membre 25
 
Sujet du topic: fonction gagnant

Le code que t'a passé ici Dalfab, c'est celui de la fonction "gagnant".
char gagnant(char* Tableau) {
    // Code...
}


L'endroit où il faut appeler la fonction gagnant ? He bien, tout simplement l'endroit où tu dois vérifier si quelqu'un a gagné.
0
paly2 Messages postés 261 Statut Membre 25
 
Maintenant que ton code est lisible, je peux faire quelques remarques ;-) :
-
system("pause");
: Ce n'est pas portable et la fonction system entraîne une faille de sécurité. À enlever absolument, et le remplacer par exemple par :
printf("Appuyez sur Entrée pour continuer...\n");
while (getchar() != '\n');


-
system("cls");
: Pas portable non plus, et tout aussi dangereux. Utilise plutôt
printf("\e[1;1H\e[2J");
, mais ça ne fonctionnera peut-être pas: il n'existe aucun moyen spécifié par la norme C (même la dernière C11) d'effacer l'écran, seulement des moyens propres à chaque système d'exploitation.

-
#include <stdlib.h>
: Tu en avais besoin pour system(). Maintenant que tu ne l'utilises plus (n'est-ce pas ?), cette inclusion est devenue obsolète pour ton programme et tu peux la retirer :)

-
char Tableau[43];
: Non seulement tu n'as besoin que de 42 cases (6*7 = 42), mais surtout tu te complexifies la vie avec un tableau à une seule dimension, c'est pour ça aussi que tu n'arrives pas à faire les algorithmes... Deux dimensions seraient beaucoup plus logiques:
char Tableau[6][7];
, tu y accèdes en faisant Tableau[ligne][colonne].

- Partout, tu utilises un type
char
pour stocker l'état des cases. Une énumération serait plus logique, par exemple:
typedef enum {JAUNE, ROUGE, RIEN} couleur_type;


-
 while(quitter==0)
    {
        while(i<42)
        {
            Tableau[i]=' ';
            i++;
        }

Tu initialises ton tableau dans ta boucle. Donc à chaque fois que la boucle va se relancer ton tableau va être effacé.
Tu peux initialiser le tableau au moment de la déclaration:
char Tableau[42] = {' '}; // Une dimension
char Tableau[6][7] = {{' '}}; // Deux dimensions, ce que je te conseille


-
int choix, quitter=0;
: À moins que ton compilateur ne date d'avant 1999, il serait plus logique que quitter soit un booléen:
bool quitter=false;


- C'est très redondant la manière dont tu affiches ton tableau. Fais plutôt une fonction qui contient une boucle.

-
    printf("\n");
    printf("\n");
    printf("\n");
    printf("\n");
    printf("\n");
    printf("\n");

?...
printf("\n\n\n\n\n\n");


- Il n'y a pas que des choses négatives, tout ce que je ne fais pas remarquer est positif ! Exemple: ton indentation est parfaite.

La curiosité est une excellente qualité !
0
Skyyaeee Messages postés 9 Statut Membre
 
Merci bien a toi pour t'es conseils, pourrait tu m'aider a remplacer tout ce que tu m'a dit dans mon code original ci-dessus ?
0
paly2 Messages postés 261 Statut Membre 25
 
Je suis sûr que tu peux le faire tout seul, n'hésite pas à poser des questions précises si besoin ;) (par exemple si, en dépit de tes recherches et essais, tu ne parviens pas à utiliser une énumération).
0
Skyyaeee Messages postés 9 Statut Membre
 
Ok, ben j'ai fait les modifications de ton deuxième message, mais je suis toujours bloqué pour les vérifications lignes et colonnes, même avec la fonction de Dalfab, je sais pas si elle est finie, si ont peut directement la mettre dans mon programme ou pas ?
0
paly2 Messages postés 261 Statut Membre 25
 
La fonction de Dalfab n'est pas terminée: pour le moment, elle ne contient que la vérification des colonnes.
Mais avec ce qu'il te montre, si tu comprends sa fonction, alors tu pourras facilement la terminer.

Je le reproduis ici en utilisant un tableau à 2 dimensions (ça t'aidera peut-être):

for ( int co = 0 ; co < 7 ; co++ ) {
   for ( int li = 0 ; li < 6 ; li++ ) {
      char coul = Tableau[li][co]; // couleur de la case a verifier
      if ( coul != ' ' ) {
         int h;
         // verifier les 3 au dessus
         for ( h = 1 ; h < 4  && (li+h)<6 ; h++ ) { // 3 autres si possible
             if ( coul != Tableau[li+h][co] ) // autre couleur ou vide
                break;       // stop avant le 4ieme
         }
         if ( h == 4 )   // tous etaient de la meme couleur
            return coul; // on retourne la couleur du gagnant

         // Comme je suis très sympa, je fais la vérification en ligne !!
         for ( h = 1 ; h < 4 && (co+h)<7 ; h++ ) { // La condition change un peu (li+h devient co+h).
             if ( coul != Tableau[li][co+h] ) // On remplace juste Tableau[li+h][co] par Tableau[li][co+h].
                break;
         }
         if ( h == 4 )
            return coul;

         // verifier la diagonale montante
         // verifier la diagonale descendante
      }  
   }
}
return ' '; // personne n'a gagne
0