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,180 @@
1
+ require Core::ROOT + "utils/Generateur.rb"
2
+ # Author:: Nikuto
3
+ # Version:: 0.1
4
+ # Copyright:: © 2017
5
+ # License:: Distributes under the same terms as Ruby
6
+
7
+ ##
8
+ ## Méthodes permettant de manager la grille et de faire des vérifications de la validité d'une valeur
9
+ ## Modèle de la grille
10
+ ##
11
+ class Grille < Model
12
+
13
+ attr_accessor :nbVides, :grille
14
+
15
+ ##
16
+ ## Initialisation
17
+ ##
18
+ def initialize()
19
+ @grille = nil
20
+ end
21
+
22
+
23
+ ##
24
+ ## Génère une grille avec un niveau donné
25
+ ##
26
+ ## @param niveau Le niveau souhaité
27
+ ##
28
+ ## @return La grille génerée
29
+ ##
30
+ def generer(niveau)
31
+ # Niveau + 1 car constante de 0 à 2 passée en paramètre
32
+
33
+ @gen = Generateur.new(niveau + 1)
34
+ @grille = @gen.generer()
35
+
36
+ return @grille
37
+ end
38
+
39
+ ##
40
+ ## Compte le nombre de cases vides
41
+ ##
42
+ ## @return Nombre de cases vides.
43
+ ##
44
+ def countNbVides()
45
+ @nbVides = 0
46
+
47
+ @grille.each do |ligne|
48
+ ligne.each do |c|
49
+ if( c["value"] == nil)
50
+ @nbVides += 1
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ ##
57
+ ## Charge la partie du pseudo donnée
58
+ ##
59
+ ## @param pseudo Le pseudo du joueur qui charge
60
+ ##
61
+ ## @return La grille chargée
62
+ ##
63
+ def charger(pseudo)
64
+ donnees = YAML.load_file(Core::ROOTPROJECT + "assets/save/" + pseudo.to_s + ".yml")
65
+ @grille=donnees["grille"]
66
+ end
67
+
68
+ ##
69
+ ## Sauvegarde la partie du joueur
70
+ ##
71
+ ## @param pseudo Le pseudo du joueur qui sauvegarde
72
+ ##
73
+ ## @return Retourne vrai quand la sauvegarde s'est faite
74
+ ##
75
+ def sauvegarder(pseudo)
76
+ donnees=Hash.new()
77
+ File.open(Core::ROOTPROJECT + "assets/save/" + pseudo.to_s + ".yml", "w") do |fichier|
78
+ donnees["grille"] = @grille
79
+ fichier.write(donnees.to_yaml)
80
+ end
81
+
82
+ return true
83
+ end
84
+
85
+ ##
86
+ ## Récupère la valeur de la case de la grille
87
+ ##
88
+ ## @param x Abscisse de la grille
89
+ ## @param y Ordonnée de la grille
90
+ ##
91
+ ## @return la valeur
92
+ ##
93
+ def getValue(x, y)
94
+ return @grille[x][y]["value"]
95
+ end
96
+
97
+ ## Vérifie à partir de coordonnées que la valeur est unique
98
+ ##
99
+ ## @param valeur Valeur de la case
100
+ ## @param x Abscisse de la case
101
+ ## @param y Ordonnée de la case
102
+ ##
103
+ ## @return true si la cellule est bien unique false sinon
104
+ ##
105
+ def valeurUnique(valeur, x ,y)
106
+ ligneUnique = self.valeurUniqueLigne(valeur, x, y, "ligne")
107
+ colonneUnique =self.valeurUniqueLigne(valeur, x, y, "colonne")
108
+
109
+ if(ligneUnique == false || colonneUnique == false)
110
+ return false
111
+ end
112
+
113
+ # Position x et y de la région
114
+ rX = x
115
+ rY = y
116
+
117
+ ## Récupère les cordonnées de la première case de la région
118
+ while(rX % 3 != 0 || rY % 3 != 0)
119
+ if(rX % 3 != 0)
120
+ rX -= 1
121
+ end
122
+ if(rY % 3 != 0)
123
+ rY -=1
124
+ end
125
+ end
126
+
127
+ ## Parcourt la région et vérifie l'unicité
128
+ for i in 0..2
129
+ for j in 0..2
130
+ ## Case vérifiée exclue
131
+ if(rX + i != x || rY + j != y)
132
+ if(valeur == self.getValue(rX+i, rY+j))
133
+ return false
134
+ end
135
+ end
136
+ end
137
+ end
138
+
139
+ return true
140
+ end
141
+
142
+ ## Vérifie les valeurs d'une ligne en se basant sur des coordonées initiales
143
+ ##
144
+ ## @param valeur Valeur de la case
145
+ ## @param x Ordonnée de la case à vérifier
146
+ ## @param y Abscisse de la case à vérifier
147
+ ## @param type Type de la recherche
148
+ ##
149
+ ## @return True si valeur unique sinon false
150
+ ##
151
+ def valeurUniqueLigne(valeur, x, y, type)
152
+ ## Parcours ligne ou colonne à la recherche de valeur unique
153
+ if(type == "ligne")
154
+
155
+ for i in 0..8
156
+ # On exclue la case vérifiée
157
+ if(i != y)
158
+ if(valeur == @grille[x][i]["value"])
159
+ return false
160
+ end
161
+ end
162
+ end
163
+
164
+ else
165
+
166
+ for i in 0..8
167
+ ## On exclue la case vérifiée
168
+ if(i != x)
169
+ if(valeur == @grille[i][y]["value"])
170
+ return false
171
+ end
172
+ end
173
+ end
174
+
175
+ end
176
+
177
+ return true
178
+ end
179
+
180
+ end
data/app/model/Jeu.rb ADDED
@@ -0,0 +1,74 @@
1
+ ## Author:: Nikuto
2
+ ## Version:: 0.1
3
+ ## Copyright:: © 2017
4
+ ## License:: Distributes under the same terms as Ruby
5
+
6
+
7
+ ##
8
+ ## Modèle du jeu
9
+ ##
10
+ class Jeu < Model
11
+
12
+ attr_accessor :grille, :chrono, :score, :niveau
13
+
14
+ #Définit le niveau Facile à 0
15
+ FACILE=0
16
+ #Définit le niveau Moyen à 1
17
+ MOYEN=1
18
+ #Définit le niveau Difficile à 2
19
+ DIFFICILE=2
20
+
21
+ ##Initialisation
22
+ def initialize
23
+ @grille = nil
24
+ @score = 0
25
+ @score_id = 0
26
+ @chrono = 0
27
+ @niveau = 1
28
+ end
29
+
30
+ ##
31
+ ## Crée une partie appartenant à un pseudo donné au format YAML
32
+ ##
33
+ ## @param pseudo Pseudo de l'utilisateur
34
+ ##
35
+ ## @return self
36
+ ##
37
+ def creerPartie(pseudo)
38
+ donnees=Hash.new()
39
+ File.open(Core::ROOTPROJECT + "assets/save/" + pseudo.to_s + ".yml", "w") do |fichier|
40
+ donnees["grille"] = @grille
41
+ donnees["score"] = @score
42
+ donnees["chrono"] = @chrono
43
+ donnees["niveau"] = @niveau
44
+ fichier.write(donnees.to_yaml)
45
+
46
+ return self
47
+ end
48
+
49
+ return true
50
+ end
51
+
52
+ ##
53
+ ## Charge la partie liée au pseudo de l'utilisateur
54
+ ##
55
+ ## @param pseudo Pseudo de l'utilisateur
56
+ ##
57
+ ## @return Données chargées
58
+ ##
59
+ def chargerPartie(pseudo)
60
+ donnees = YAML.load_file(Core::ROOTPROJECT + "assets/save/" + pseudo.to_s + ".yml")
61
+ return donnees
62
+ end
63
+
64
+ ##
65
+ ## Supprime la partie d'u utilisateur précis
66
+ ##
67
+ ## @param pseudo Pseudo de l'utilisateur
68
+ ##
69
+ ## @return true si supprimé sinon false
70
+ ##
71
+ def supprimerPartie(pseudo)
72
+ return File.delete(Core::ROOTPROJECT + "assets/save/" + pseudo.to_s + ".yml")
73
+ end
74
+ end
@@ -0,0 +1,100 @@
1
+ # Author:: AlexTAB
2
+ # Version:: 0.1
3
+ # Copyright:: © 2017
4
+ # License:: Distributes under the same terms as Ruby
5
+
6
+ ##
7
+ ## Modèle pour le score
8
+ ##
9
+ class Score < Model
10
+
11
+ attr_accessor :difficulte
12
+
13
+ ##
14
+ ## Initialisation
15
+ ##
16
+ def initialize()
17
+
18
+ ## Crée la table Score
19
+ @@db.execute "CREATE TABLE IF NOT EXISTS score (
20
+ score_id integer primary key autoincrement,
21
+ niveau integer NOT NULL,
22
+ score integer NOT NULL,
23
+ utilisateur integer,
24
+ FOREIGN KEY(utilisateur) REFERENCES utilisateur(utilisateur_id)
25
+ );"
26
+ @difficulte = nil
27
+ end
28
+
29
+ ##
30
+ ## Récupère les scores de l'utilisateur
31
+ ##
32
+ ## @param pseudo Pseudo de l'utilisateur
33
+ ##
34
+ ## @return Les scores (tableau de hash)
35
+ ##
36
+ def scoreUtilisateur(pseudo)
37
+ req = @@db.execute2 "SELECT * FROM utilisateur INNER JOIN score ON utilisateur=utilisateur_id WHERE pseudo=?;", pseudo
38
+ return self.to_h(req)
39
+ end
40
+
41
+ ##
42
+ ## Récupère les n meilleures scores
43
+ ##
44
+ ## @param n Nombre de scores à récupérer
45
+ ##
46
+ ## @return Les scores (tableau de hash)
47
+ ##
48
+ def meilleursScores(n)
49
+ req = @@db.execute2 "SELECT * FROM utilisateur INNER JOIN score ON utilisateur=utilisateur_id ORDER BY score DESC LIMIT ?;", n
50
+
51
+ return self.to_h(req)
52
+ end
53
+
54
+ ##
55
+ ## Crée un score dans la table score pour l'utilisateur
56
+ ##
57
+ ## @param pseudo Le pseudo utilisateur
58
+ ## @param niveau Niveau de difficulté de la partie
59
+ ## @param score Score
60
+ ##
61
+ ## @return Self
62
+ ##
63
+ def creer(pseudo, niveau, score)
64
+ ## Récupère id utilisateur
65
+ req = @@db.execute "SELECT utilisateur_id FROM utilisateur WHERE pseudo= ?", pseudo
66
+
67
+ insert(:utilisateur => req[0], :niveau => niveau, :score => score)
68
+
69
+ return self
70
+ end
71
+
72
+ ##
73
+ ## Met à jour le score d'un utilisateur
74
+ ##
75
+ ## @param score_id Id du score
76
+ ## @param score Score
77
+ ##
78
+ def mettreAJour(score_id, score)
79
+ @@db.execute "UPDATE score SET score= ? WHERE score_id = ?", score, score_id
80
+ end
81
+
82
+ ##
83
+ ## Calcule le score du joueur
84
+ ##
85
+ ## @param penalite Nombre de pénalités
86
+ ## @param tempsChrono L'état du chrono
87
+ ##
88
+ ## @return Score de l'utilisateur
89
+ ##
90
+ def calcul(penalite, tempsChrono)
91
+
92
+ tempsResoluMoy = 3*60
93
+
94
+ evolutionScore = (tempsResoluMoy - tempsChrono) + ((tempsResoluMoy/10)*(20 - penalite))
95
+ scoreCourant = (@difficulte)*evolutionScore
96
+
97
+ return scoreCourant
98
+ end
99
+
100
+ end
@@ -0,0 +1,113 @@
1
+ require Core::ROOT + "model/Configuration.rb"
2
+ require Core::ROOT + "model/Score.rb"
3
+ require Core::ROOT + "model/Jeu.rb"
4
+
5
+ ## Author:: Nikuto, DanAurea
6
+ ## Developers: Nikuto, DanAurea
7
+ ## Version:: 0.1
8
+ ## Copyright:: © 2016
9
+ ## License:: Distributes under the same terms as Ruby
10
+ ##
11
+
12
+ ##
13
+ ## Classe d'administration des utilisateurs
14
+ ## Modèle utilisateur
15
+ ##
16
+ class Utilisateur < Model
17
+
18
+ ##
19
+ ## Initialisation
20
+ ##
21
+ def initialize()
22
+
23
+ ## Crée la table utilisateur
24
+ @@db.execute "CREATE TABLE IF NOT EXISTS utilisateur (
25
+ utilisateur_id integer primary key autoincrement,
26
+ pseudo varchar(30) NOT NULL
27
+ );"
28
+
29
+ ## Récupère les instances des tables configuration et score (Singleton pattern)
30
+ @configuration = Configuration.instance()
31
+ @score = Score.instance()
32
+ @jeu = Jeu.instance()
33
+ end
34
+
35
+ ##
36
+ ## Ajoute un utilisateur dans la base de données
37
+ ##
38
+ ## @param pseudo Le pseudo de l'utilisateur
39
+ ##
40
+ ## @return Retourne l'utilisateur créé
41
+ ##
42
+ def creerUtilisateur(pseudo)
43
+ insert(:pseudo => pseudo)
44
+
45
+ @configuration.creerConfiguration(pseudo)
46
+
47
+ ## Crée un score par défaut si mode débug
48
+ ## Cela permet de pouvoir tester la création de score
49
+ ## au chargement des utilisateurs.
50
+ if Core::DEBUG
51
+ @score.creer(pseudo, Jeu::FACILE, 600)
52
+ end
53
+
54
+ return self
55
+ end
56
+
57
+ ##
58
+ ## Supprime un utilisateur de la base de données
59
+ ##
60
+ ## @param pseudo Le pseudo de l'utilisateur à supprimer
61
+ ##
62
+ ## @return Retourne vrai si la suppression a eu lieu
63
+ ##
64
+ def supprimerUtilisateur(pseudo)
65
+ @@db.execute "DELETE FROM utilisateur WHERE pseudo = ?;", pseudo
66
+ end
67
+
68
+ ##
69
+ ## Supprime tout les scores de l'utilisateur
70
+ ##
71
+ ## @param pseudo Pseudo de l'utilisateur
72
+ ##
73
+ ##
74
+ def reinitialiserUtilisateur(pseudo)
75
+ ## Récupère id utilisateur
76
+ req = @@db.execute "SELECT utilisateur_id FROM utilisateur WHERE pseudo= ?", pseudo
77
+
78
+ utilisateur_id = req[0][0][0]
79
+
80
+ if(req.length > 0)
81
+ @@db.execute "DELETE FROM score WHERE utilisateur= ?", utilisateur_id
82
+ @@db.execute "DELETE FROM configuration WHERE utilisateur = ?", utilisateur_id
83
+ @configuration.creerConfiguration(pseudo)
84
+ end
85
+
86
+ if(self.partieUtilisateur?(pseudo))
87
+ @jeu.supprimerPartie(pseudo)
88
+ end
89
+ end
90
+
91
+ ##
92
+ ## Recherche un utilisateur dans la base de données
93
+ ##
94
+ ## @param pseudo Le pseudo de l'utilisateur à trouver
95
+ ##
96
+ ## @return Retourne 0 si pas trouvé sinon 1
97
+ ##
98
+ def rechercherUtilisateur(pseudo)
99
+ resultat = @@db.execute "SELECT pseudo FROM utilisateur WHERE pseudo = ? LIMIT 1;", pseudo
100
+ return resultat.length >= 1 ? true : false;
101
+ end
102
+
103
+ ##
104
+ ## Vérifie si un utilisateur a une partie en cours
105
+ ##
106
+ ## @param pseudo Le pseudo de l'utilisateur à vérifier
107
+ ##
108
+ ## @return Retourne true si une partie est en cours
109
+ ##
110
+ def partieUtilisateur?(pseudo)
111
+ return File.exist?(Core::ROOTPROJECT + "assets/save/" + pseudo + ".yml")
112
+ end
113
+ end