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.
Files changed (134) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +39 -0
  4. data/app/Historique/Action.rb +29 -0
  5. data/app/Historique/ChangerCase.rb +44 -0
  6. data/app/Historique/HistoriqueAction.rb +114 -0
  7. data/app/components/CaseDessin.rb +325 -0
  8. data/app/components/GrilleDessin.rb +235 -0
  9. data/app/components/Header.rb +194 -0
  10. data/app/config/app.yml +0 -0
  11. data/app/config/database.yml +2 -0
  12. data/app/controller/ApprentissageControleur.rb +75 -0
  13. data/app/controller/ChargerControleur.rb +41 -0
  14. data/app/controller/JeuLibreControleur.rb +244 -0
  15. data/app/controller/MenuControleur.rb +57 -0
  16. data/app/controller/NiveauControleur.rb +54 -0
  17. data/app/controller/NouvellePartieControleur.rb +34 -0
  18. data/app/controller/PrincipaleControleur.rb +30 -0
  19. data/app/controller/PseudoControleur.rb +95 -0
  20. data/app/controller/ReglagesControleur.rb +86 -0
  21. data/app/controller/ReglesControleur.rb +34 -0
  22. data/app/controller/ScoresControleur.rb +42 -0
  23. data/app/controller/StatistiquesControleur.rb +64 -0
  24. data/app/core/Conf.rb +26 -0
  25. data/app/core/Controller.rb +180 -0
  26. data/app/core/Core.rb +186 -0
  27. data/app/core/Model.rb +159 -0
  28. data/app/core/View.rb +56 -0
  29. data/app/db/main.sqlite3 +0 -0
  30. data/app/model/Configuration.rb +180 -0
  31. data/app/model/Grille.rb +180 -0
  32. data/app/model/Jeu.rb +74 -0
  33. data/app/model/Score.rb +100 -0
  34. data/app/model/Utilisateur.rb +113 -0
  35. data/app/utils/DSubset.rb +98 -0
  36. data/app/utils/Generateur.rb +171 -0
  37. data/app/utils/HPTriple.rb +75 -0
  38. data/app/utils/Peche.rb +46 -0
  39. data/app/utils/SCandidate.rb +86 -0
  40. data/app/utils/SCell.rb +73 -0
  41. data/app/utils/Technique.rb +202 -0
  42. data/app/utils/TechniqueUsine.rb +25 -0
  43. data/app/utils/XWing.rb +203 -0
  44. data/app/view/Fenetre.rb +424 -0
  45. data/app/view/FenetreApprentissage.rb +272 -0
  46. data/app/view/FenetreCharger.rb +31 -0
  47. data/app/view/FenetreJeuLibre.rb +468 -0
  48. data/app/view/FenetreMenu.rb +198 -0
  49. data/app/view/FenetreNiveau.rb +105 -0
  50. data/app/view/FenetreNouvellePartie.rb +92 -0
  51. data/app/view/FenetrePrincipale.rb +45 -0
  52. data/app/view/FenetrePseudo.rb +115 -0
  53. data/app/view/FenetreReglages.rb +209 -0
  54. data/app/view/FenetreRegles.rb +111 -0
  55. data/app/view/FenetreScores.rb +120 -0
  56. data/app/view/FenetreStatistiques.rb +134 -0
  57. data/assets/css/style.css +69 -0
  58. data/assets/img/eraser.png +0 -0
  59. data/assets/img/fond.jpg +0 -0
  60. data/assets/img/iconApp.png +0 -0
  61. data/assets/img/logoS.jpeg +0 -0
  62. data/assets/img/sudokuIntro.jpg +0 -0
  63. data/assets/img/user.png +0 -0
  64. data/bin/dogeku +19 -0
  65. data/doc/Action.html +309 -0
  66. data/doc/ApprentissageControleur.html +568 -0
  67. data/doc/CaseDessin.html +2405 -0
  68. data/doc/ChangerCase.html +405 -0
  69. data/doc/ChargerControleur.html +342 -0
  70. data/doc/Conf.html +378 -0
  71. data/doc/Configuration.html +1115 -0
  72. data/doc/Controller.html +1008 -0
  73. data/doc/Core.html +1191 -0
  74. data/doc/DSubset.html +647 -0
  75. data/doc/Fenetre.html +2631 -0
  76. data/doc/FenetreApprentissage.html +1175 -0
  77. data/doc/FenetreCharger.html +343 -0
  78. data/doc/FenetreJeuLibre.html +1859 -0
  79. data/doc/FenetreMenu.html +900 -0
  80. data/doc/FenetreNiveau.html +626 -0
  81. data/doc/FenetreNouvellePartie.html +602 -0
  82. data/doc/FenetrePrincipale.html +371 -0
  83. data/doc/FenetrePseudo.html +695 -0
  84. data/doc/FenetreReglages.html +946 -0
  85. data/doc/FenetreRegles.html +636 -0
  86. data/doc/FenetreScores.html +650 -0
  87. data/doc/FenetreStatistiques.html +672 -0
  88. data/doc/Generateur.html +1015 -0
  89. data/doc/Grille.html +1348 -0
  90. data/doc/GrilleDessin.html +1281 -0
  91. data/doc/HPTriple.html +593 -0
  92. data/doc/Header.html +1253 -0
  93. data/doc/HistoriqueAction.html +792 -0
  94. data/doc/Jeu.html +923 -0
  95. data/doc/JeuLibreControleur.html +1445 -0
  96. data/doc/MenuControleur.html +522 -0
  97. data/doc/Model.html +996 -0
  98. data/doc/NiveauControleur.html +451 -0
  99. data/doc/NouvellePartieControleur.html +330 -0
  100. data/doc/Peche.html +396 -0
  101. data/doc/PrincipaleControleur.html +320 -0
  102. data/doc/PseudoControleur.html +695 -0
  103. data/doc/ReglagesControleur.html +747 -0
  104. data/doc/ReglesControleur.html +330 -0
  105. data/doc/SCandidate.html +617 -0
  106. data/doc/SCell.html +587 -0
  107. data/doc/Score.html +926 -0
  108. data/doc/ScoresControleur.html +346 -0
  109. data/doc/StatistiquesControleur.html +390 -0
  110. data/doc/Technique.html +543 -0
  111. data/doc/TechniqueUsine.html +252 -0
  112. data/doc/Utilisateur.html +806 -0
  113. data/doc/View.html +844 -0
  114. data/doc/XWing.html +1031 -0
  115. data/doc/_index.html +478 -0
  116. data/doc/class_list.html +51 -0
  117. data/doc/css/common.css +1 -0
  118. data/doc/css/full_list.css +58 -0
  119. data/doc/css/style.css +492 -0
  120. data/doc/file.README.html +141 -0
  121. data/doc/file_list.html +56 -0
  122. data/doc/frames.html +17 -0
  123. data/doc/index.html +141 -0
  124. data/doc/js/app.js +243 -0
  125. data/doc/js/full_list.js +216 -0
  126. data/doc/js/jquery.js +4 -0
  127. data/doc/method_list.html +2523 -0
  128. data/doc/top-level-namespace.html +112 -0
  129. data/test/Generateur/grilleCorrecte.rb +198 -0
  130. data/test/Model/scoreCorrecte.rb +55 -0
  131. data/test/Model/utilisateurCorrecte.rb +68 -0
  132. data/test/test_helper.rb +2 -0
  133. data/test/unitTest.rb +72 -0
  134. metadata +187 -0
@@ -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
@@ -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
+