⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c-doku.c

📁 1、较复杂的数独游戏
💻 C
📖 第 1 页 / 共 5 页
字号:
            if(grille[i][j].affiche != 0)
            {
                // On l'ajoute au tableau des occurences de la colonne
                tab[grille[i][j].affiche] = tab[grille[i][j].affiche] + 1;
            }
        }

        // A la fin de la ligne, on parcourt le tableau pour v閞ifier qu'il n'y
        // a pas de chiffres en double
        for(i=1;i<(taille+1);i++)
        {
            // Si un chiffre est en double, ou plus, on retourne 1
            if(tab[i] > 1)
            {
                *valeur  = i;
                *colonne = j;
                return 2;
            }
        }
    }

    do
    {
        for(j=1;j<taille+1;j++)
        {
            tab[j] = 0;
        }
        // On teste les zones suivant la taille
        if(k == 1)
        {
            zonex = 0;
            zoney = 0;
        }
        if(k == 2)
        {
            zonex = 0;
            zoney = 1;
        }
        if(k == 3)
        {
            zonex = 1;
            zoney = 0;
        }
        if(k == 4)
        {
            zonex = 1;
            zoney = 1;
        }
        if(taille > 4)
        {
            if(k == 5)
            {
                zonex = 2;
                zoney = 0;
            }
            if(k == 6)
            {
                zonex = 2;
                zoney = 1;
            }
            if(taille > 6)
            {
                if(k == 7)
                {
                    zonex = 0;
                    zoney = 2;
                }
                if(k == 8)
                {
                    zonex = 1;
                    zoney = 2;
                }
                if(k == 9)
                {
                    zonex = 2;
                    zoney = 2;
                }
            }
        }

        // Coordonnees reelles du debut de la zone
        a=zoneh*zonex;
        b=zonel*zoney;

        for(i=a;i<(a+zoneh);i++)
        {
            for(j=b;j<(b+zonel);j++)
            {
                if(grille[i][j].affiche != 0)
                {
                    tab[grille[i][j].affiche] = tab[grille[i][j].affiche] + 1;
                }
            }
        }
        // A la fin de la zone, on parcourt le tableau pour v閞ifier qu'il n'y
        // a pas de chiffres en double
        for(i=1;i<(taille+1);i++)
        {
            // Si un chiffre est en double, ou plus, on retourne 1
            if(tab[i] > 1)
            {
                *ligne   = zonex;
                *colonne = zoney;
                *valeur   = i;
                return 3;
            }
        }
        k++;
    }
    while(k < 10);

    return(0);
}

/*
    Ensemble de fonctions
    gerant l'historique des coups joues
*/

// Renvoie le nombre de coups joues
int nombrecoup(pcoup p)
{
    pcoup aux = p;
    int c = 0;

    // Si la liste est vide, alors aucun coup n'a ete joue
    if(aux == NULL)
    {
        return(0);
    }
    else
    {
        while(aux != NULL)
        {
            c++;
            aux = aux->suivant;
        }
        return(c);
    }
}

// Cree un coup afin de l'ajouter a l'historique des coups
// Renvoie un pointeur vers ce nouveau coup
pcoup creecoup(cell** grille, int taille, int nb, int affiche, int x, int y, int methode)
{
    int tabgrille[255];
    int i = 0;

    pcoup aux = (pcoup)malloc(sizeof(tcoup));

    aux->nb = nb;
    aux->affiche = affiche;
    aux->x = x;
    aux->y = y;
    aux->methode = methode;

    sauvegrille(grille,taille,tabgrille);
    for(i=0;i<taille*taille;i++)
    {
        aux->tabgrille[i] = tabgrille[i];
    }

    aux->suivant = NULL;

    return(aux);
}

