Dogeku 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +39 -0
- data/app/Historique/Action.rb +29 -0
- data/app/Historique/ChangerCase.rb +44 -0
- data/app/Historique/HistoriqueAction.rb +114 -0
- data/app/components/CaseDessin.rb +325 -0
- data/app/components/GrilleDessin.rb +235 -0
- data/app/components/Header.rb +194 -0
- data/app/config/app.yml +0 -0
- data/app/config/database.yml +2 -0
- data/app/controller/ApprentissageControleur.rb +75 -0
- data/app/controller/ChargerControleur.rb +41 -0
- data/app/controller/JeuLibreControleur.rb +244 -0
- data/app/controller/MenuControleur.rb +57 -0
- data/app/controller/NiveauControleur.rb +54 -0
- data/app/controller/NouvellePartieControleur.rb +34 -0
- data/app/controller/PrincipaleControleur.rb +30 -0
- data/app/controller/PseudoControleur.rb +95 -0
- data/app/controller/ReglagesControleur.rb +86 -0
- data/app/controller/ReglesControleur.rb +34 -0
- data/app/controller/ScoresControleur.rb +42 -0
- data/app/controller/StatistiquesControleur.rb +64 -0
- data/app/core/Conf.rb +26 -0
- data/app/core/Controller.rb +180 -0
- data/app/core/Core.rb +186 -0
- data/app/core/Model.rb +159 -0
- data/app/core/View.rb +56 -0
- data/app/db/main.sqlite3 +0 -0
- data/app/model/Configuration.rb +180 -0
- data/app/model/Grille.rb +180 -0
- data/app/model/Jeu.rb +74 -0
- data/app/model/Score.rb +100 -0
- data/app/model/Utilisateur.rb +113 -0
- data/app/utils/DSubset.rb +98 -0
- data/app/utils/Generateur.rb +171 -0
- data/app/utils/HPTriple.rb +75 -0
- data/app/utils/Peche.rb +46 -0
- data/app/utils/SCandidate.rb +86 -0
- data/app/utils/SCell.rb +73 -0
- data/app/utils/Technique.rb +202 -0
- data/app/utils/TechniqueUsine.rb +25 -0
- data/app/utils/XWing.rb +203 -0
- data/app/view/Fenetre.rb +424 -0
- data/app/view/FenetreApprentissage.rb +272 -0
- data/app/view/FenetreCharger.rb +31 -0
- data/app/view/FenetreJeuLibre.rb +468 -0
- data/app/view/FenetreMenu.rb +198 -0
- data/app/view/FenetreNiveau.rb +105 -0
- data/app/view/FenetreNouvellePartie.rb +92 -0
- data/app/view/FenetrePrincipale.rb +45 -0
- data/app/view/FenetrePseudo.rb +115 -0
- data/app/view/FenetreReglages.rb +209 -0
- data/app/view/FenetreRegles.rb +111 -0
- data/app/view/FenetreScores.rb +120 -0
- data/app/view/FenetreStatistiques.rb +134 -0
- data/assets/css/style.css +69 -0
- data/assets/img/eraser.png +0 -0
- data/assets/img/fond.jpg +0 -0
- data/assets/img/iconApp.png +0 -0
- data/assets/img/logoS.jpeg +0 -0
- data/assets/img/sudokuIntro.jpg +0 -0
- data/assets/img/user.png +0 -0
- data/bin/dogeku +19 -0
- data/doc/Action.html +309 -0
- data/doc/ApprentissageControleur.html +568 -0
- data/doc/CaseDessin.html +2405 -0
- data/doc/ChangerCase.html +405 -0
- data/doc/ChargerControleur.html +342 -0
- data/doc/Conf.html +378 -0
- data/doc/Configuration.html +1115 -0
- data/doc/Controller.html +1008 -0
- data/doc/Core.html +1191 -0
- data/doc/DSubset.html +647 -0
- data/doc/Fenetre.html +2631 -0
- data/doc/FenetreApprentissage.html +1175 -0
- data/doc/FenetreCharger.html +343 -0
- data/doc/FenetreJeuLibre.html +1859 -0
- data/doc/FenetreMenu.html +900 -0
- data/doc/FenetreNiveau.html +626 -0
- data/doc/FenetreNouvellePartie.html +602 -0
- data/doc/FenetrePrincipale.html +371 -0
- data/doc/FenetrePseudo.html +695 -0
- data/doc/FenetreReglages.html +946 -0
- data/doc/FenetreRegles.html +636 -0
- data/doc/FenetreScores.html +650 -0
- data/doc/FenetreStatistiques.html +672 -0
- data/doc/Generateur.html +1015 -0
- data/doc/Grille.html +1348 -0
- data/doc/GrilleDessin.html +1281 -0
- data/doc/HPTriple.html +593 -0
- data/doc/Header.html +1253 -0
- data/doc/HistoriqueAction.html +792 -0
- data/doc/Jeu.html +923 -0
- data/doc/JeuLibreControleur.html +1445 -0
- data/doc/MenuControleur.html +522 -0
- data/doc/Model.html +996 -0
- data/doc/NiveauControleur.html +451 -0
- data/doc/NouvellePartieControleur.html +330 -0
- data/doc/Peche.html +396 -0
- data/doc/PrincipaleControleur.html +320 -0
- data/doc/PseudoControleur.html +695 -0
- data/doc/ReglagesControleur.html +747 -0
- data/doc/ReglesControleur.html +330 -0
- data/doc/SCandidate.html +617 -0
- data/doc/SCell.html +587 -0
- data/doc/Score.html +926 -0
- data/doc/ScoresControleur.html +346 -0
- data/doc/StatistiquesControleur.html +390 -0
- data/doc/Technique.html +543 -0
- data/doc/TechniqueUsine.html +252 -0
- data/doc/Utilisateur.html +806 -0
- data/doc/View.html +844 -0
- data/doc/XWing.html +1031 -0
- data/doc/_index.html +478 -0
- data/doc/class_list.html +51 -0
- data/doc/css/common.css +1 -0
- data/doc/css/full_list.css +58 -0
- data/doc/css/style.css +492 -0
- data/doc/file.README.html +141 -0
- data/doc/file_list.html +56 -0
- data/doc/frames.html +17 -0
- data/doc/index.html +141 -0
- data/doc/js/app.js +243 -0
- data/doc/js/full_list.js +216 -0
- data/doc/js/jquery.js +4 -0
- data/doc/method_list.html +2523 -0
- data/doc/top-level-namespace.html +112 -0
- data/test/Generateur/grilleCorrecte.rb +198 -0
- data/test/Model/scoreCorrecte.rb +55 -0
- data/test/Model/utilisateurCorrecte.rb +68 -0
- data/test/test_helper.rb +2 -0
- data/test/unitTest.rb +72 -0
- metadata +187 -0
data/app/utils/SCell.rb
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# => Author:: yguenver
|
|
2
|
+
# => Version:: 0.1
|
|
3
|
+
# => Copyright:: © 2016
|
|
4
|
+
# => License:: Distributes under the same terms as Ruby
|
|
5
|
+
|
|
6
|
+
##
|
|
7
|
+
## Classe pour la technique 'Single Cell'.
|
|
8
|
+
##
|
|
9
|
+
class SCell < Technique
|
|
10
|
+
|
|
11
|
+
##
|
|
12
|
+
## Constructeur de la classe SCell
|
|
13
|
+
##
|
|
14
|
+
## @return Une instance de la classe SCell
|
|
15
|
+
##
|
|
16
|
+
def SCell.creer()
|
|
17
|
+
new()
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
##
|
|
21
|
+
## Recherche une solution pour la technique utilisée
|
|
22
|
+
##
|
|
23
|
+
## @param grille La grille
|
|
24
|
+
##
|
|
25
|
+
## @return res, les informations pour aider l'utilisateur ou nil si la méthode ne trouve rien
|
|
26
|
+
##
|
|
27
|
+
def solution(grille)
|
|
28
|
+
grilleIndice = indice(grille)
|
|
29
|
+
|
|
30
|
+
[0,1,2,3,4,5,6,7,8].sort_by{rand}.each { |x|
|
|
31
|
+
[0,1,2,3,4,5,6,7,8].sort_by{rand}.each { |y|
|
|
32
|
+
cpt = 0
|
|
33
|
+
grilleIndice[x][y].each_value{|v| if v then cpt+=1 end}
|
|
34
|
+
if cpt == 1 then
|
|
35
|
+
grilleIndice[x][y].each{ |key,value|
|
|
36
|
+
if value then return [x,y,key] end
|
|
37
|
+
}
|
|
38
|
+
end
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return nil
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
##
|
|
46
|
+
## Retourne le nombre d'étapes pour faire la technique
|
|
47
|
+
##
|
|
48
|
+
## @return Le nombre d'étapes
|
|
49
|
+
##
|
|
50
|
+
def combienEtape()
|
|
51
|
+
return 2
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
##
|
|
55
|
+
## Retourne les étapes pour faire la technique
|
|
56
|
+
##
|
|
57
|
+
## @param n Le numéro de la technique
|
|
58
|
+
##
|
|
59
|
+
## @return Un texte expliquant l'étape sinon nil
|
|
60
|
+
##
|
|
61
|
+
def etape(n)
|
|
62
|
+
|
|
63
|
+
case(n)
|
|
64
|
+
when 1
|
|
65
|
+
return "Bienvenue sur l'explication de la technique "+self.class.to_s+"."
|
|
66
|
+
when 2
|
|
67
|
+
return "Recherchez les candidats possibles pour chaque case. Remarquez que dans certaines, il n'y a qu'un seul candidat possible."
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
return nil
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# => Author:: yguenver
|
|
2
|
+
# => Version:: 0.1
|
|
3
|
+
# => Copyright:: © 2016
|
|
4
|
+
# => License:: Distributes under the same terms as Ruby
|
|
5
|
+
|
|
6
|
+
##
|
|
7
|
+
## Classe Technique, aidant l'utiliateur à la résolution d'un Sudoku.
|
|
8
|
+
##
|
|
9
|
+
class Technique
|
|
10
|
+
|
|
11
|
+
##
|
|
12
|
+
## Constructeur de la classe Technique
|
|
13
|
+
##
|
|
14
|
+
## @return Une instance de la classe Technique
|
|
15
|
+
##
|
|
16
|
+
def Technique.creer()
|
|
17
|
+
new()
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
##
|
|
22
|
+
## Recherche une solution pour la technique utilisée
|
|
23
|
+
##
|
|
24
|
+
## @param grille La grille
|
|
25
|
+
##
|
|
26
|
+
## @return res, les informations pour aider l'utilisateur ou nil si la méthode ne trouve rien
|
|
27
|
+
##
|
|
28
|
+
def solution(grille)
|
|
29
|
+
return nil
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
##
|
|
33
|
+
## Calcule les candidats pour une grille donnée
|
|
34
|
+
## Retourne le nombre d'étape pour faire la technique
|
|
35
|
+
##
|
|
36
|
+
## @return Le nombre d'étape(s)
|
|
37
|
+
##
|
|
38
|
+
def combienEtape()
|
|
39
|
+
return nil
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
##
|
|
44
|
+
## Retourne les étapes pour faire la technique
|
|
45
|
+
##
|
|
46
|
+
## @param n Le numéro de la technique
|
|
47
|
+
##
|
|
48
|
+
## @return Le nombre d'étape si n=0, un text expliquant l'étape sinon
|
|
49
|
+
##
|
|
50
|
+
def etape(n)
|
|
51
|
+
return nil
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
private # Les méthodes suivantes sont privées
|
|
56
|
+
|
|
57
|
+
##
|
|
58
|
+
## Calcul les candidats pour une grille donnée
|
|
59
|
+
##
|
|
60
|
+
## @param grille La grille
|
|
61
|
+
##
|
|
62
|
+
## @return grilleIndice, un tableau de tableau d'Hashmap
|
|
63
|
+
##
|
|
64
|
+
def indice(grille)
|
|
65
|
+
grilleIndice = Array.new(9){Array.new(9){Hash.new()}}
|
|
66
|
+
|
|
67
|
+
grille.each_with_index { |col,x|
|
|
68
|
+
col.each_with_index { |c,y|
|
|
69
|
+
if c.nil? then
|
|
70
|
+
[1,2,3,4,5,6,7,8,9].each { |numero|
|
|
71
|
+
unless estProtegee?(grille,numero.to_s,x,y) then
|
|
72
|
+
grilleIndice[x][y][numero.to_s] = true
|
|
73
|
+
else
|
|
74
|
+
grilleIndice[x][y][numero.to_s] = false
|
|
75
|
+
end
|
|
76
|
+
}
|
|
77
|
+
end
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return grilleIndice
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
##
|
|
85
|
+
## Recherche dans la grille les numéros déjà présents
|
|
86
|
+
##
|
|
87
|
+
## @param grille La grille
|
|
88
|
+
## @param numero Le numéro
|
|
89
|
+
##
|
|
90
|
+
## @return listPresent, la liste des coordonnées des numéros déjà présents
|
|
91
|
+
##
|
|
92
|
+
def nombreDejaPresent(grille, numero)
|
|
93
|
+
listPresent = Array.new(9) {nil}
|
|
94
|
+
[0,1,2,3,4,5,6,7,8].sort_by{rand}.each{ |x|
|
|
95
|
+
[0,1,2,3,4,5,6,7,8].sort_by{rand}.each{ |y|
|
|
96
|
+
if numero.to_s == grille[x][y] then
|
|
97
|
+
listPresent[numero-1]=grille[x][y]
|
|
98
|
+
end
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return listPresent
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
##
|
|
105
|
+
## Récupère un bloc de 9 cases d'une grille de Sudoku
|
|
106
|
+
##
|
|
107
|
+
## @param grille La grille
|
|
108
|
+
## @param num Le numero du block
|
|
109
|
+
##
|
|
110
|
+
## @return res, un tableau d'un tableau de 3 par 3
|
|
111
|
+
##
|
|
112
|
+
def block(grille, num)
|
|
113
|
+
res = Array.new()
|
|
114
|
+
|
|
115
|
+
x = ((num-1)*3)%9
|
|
116
|
+
y = num/3*3
|
|
117
|
+
|
|
118
|
+
grille[x..x+2].each{ |col|
|
|
119
|
+
res << col[y..y+2]
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return res
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
##
|
|
126
|
+
## Récupère la colonne x dans la grille
|
|
127
|
+
##
|
|
128
|
+
## @param grille La grille
|
|
129
|
+
## @param x La colonne
|
|
130
|
+
##
|
|
131
|
+
## @return la colonne x
|
|
132
|
+
##
|
|
133
|
+
def colonne(grille, x)
|
|
134
|
+
return grille[x]
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
##
|
|
138
|
+
## Récupère la ligne y dans la grille
|
|
139
|
+
##
|
|
140
|
+
## @param grille La grille
|
|
141
|
+
## @param y La ligne
|
|
142
|
+
##
|
|
143
|
+
## @return res, la ligne
|
|
144
|
+
##
|
|
145
|
+
def ligne(grille, y)
|
|
146
|
+
res = Array.new()
|
|
147
|
+
grille.each{ |col|
|
|
148
|
+
res << col[y]
|
|
149
|
+
}
|
|
150
|
+
return res
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
##
|
|
154
|
+
## Vérifie si une case est protégée pour un numéro donnée
|
|
155
|
+
##
|
|
156
|
+
## @param grille La grille
|
|
157
|
+
## @param num Le numero
|
|
158
|
+
## @param x La colonne de la case
|
|
159
|
+
## @param y La ligne de la case
|
|
160
|
+
##
|
|
161
|
+
## @return True si elle est protégée, false sinon
|
|
162
|
+
##
|
|
163
|
+
def estProtegee?(grille, num, x, y)
|
|
164
|
+
|
|
165
|
+
ligne = ligne(grille, y)
|
|
166
|
+
colonne = colonne(grille, x)
|
|
167
|
+
block = block(grille, aQuelBloc(x,y))
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
ligne.each{ |cBis|
|
|
171
|
+
if num == cBis then
|
|
172
|
+
return true
|
|
173
|
+
end
|
|
174
|
+
}
|
|
175
|
+
colonne.each{ |cBis|
|
|
176
|
+
if num == cBis then
|
|
177
|
+
return true
|
|
178
|
+
end
|
|
179
|
+
}
|
|
180
|
+
block.each{ |col|
|
|
181
|
+
col.each{ |cBis|
|
|
182
|
+
if num == cBis then
|
|
183
|
+
return true
|
|
184
|
+
end
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return false
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
##
|
|
191
|
+
## Recherche le numéro du bloc auquel appartient une case donnée
|
|
192
|
+
##
|
|
193
|
+
## @param x La colonne de la case
|
|
194
|
+
## @param y La ligne de la case
|
|
195
|
+
##
|
|
196
|
+
## @return Le numero du bloc
|
|
197
|
+
##
|
|
198
|
+
def aQuelBloc(x,y)
|
|
199
|
+
return ((x/3)+1)+(y/3*3)
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require_relative './Technique'
|
|
2
|
+
require_relative "./SCandidate.rb"
|
|
3
|
+
require_relative "./SCell.rb"
|
|
4
|
+
require_relative "./DSubset.rb"
|
|
5
|
+
require_relative "./Peche.rb"
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
##
|
|
9
|
+
## Classe pour l'usine à technique
|
|
10
|
+
##
|
|
11
|
+
class TechniqueUsine
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
## Une instance de la classe donnée en paramètre
|
|
15
|
+
##
|
|
16
|
+
## @param tech Le nom de la technique
|
|
17
|
+
##
|
|
18
|
+
## @return L'instance de la classe tech
|
|
19
|
+
##
|
|
20
|
+
def creer(tech)
|
|
21
|
+
return Object.const_get(tech).new()
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
end
|
data/app/utils/XWing.rb
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
require './Technique'
|
|
2
|
+
|
|
3
|
+
# => Author:: yguenver
|
|
4
|
+
# => Version:: 0.1
|
|
5
|
+
# => Copyright:: © 2016
|
|
6
|
+
# => License:: Distributes under the same terms as Ruby
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
##
|
|
10
|
+
## Technique X-wing.
|
|
11
|
+
##
|
|
12
|
+
class XWing < Technique
|
|
13
|
+
|
|
14
|
+
@grilleIndice
|
|
15
|
+
|
|
16
|
+
##
|
|
17
|
+
## Constructeur de la classe SCell
|
|
18
|
+
##
|
|
19
|
+
## @return Une instance de la classe SCell
|
|
20
|
+
##
|
|
21
|
+
def XWing.creer()
|
|
22
|
+
new()
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
##
|
|
26
|
+
## Retourne la grille
|
|
27
|
+
##
|
|
28
|
+
## @param grille The grille
|
|
29
|
+
##
|
|
30
|
+
## @return la grille
|
|
31
|
+
##
|
|
32
|
+
def rotation(grille)
|
|
33
|
+
res = Array.new()
|
|
34
|
+
|
|
35
|
+
0.upto(8) do |n|
|
|
36
|
+
res.push(ligne(grille, n))
|
|
37
|
+
end
|
|
38
|
+
return res
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
##
|
|
42
|
+
## Compte le nombre d'indices
|
|
43
|
+
##
|
|
44
|
+
## @param lincol The lincol
|
|
45
|
+
## @param i
|
|
46
|
+
##
|
|
47
|
+
## @return compteurS
|
|
48
|
+
##
|
|
49
|
+
def cptIndice(lincol, i)
|
|
50
|
+
|
|
51
|
+
cpt = 0
|
|
52
|
+
|
|
53
|
+
lincol.each do |elem|
|
|
54
|
+
if( elem[i.to_s] == true )
|
|
55
|
+
cpt += 1
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
return cpt
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
##
|
|
63
|
+
## Recherche une ligne qui remplit la condition suivante :
|
|
64
|
+
## que seulement 2 cases sur les 9 aient un indice commun que les autres n'ont pas.
|
|
65
|
+
##
|
|
66
|
+
## @return res une liste de 2 lignes qui remplissent les conditions pour le même indice, nil sinon.
|
|
67
|
+
##
|
|
68
|
+
|
|
69
|
+
def findLineForIndice(i)
|
|
70
|
+
|
|
71
|
+
res = Array.new()
|
|
72
|
+
|
|
73
|
+
@grilleIndice.each_with_index do |line, n|
|
|
74
|
+
if (cptIndice(line, i) == 2)
|
|
75
|
+
res.push(n)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
if(res.size() >= 2)
|
|
79
|
+
puts 'res : '+res.to_s+' * * * * * '+i.to_s
|
|
80
|
+
return [res, i]
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
return nil
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
##
|
|
88
|
+
## Cherche les emplacements d'un même indice dans une ligne (numéro de colone)
|
|
89
|
+
##
|
|
90
|
+
## @return index une liste des numéros de colone
|
|
91
|
+
##
|
|
92
|
+
|
|
93
|
+
def indexIndice(ligne, indice)
|
|
94
|
+
index = Array.new()
|
|
95
|
+
|
|
96
|
+
@grilleIndice.each do |line|
|
|
97
|
+
line.each_with_index do |elem, n|
|
|
98
|
+
if(elem[indice.to_s] == true)
|
|
99
|
+
index.push(n)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
return index
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
##
|
|
108
|
+
## Vérifie que les indices aux lignes trouvées forment un rectangle.
|
|
109
|
+
##
|
|
110
|
+
## @param lignea et ligneb des numero de ligne et
|
|
111
|
+
## @param indice Le nombre recherché.
|
|
112
|
+
##
|
|
113
|
+
## @return true si cela donne un carré, nil sinon.
|
|
114
|
+
##
|
|
115
|
+
|
|
116
|
+
def isSquare(lignea, ligneb, indice)
|
|
117
|
+
couplea = indexIndice(lignea, indice)
|
|
118
|
+
coupleb = indexIndice(ligneb, indice)
|
|
119
|
+
|
|
120
|
+
puts "aie aie aie"
|
|
121
|
+
puts "couple a : "+couplea.to_s+" ****"
|
|
122
|
+
puts coupleb
|
|
123
|
+
if (couplea == coupleb)
|
|
124
|
+
return couplea
|
|
125
|
+
end
|
|
126
|
+
return nil
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
##
|
|
132
|
+
## Recherche une solution pour la technique utilisée
|
|
133
|
+
##
|
|
134
|
+
## @param grille La grille
|
|
135
|
+
##
|
|
136
|
+
## @return Les informations pour aider l'utilisateur, ou nul si la méthode ne trouve rien
|
|
137
|
+
##
|
|
138
|
+
|
|
139
|
+
def solution(grille)
|
|
140
|
+
|
|
141
|
+
@grilleIndice = indice(grille)
|
|
142
|
+
|
|
143
|
+
col = Array.new()
|
|
144
|
+
line = Array.new()
|
|
145
|
+
candidat = Array.new()
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
1.upto(9) do |i|
|
|
149
|
+
candidat = findLineForIndice(i)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
if(candidat != nil)
|
|
153
|
+
|
|
154
|
+
puts candidat
|
|
155
|
+
col = isSquare(candidat[0][0], candidat[0][1], candidat[1])
|
|
156
|
+
|
|
157
|
+
if(col != nil)
|
|
158
|
+
puts "col : "+col.to_s
|
|
159
|
+
puts "IT IS SQUARE !!!!"
|
|
160
|
+
return true
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
puts line
|
|
167
|
+
puts '*******'
|
|
168
|
+
puts col
|
|
169
|
+
puts '*******'
|
|
170
|
+
|
|
171
|
+
0.upto(8){ |x|
|
|
172
|
+
#puts @grilleIndice[x].to_s.gsub('nil', ' ')
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
return nil
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
xwing = XWing.creer()
|
|
184
|
+
|
|
185
|
+
grille = [
|
|
186
|
+
['4','3',nil,'2','5','8','7','1',nil],
|
|
187
|
+
[nil,nil,'1','7','6','3','5',nil,'4'],
|
|
188
|
+
[nil,'5',nil,'1','4','9','3',nil,nil],
|
|
189
|
+
|
|
190
|
+
[nil,nil,'4',nil,'3','7','9','6','1'],
|
|
191
|
+
[nil,'7',nil,nil,'1','2','8','4','3'],
|
|
192
|
+
['1',nil,'3',nil,'9','4','2','7','5'],
|
|
193
|
+
|
|
194
|
+
[nil,'1','8','3','7','6','4','5',nil],
|
|
195
|
+
[nil,nil,nil,'4','2','5','1',nil,nil],
|
|
196
|
+
[nil,'4',nil,'9','8','1','6',nil,'7']]
|
|
197
|
+
|
|
198
|
+
xwing.solution(grille)
|
|
199
|
+
|
|
200
|
+
grillerot = xwing.rotation(grille)
|
|
201
|
+
|
|
202
|
+
xwing.solution(grillerot)
|
|
203
|
+
|