Partage
  • Partager sur Facebook
  • Partager sur Twitter

Projet Sudoku

probleme de Chargement d'une partie

    8 janvier 2022 à 18:35:07

    #include <stdio.h>
    
    #include <stdlib.h>
    
    #include <windows.h>  // gotoxy
    
    #include <time.h>    //difftime
    
    
    
    void gotoxy (int x,int y)
    
    {
    
        COORD c;
    
        c.X=x;
    
        c.Y=y;
    
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
    
    }
    
    void sauvegarde(int tab[9][9], int tab2[9][9])
    
    {
        int i,j;
        FILE*fichier=NULL;
    
        fichier = fopen("tab.txt","w+");   // on ouvre un fihier
    
        if (fichier!=NULL)
        {
        for(i=0;i<9;i++)
        {
            for(j=0;j<9;j++)
            {
                fprintf(fichier, "%d ",tab[i][j]);
            }
        }
    
            // for i
        // for j
        for(i=0;i<9;i++)
        {
            for(j=0;j<9;j++)
            {
                fprintf(fichier, "%d ",tab2[i][j]);
            }
        }
    
    
        }
    fclose(fichier);
    }
    
    
    void charger(int tab[9][9], int tab2[9][9])
    
    {
        int i,j;
        FILE*f=NULL;
    
        f = fopen("tab.txt","r");
    
        if (f!=NULL)
        {
        // for i
        // for j
        for(i=0;i<9;i++)
        {
            for(j=0;j<9;j++)
            {
                fscanf(f,"%d ",&tab[i][j]);
            }
        }
    
            // for i
        // for j
        for(i=0;i<9;i++)
        {
            for(j=0;j<9;j++)
            {
                fscanf(f, "%d ",&tab2[i][j]);
            }
        }
    
    
    
        }
    fclose(f);
    }
    
    
    
    void AIDE()
    
    {
    
        char aide;
    
        do
    
        {
    
            printf("\t\t\t\t\tLES REGLES DU SUDOKU\n\n\n");
    
            printf("Sudoku se joue sur une grille de 9x9 espaces.\nDans les lignes et les colonnes sont 9 carres (compose de 3 x 3 espaces).\nChaque rangee, colonne et carre (9 espaces chacun) doit etre rempli avec les numeros 1-9,\nsans repeter aucun nombre dans la rangee, la colonne ou le carre\n\n\n\n");
    
            printf("\t\t\tBONNE CHANCE\n\n\n");
    
            printf("A:Retour au menu\n");
    
            printf("B:Quitter\n");
    
            printf("Choisissez un mode:");
    
            fflush(stdin);
    
            scanf("%c",&aide);
    
        }while(aide<'A' || aide>'B');
    
        switch(aide)
    
        {
            case 'A':
    
                system("cls");
    
                main();
    
            break;
    
            case 'B':
    
               system("cls");
    
                //return 0;
    
            break;
    
     /*       default:
    
               system("cls");
    
                printf("Entrez une valeur correcte");
    
               AIDE();
    
               break;*/
    
        }
    
    }
    
    
    
    void tab(int tab[9][9])
    
    {
    
        int i,j;
    
        for(i=0;i<9;i++)
    
        {
    
            for(j=0;j<9;j++)
    
            {
    
                gotoxy(7*j+18,2*i+2);
    
                if (tab[i][j]!=0)
    
                {
    
                    printf("%d",tab[i][j]);
    
                }
    
            }
    
        }
    
    }
    
    
    
    
    
    void GRILLE()
    
    {
    
        int lignes;
    
    
    
        printf("\t          1      2      3      4      5      6      7      8      9\n");
    
        printf("\t       ___________________________________________________________________\n");
    
        for (lignes=1;lignes<=9;lignes++)
    
        {
    
            printf("\t      ||      |      |      ||      |      |      ||      |      |      ||\n");
    
            printf("\t%d     ||______|______|______||______|______|______||______|______|______||\n",lignes);
    
        }
    
    }
    
    
    
    
    
    void NIVEAU()
    
    {
    
    int tab_facile[9][9]={{9,0,0,0,0,0,0,0,1},{0,0,3,5,2,6,0,4,0},{0,0,7,0,0,9,2,8,6},{0,0,0,0,4,5,0,0,3},{0,6,1,0,0,0,8,5,0},{4,0,0,6,3,0,0,0,0},{8,1,5,7,0,0,3,0,0},{0,3,0,9,8,2,1,0,0},{2,0,0,0,0,0,0,0,8}};
    
    int tab_inter[9][9]={{0,5,6,4,0,0,0,0,0},{2,0,0,6,0,0,0,7,0},{0,7,0,0,2,0,0,0,0},{0,8,0,0,9,0,0,0,0},{9,2,1,5,4,6,8,3,7},{0,0,0,0,7,0,0,9,0},{0,0,0,0,3,0,0,2,0},{0,4,0,0,0,9,0,0,3},{0,0,0,0,0,5,6,4,0}};
    
    int tab_expert[9][9]={{0,0,4,0,0,6,0,0,7},{0,0,0,0,4,0,5,0,0},{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,4,7,3},{0,0,8,0,0,0,2,0,0},{2,4,9,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0},{0,0,3,0,2,0,0,0,0},{8,0,0,4,0,0,7,0,0}};
    
    int tab_init[9][9];
    
    int tab_joueur[9][9];
    
    int i,j;
    
    int l,c,v;
    
    char niveau;
    
    char save;
    
    time_t start , end;
    
    double temps;
    
    do {
    
    printf("\t\t\tCHOIX DU NIVEAU\n\n\n");
    
    printf("A:Facile\n");
    
    printf("B:Intermediaire\n");
    
    printf("C:Expert\n");
    
    printf("D:Retour au menu du jeu\n");
    
    printf("Choisissez un niveau:");
    
    fflush(stdin);
    
    scanf("%c",&niveau);
    
    } while(niveau<'A' || niveau>'E');
    
    switch(niveau)
    
    {
    
        case 'A':
    
            system("cls");
    
            printf("GRILLE NIVEAU FACILE\n\n\n");
    
            for (i=0;i<9;i++)
    
            {
    
                for (j=0;j<9;j++)
    
                    {
    
                    tab_init[i][j] = tab_facile[i][j];
    
                    }
    
            }
    
            break;
    
        case 'B':
    
            system("cls");
    
            printf("GRILLE NIVEAU INTERMEDIAIRE\n\n\n");
    
            for (i=0;i<9;i++)
    
            {
    
                for (j=0;j<9;j++)
    
                    {
    
                   tab_init[i][j] = tab_inter[i][j];
    
                    }
    
            }
    
            break;
    
        case 'C':
    
            system("cls");
    
            printf("GRILLE NIVEAU EXPERT\n\n\n");
    
            for (i=0;i<9;i++)
    
            {
    
                for (j=0;j<9;j++)
    
                    {
    
                    tab_init[i][j] = tab_expert[i][j];
    
                    }
    
            }
    
            break;
    
        case 'D':
    
            system("cls");
    
            main();
    
        default:
    
            system("cls");
    
            printf("Entrez une valeur correcte\n\n\n");
    
            NIVEAU();
    
            break;
    
        }
    
    
    
    
    
        for (i=0;i<9;i++)
    
        {
    
            for (j=0;j<9;j++)
    
            {
    
                tab_joueur[i][j] = tab_init[i][j];
    
            }
    
        }
    
        do
    
        {
    
            system("cls");
    
            GRILLE();
    
            tab(tab_joueur);
    
            printf("\n\n\n");
           start= time(NULL);
           do
    
            {
    
                printf("Choisissez une colonne ou tapez 10 pour quitter : ");
    
                fflush(stdin);
    
                scanf("%d",&c);
    
    
    
            }while(c<1 || c>10);
    
    
    
            do
    
            {
    
                printf("Choisissez une ligne : ");
    
                fflush(stdin);
    
                scanf("%d",&l);
    
    
    
            }while(l<1 || l>9);
    
    
    
            do
    
            {
    
                printf("Entrez un chiffre entre 1 et 9 : ");
    
                fflush(stdin);
    
                scanf("%d",&v);
    
    
    
            }while(v<1 || v>9);
    
    
    
            if (tab_init[l-1][c-1]==0)
    
            {
    
                tab_joueur[l-1][c-1]=v;
    
            }
    
    
        }while(c!=10);
    
    
        if (c=10)
    
        {
            // demander si il veut sauvegarder
            //if
            // sauvergarde(tab_joueur);
            system("cls");
    
            end = time(NULL);
            temps = difftime(end,start);
            printf("le temps est de:%.0f secondes\n\n\n",temps);
            printf("SOUHAITEZ VOUS SAUVEGARDER CETTE PARTIE?\n");
            printf("A: OUI\n");
            printf("B:NON\n");
            printf("Choisissez une option: ");
            fflush(stdin);
            scanf("%c",&save);
            if (save=='A')
            {
                sauvegarde(tab_init,tab_joueur);
            }
    
            system("cls");
            main();
        }
    
    
    
    }
    
    
    
    
    
    int main()
    
    {
    
    char menu;
    int tab1[9][9];
    int tab2[9][9];
    
    
    do
    
    {
    
    
        printf("\t\tMENU SUDOKU\n\n");
    
        printf("A: Continuer une partie\n");
    
        printf("B: Nouveau\n");
    
        printf("C: Aide\n");
    
        printf("D: Quitter\n");
    
        printf("Choisissez un mode:");
    
        fflush(stdin);
    
        scanf("%c",&menu);
    
    } while(menu<'A' || menu>'D');
    
    printf("\n\n");
    
    switch(menu)
    
    {
    
        case'A' :
    
            system("cls");
    
            GRILLE();
            charger(tab1[9][9],tab2[9][9]);
            break;
    
        case 'B':
    
            system("cls");
    
            NIVEAU();
    
            break;
    
        case 'C':
    
            system("cls");
    
            AIDE();
    
            break;
    
    }
    
    
    gotoxy(50,50);
    
    return 0;
    
    }
    

    Bonjour,

    je fais appel a votre aide car je n'arrive pas à continuer une partie dans mon programme pourtant je sauvegarde mon tableau initial contenant mes valeurs et mon tableau joueurs qui me permet de jouer sans changer mon tableau inial.

    Il s'agit d'un projet d'étude et malgré que je sois novice j'ai réaliser ce code par moi même, je voudrais donc une aide et bien entendu pas de réponse toute faites.

    En espérant que vous puissiez m'aider.

    Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      8 janvier 2022 à 18:47:16

      Indente correctement ton code.

      Corrige les warnings ex : le if ligne 446.

      Ensuite si ça ne fonctionne pas comme tu souhaites, utilise un débogueur.

      • Partager sur Facebook
      • Partager sur Twitter
      ...
        8 janvier 2022 à 19:10:59

        Commences par vérifier si le fichier de sortie est correct avant de le charger à nouveau.
        Tu sembles écrire les deux grilles à la suite sur une seule lign. Je ne vois pas de printf("\n");
        Ça fait une ligne de 324 caractères, si je ne me trompe pas. C'est correct en soi mais difficile à vérifier.
        Si tu es su Linux, utilises la commande  cat  pour afficher.
        Sur Windows, tu peux utiliser  type  à la place en mode commande.

        J'aurais écrit une grille par ligne, les chiffres tous collés.

        J'aurais relu avec fgets et fait la conversion caractère chiffre en faisant chiffre = caractere - '0'

        Dans ton switch qui recopie des grilles facile, moyen, etc.

        + tu pourrais faire le cls avant ou après le switch au lieu de le faire pour chaque cas.

        + pourquoi ne pas faire une fonction de copie qui allègerait ton code?

        -
        Edité par PierrotLeFou 8 janvier 2022 à 19:35:10

        • Partager sur Facebook
        • Partager sur Twitter

        Le Tout est souvent plus grand que la somme de ses parties.

          8 janvier 2022 à 22:54:21

          Hello,

          Lignes 132, 342 et 469, ce n'est pas un appel à main() que tu dois faire, mais un return.

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            9 janvier 2022 à 4:18:42

            Autre problème dans ta fonction NIVEAU. Tu l'appelles récursivement avec l'option 'D'.
            Très mauvaise idée. Réorganise ton code autrement.
            Ensuite, le default du swwitch ne devrait pas exister. Il faut tester avant si le choix saisi est correct.
            Dans cette fonction, tu répètes les même choses dans le menu et ce que tu as choisi.
            On peut grandement simplifier en utilisant une liste de structures et faire sauter le switch comme suit:
            (c'est un exemple qui illustre le principe, il faudra adapter à ton projet)
            -
            #include <stdio.h>
            #include <string.h>
            typedef struct Menu Menu;
            struct Menu {
                char *msg;
                int tab[9][9];
            };
            void display(int tab[][9], int l) {
                printf("[%d]", l);
                for(int i=0; i < l; i++)
                    for(int j=0; j<l; j++)
                        printf(" %d", tab[i][j]);
                printf("\n");
            }
            int main(void) {
                int tab_init[9][9];
                Menu menu[] = {
                    {"Facile", {{9,0,0,0,0,0,0,0,1},{0,0,3,5,2,6,0,4,0},{0,0,7,0,0,9,2,8,6},{0,0,0,0,4,5,0,0,3},{0,6,1,0,0,0,8,5,0},{4,0,0,6,3,0,0,0,0},{8,1,5,7,0,0,3,0,0},{0,3,0,9,8,2,1,0,0},{2,0,0,0,0,0,0,0,8}} },
                    {"Intermediaire", {{0,5,6,4,0,0,0,0,0},{2,0,0,6,0,0,0,7,0},{0,7,0,0,2,0,0,0,0},{0,8,0,0,9,0,0,0,0},{9,2,1,5,4,6,8,3,7},{0,0,0,0,7,0,0,9,0},{0,0,0,0,3,0,0,2,0},{0,4,0,0,0,9,0,0,3},{0,0,0,0,0,5,6,4,0}} },
                    {"Expert", {{0,0,4,0,0,6,0,0,7},{0,0,0,0,4,0,5,0,0},{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,4,7,3},{0,0,8,0,0,0,2,0,0},{2,4,9,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0},{0,0,3,0,2,0,0,0,0},{8,0,0,4,0,0,7,0,0}} }
                };
                int max_niveau = sizeof(menu) / sizeof(menu[0]);
                printf("Choix du niveau\n");
                for(int i=0; i < max_niveau; i++)
                    printf("%c: %s\n", i+'A', menu[i].msg);
                int n=9;
                char niveau;
                do {
                    printf("choix? ");
                    scanf("%c", &niveau);
                    while(getchar()!='\n');
                } while(niveau < 'A' || niveau > 'A'+max_niveau);
                printf("Grille Niveau %s\n", menu[niveau-'A'].msg);
                memcpy(tab_init, menu[niveau-'A'].tab, sizeof(tab_init));
                display(tab_init, n);
                return 0;
            }

            -
            Edité par PierrotLeFou 9 janvier 2022 à 7:56:01

            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

            Projet Sudoku

            × 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.
            • Editeur
            • Markdown