// Ajoute un coup a l'historique des coups
// Renvoie le debut de la liste des coups
pcoup ajoutcoup(cell** grille, int taille, pcoup p, int nb, int affiche, int x, int y, int methode)
{
    pcoup aux = p;

    if(p==NULL)
    {
        return(creecoup(grille,taille,nb,affiche,x,y,methode));
    }
    else
    {
        p->suivant = ajoutcoup(grille,taille,p->suivant,nb,affiche,x,y,methode);
        return(p);
    }
}

// Supprime l'ensemble de l'historique des coups joues
// Renvoie un pointeur vers le debut de la liste
pcoup supprimecoups(pcoup p)
{
    while(p != NULL)
    {
        pcoup aux = p;
        p = p->suivant;
        free(aux);
        aux = NULL;
    }
    return(p);
}

// Fonction pour la librairie Adime permettant de d閒inir les actions des boutons OK et Cancel des boites de dialogue
int callback(DIALOG *d, int button_index)
{
   switch (button_index) {
      /* Bouton OK */
      case 1:
         /* Retourne 1 pour indiquer que le bouton 1 (OK) a ete clique,
            et ajoute un signe negatif pour dire a adime_dialogf() de
            sauvegarder les resultats. */
         return -1;

      /* Bouton Cancel */
      case 2:
         /* Retourne 2 pour indiquer que le bouton 2 (Cancel) a ete clique,
            et n'ajoute pas de signe negatif pour dire a adime_dialogf()
            d'ignorer les resultats. */
         return 2;
   }
}

// Boite de dialogue Adime pour revenir a un coup donne
void revientcoup_adime(int *revientnb)
{
    int nb = 0;

    adime_lowlevel_dialogf("Revenir a un coup : ",
                        ADIME_ALIGN_CENTRE,
                        ADIME_ALIGN_CENTRE,
                        200,
                        "Coup numero:%int[,]"
                        "%buttonrow[&OK;ENTER,"
                        "&Cancel;ESC]"
                        ,&nb,callback);

    *revientnb = nb;
}

// Revient au coup demande par l'utilisateur
// Retourne le debut de la liste
pcoup revientcoup(cell** grille, int taille, pcoup p, int nb)
{
    if(p != NULL)
    {
            if(p->nb == nb)
            {
                // Charge la grille a l'instant du coup
                chargegrille(grille,taille,p->tabgrille);
                // Supprime les coups suivants
                p->suivant = supprimecoups(p->suivant);
            }
            else
            {
                p->suivant = revientcoup(grille,taille,p->suivant,nb);
            }
            return(p);
    }
}

