-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgenerer.c
More file actions
executable file
·150 lines (119 loc) · 4.23 KB
/
generer.c
File metadata and controls
executable file
·150 lines (119 loc) · 4.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "structures.h"
#include "verifications.h"
#include "resoudre.h"
#include "fichiers.h"
#include "generer.h"
int evaluer_niveau(int grille[9][9], int nb_cases)
{
int lvl, i, j, n, nb_directs = 0, nb_a_trouver = 0, nbre;
nb grille_poss[9][9];
verif_possibilites(grille, grille_poss);
for(i = 0; i < 9; i++)
{
for(j = 0; j < 9; j++)
{
nbre = 0;
for(n = 0; n < 9; n++)
{
if(grille_poss[i][j].nombre[n] == 1) {nbre++;}
}
if(nbre == 1) {nb_directs++;} // On compte le nombre de cases où il n'y a qu'une seule possibilité
}
}
nb_a_trouver = nb_cases - nb_directs; // Dans le nombre de cases à trouver on retire les cases les plus directes
// On attribue le niveau selon le nombre de cases non directes à trouver
if(nb_a_trouver >= BORNE_FACILE && nb_a_trouver < BORNE_MOYEN) {lvl = 1;}
else if(nb_a_trouver >= BORNE_MOYEN && nb_a_trouver < BORNE_DIFFICILE) {lvl = 2;}
else if(nb_a_trouver >= BORNE_DIFFICILE) {lvl = 3;}
else {lvl = 0;} // Si il ne manque pas assez de cases
return lvl;
}
void generer (int grille[9][9], int lvl)
{
int i, j, n, nb, p, continuer = 1, lvl_actuel, grille_test[9][9];
srand(time(NULL)); // Initialisation de rand
// Initialisation de la grille (on ne sait pas ce qu'elle contient, ça peut être une ancienne grille)
for(i = 0; i < 9; i++)
{
for(j = 0; j < 9; j++)
{
grille[i][j] = 0;
}
}
/* Les 3 régions de la diagonale peuvent être remplies aléatoirement sans se soucier des lignes ni des colonnes (juste en faisant attention à ne pas mettre 2 fois le même nombre dans la région) */
for(i = 0; i < 3; i++) // Remplissage de la région située en haut à gauche
{
for(j = 0; j < 3; j++)
{
n = (int)((rand()/(double)RAND_MAX)*9 +1); //+1 Car avec la castation on risque d'obtenir 0
if(n > 9) {n = 9;} // On vérifie qu'on ne dépasse pas les bornes
p = verif_case(grille, n, i, j);
while(!p)
{
if(n==9) {n=1;}
else {n++;}
p = verif_case(grille, n, i, j);
}
grille[i][j] = n; // Une fois qu'on arrive ici c'est que le n est valide
}
}
for(i = 3; i < 6; i++) // Remplissage de la région située au milieu
{
for(j = 3; j < 6; j++)
{
n = (int)((rand()/(double)RAND_MAX)*9 +1); // Même résonnement
if(n > 9) {n = 9;}
p = verif_case(grille, n, i, j);
while(!p)
{
if(n==9) {n=1;}
else {n++;}
p = verif_case(grille, n, i, j);
}
grille[i][j] = n;
}
}
for(i = 6; i < 9; i++) // Remplissage de la région située en bas à droite
{
for(j = 6; j < 9; j++)
{
n = (int)((rand()/(double)RAND_MAX)*9 +1); // Même résonnement
if(n > 9) {n = 9;}
p = verif_case(grille, n, i, j);
while(!p)
{
if(n==9) {n=1;}
else {n++;}
p = verif_case(grille, n, i, j);
}
grille[i][j] = n;
}
}
/* La diagonale est générée, on peut finir de compléter la grille en faisant appel à la fonction résoudre et en supposant les cases manquantes */
resoudre(grille);
/* On obtient donc une grille complète, il faut retirer certaines cases pour la rendre jouable */
continuer = 1;
nb = 0;
while(continuer)
{
i = (int)((rand()/(double)RAND_MAX)*8);
j = (int)((rand()/(double)RAND_MAX)*8);
if(grille[i][j] != 0)
{
n = grille[i][j];
grille_test[i][j] = 0;
p = resoudre_sans_supposition(grille_test); // On vérifie qu'il n'y ai qu'une résolution possible
if(p)
{
grille[i][j] = 0;
nb++;
lvl_actuel = evaluer_niveau(grille, nb);
if(lvl_actuel == lvl) {continuer = 0;}
}
copier_grille(grille, grille_test);
}
}
}