Fonction gagnant

Fermé
Skyyaeee Messages postés 6 Date d'inscription samedi 11 juin 2016 Statut Membre Dernière intervention 12 juin 2016 - Modifié par NHenry le 11/06/2016 à 16:53
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 - 13 juin 2016 à 07:24
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 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
11 juin 2016 à 16:39
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 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 331
11 juin 2016 à 16:53
Edition faite.
0
Skyyaeee Messages postés 6 Date d'inscription samedi 11 juin 2016 Statut Membre Dernière intervention 12 juin 2016
Modifié par Skyyaeee le 11/06/2016 à 17:52
tu ne saurait pas m'aider juste pour les lignes et colonnes ?
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
11 juin 2016 à 21:44
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 6 Date d'inscription samedi 11 juin 2016 Statut Membre Dernière intervention 12 juin 2016
12 juin 2016 à 00:16
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 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101 > Skyyaeee Messages postés 6 Date d'inscription samedi 11 juin 2016 Statut Membre Dernière intervention 12 juin 2016
12 juin 2016 à 04:55
Désolé
0
Skyyaeee Messages postés 6 Date d'inscription samedi 11 juin 2016 Statut Membre Dernière intervention 12 juin 2016
12 juin 2016 à 11:59
Tu ne serrait pas m'aider ducoup ?
0
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
12 juin 2016 à 14:03
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 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
Modifié par paly2 le 12/06/2016 à 14: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 6 Date d'inscription samedi 11 juin 2016 Statut Membre Dernière intervention 12 juin 2016
12 juin 2016 à 14:49
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 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
12 juin 2016 à 17:20
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 6 Date d'inscription samedi 11 juin 2016 Statut Membre Dernière intervention 12 juin 2016
12 juin 2016 à 17:37
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 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
13 juin 2016 à 07:24
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