📄 c-doku.c
字号:
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 + -