// Affiche l'ensemble des coups joues en mode graphique
int affichecoup_allegro(cell** grille, int taille, BITMAP* buffer, BITMAP* fond, int hist_choix)
{
    int i = 10;
    int j = 50;
    int nb = 0;
    pcoup aux;

    // Affiche le fond pour afficher les coups de l'historique
    draw_sprite(buffer,fond,0,0);

    // Si le bouton gauche de la souris est enfonce et qu'elle est sur
    // le bouton "Retour", on revient au jeu
    if((mouse_b & 1) && mouse_x > 613 && mouse_x < 782 && mouse_y > 576 && mouse_y < 594)
    {
        return 1;
    }
    // Si l'historique choisi est celui du joueur
    if(hist_choix == 1)
    {
        aux = hist;
        // Si le bouton gauche de la souris est enfonce et qu'elle est sur
        // le bouton "Revenir a un coup", on appelle revientcoup_adime()
        if((mouse_b & 1) && mouse_x > 490 && mouse_x < 740 && mouse_y > 3 && mouse_y < 41)
        {
            revientcoup_adime(&nb);
            // Si le coup choisi est different de 0, on y revient
            if(nb != 0)
            {
                revientcoup(grille,taille,hist,nb);
                return 1;
            }
        }
    }
    // Si l'historique choisi est celui du PC
    if(hist_choix == 2)
    {
        aux = histpc;
    }

    // On deroule la liste de l'historique selectionne
    while(aux != NULL)
    {
        textprintf_ex(buffer,font, i, j, makecol(0, 0, 0),-1,"Coup #%i :",aux->nb);
        textprintf_ex(buffer,font, i, j+9, makecol(0, 0, 0),-1,"grille[%i][%i] = %i",aux->x,aux->y,aux->affiche);

        switch(aux->methode)
        {
            case 0: textprintf_ex(buffer,font, i, j+18, makecol(0, 0, 0),-1,"Creation de la grille");
            break;
            case 1: textprintf_ex(buffer,font, i, j+18, makecol(0, 0, 0),-1,"Methode = manuelle");
            break;
            case 2: textprintf_ex(buffer,font, i, j+18, makecol(0, 0, 0),-1,"Methode = logique1 ");
            break;
            case 3: textprintf_ex(buffer,font, i, j+18, makecol(0, 0, 0),-1,"Methode = logique");
                    textprintf_ex(buffer,font, i, j+26, makecol(0, 0, 0),-1,"          lignes");
            break;
            case 4: textprintf_ex(buffer,font, i, j+18, makecol(0, 0, 0),-1,"Methode = logique");
                    textprintf_ex(buffer,font, i, j+26, makecol(0, 0, 0),-1,"          colonnes");
            break;
            case 5: textprintf_ex(buffer,font, i, j+18, makecol(0, 0, 0),-1,"Methode = back-");
                    textprintf_ex(buffer,font, i, j+26, makecol(0, 0, 0),-1,"          tracking");
            break;
            default: textprintf_ex(buffer,font, i, j+18, makecol(0, 0, 0),-1,"Methode = ERREUR");
            break;
        }
        // On incremente les coordonnees d'affichage pour faire plusieurs colonnes
        j = j+32;
        if(j > 580)
        {
            i = i+160;
            j = 50;
        }

        aux = aux->suivant;
    }
}

/*
    Ensemble de fonctions
    gerant les sauvegardes de grilles
*/

// Enregistre la liste de sauvegardes dans le fichier "c-doku.sav"
void sauver(int *tabtemp, int taille, int niveau, int type, int controle_actif, char *nom, int zoneh, int zonel)
{
    int i = 0;
    int j = 0;
    int k = 0;
    int l = 0;
    int m = 0;
    char ext[4] = ".sav";

    pcoup aux = hist;
    FILE *fichier;

    // Ajoute l'extension ".sav" au nom du fichier
    strcat(nom,ext);

    // Ouvre le fichier en ecriture
    fichier = fopen(nom,"w");

    // Enregistre la taille de la grille
    fprintf(fichier,"------------------------\n");
    fprintf(fichier,"Taille de la grille :\n");
    fprintf(fichier,"%i\n\n",taille);

    // Enregistre la difficulte de la grille
    fprintf(fichier,"------------------------\n");
    fprintf(fichier,"Niveau de difficulte de la grille :\n");
    fprintf(fichier,"%i\n\n",niveau);

    // Enregistre le type de la grille
    fprintf(fichier,"------------------------\n");
    fprintf(fichier,"Type d'affichage de la grille :\n");
    fprintf(fichier,"%i\n\n",type);

    // Enregistre le type de controle de la grille
    fprintf(fichier,"------------------------\n");
    fprintf(fichier,"Controle actif :\n");
    fprintf(fichier,"%i\n\n",controle_actif);

    // Enregistre la grille dans le fichier
    for(i=0;i<((taille)*(taille));i++)
    {
        k++;
        l++;

        fprintf(fichier,"%i ",tabtemp[i]);

        if(k == taille)
        {
            fprintf(fichier,"\n");
            k = 0;
            m++;
        }
        if(l == zonel)
        {
            if(k != 0)
            {
                fprintf(fichier," ");
            }
            l = 0;
        }
        if(m == zoneh)
        {
            fprintf(fichier,"\n");
            m = 0;
        }
    }

    k = 0;
    l = 0;
    m = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -