Hashiparmentier 0.4.0

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 (259) hide show
  1. checksums.yaml +7 -0
  2. data/bin/Hashiparmentier +3 -0
  3. data/launcher.command +3 -0
  4. data/lib/Hashiparmentier.rb +8 -0
  5. data/lib/Hashiparmentier/BDD/BDDDPQADSAHASHIPARMENTIER.db +0 -0
  6. data/lib/Hashiparmentier/BDD/Base.sqlite +0 -0
  7. data/lib/Hashiparmentier/Base.sqlite +0 -0
  8. data/lib/Hashiparmentier/CSS/Style.rb +184 -0
  9. data/lib/Hashiparmentier/Core/Action.rb +48 -0
  10. data/lib/Hashiparmentier/Core/Aide.rb +28 -0
  11. data/lib/Hashiparmentier/Core/Case.rb +92 -0
  12. data/lib/Hashiparmentier/Core/Chrono.rb +96 -0
  13. data/lib/Hashiparmentier/Core/Compte.rb +137 -0
  14. data/lib/Hashiparmentier/Core/ConnectSqlite3.rb +19 -0
  15. data/lib/Hashiparmentier/Core/Couleur.rb +94 -0
  16. data/lib/Hashiparmentier/Core/DonnerTechnique.rb +70 -0
  17. data/lib/Hashiparmentier/Core/Grille.rb +804 -0
  18. data/lib/Hashiparmentier/Core/Hypothese.rb +43 -0
  19. data/lib/Hashiparmentier/Core/Ile.rb +330 -0
  20. data/lib/Hashiparmentier/Core/Jeu.rb +177 -0
  21. data/lib/Hashiparmentier/Core/Pile.rb +85 -0
  22. data/lib/Hashiparmentier/Core/Pont.rb +300 -0
  23. data/lib/Hashiparmentier/Core/Sauvegarde.rb +176 -0
  24. data/lib/Hashiparmentier/Core/UndoRedo.rb +93 -0
  25. data/lib/Hashiparmentier/Core/VerifierGrille.rb +51 -0
  26. data/lib/Hashiparmentier/Data/Golden Bridge.jpg +0 -0
  27. data/lib/Hashiparmentier/Data/Pont Gaulois.jpg +0 -0
  28. data/lib/Hashiparmentier/Data/Zubi Zuri.jpg +0 -0
  29. data/lib/Hashiparmentier/NouvellesGrilles/map-1010-0-001.txt +12 -0
  30. data/lib/Hashiparmentier/NouvellesGrilles/map-1010-0-002.txt +12 -0
  31. data/lib/Hashiparmentier/NouvellesGrilles/map-1010-0-003.txt +12 -0
  32. data/lib/Hashiparmentier/NouvellesGrilles/map-1010-1-001.txt +12 -0
  33. data/lib/Hashiparmentier/NouvellesGrilles/map-1010-1-002.txt +12 -0
  34. data/lib/Hashiparmentier/NouvellesGrilles/map-1010-1-003.txt +12 -0
  35. data/lib/Hashiparmentier/NouvellesGrilles/map-1010-2-001.txt +12 -0
  36. data/lib/Hashiparmentier/NouvellesGrilles/map-1010-2-002.txt +12 -0
  37. data/lib/Hashiparmentier/NouvellesGrilles/map-1010-2-003.txt +12 -0
  38. data/lib/Hashiparmentier/NouvellesGrilles/map-1515-0-001.txt +17 -0
  39. data/lib/Hashiparmentier/NouvellesGrilles/map-1515-0-002.txt +17 -0
  40. data/lib/Hashiparmentier/NouvellesGrilles/map-1515-0-003.txt +17 -0
  41. data/lib/Hashiparmentier/NouvellesGrilles/map-1515-1-001.txt +17 -0
  42. data/lib/Hashiparmentier/NouvellesGrilles/map-1515-1-002.txt +17 -0
  43. data/lib/Hashiparmentier/NouvellesGrilles/map-1515-1-003.txt +17 -0
  44. data/lib/Hashiparmentier/NouvellesGrilles/map-1515-2-001.txt +17 -0
  45. data/lib/Hashiparmentier/NouvellesGrilles/map-1515-2-002.txt +17 -0
  46. data/lib/Hashiparmentier/NouvellesGrilles/map-1515-2-003.txt +17 -0
  47. data/lib/Hashiparmentier/NouvellesGrilles/map-77-0-001.txt +9 -0
  48. data/lib/Hashiparmentier/NouvellesGrilles/map-77-0-002.txt +9 -0
  49. data/lib/Hashiparmentier/NouvellesGrilles/map-77-0-003.txt +9 -0
  50. data/lib/Hashiparmentier/NouvellesGrilles/map-77-1-001.txt +9 -0
  51. data/lib/Hashiparmentier/NouvellesGrilles/map-77-1-002.txt +9 -0
  52. data/lib/Hashiparmentier/NouvellesGrilles/map-77-1-003.txt +9 -0
  53. data/lib/Hashiparmentier/NouvellesGrilles/map-77-2-001.txt +9 -0
  54. data/lib/Hashiparmentier/NouvellesGrilles/map-77-2-002.txt +9 -0
  55. data/lib/Hashiparmentier/NouvellesGrilles/map-77-2-003.txt +9 -0
  56. data/lib/Hashiparmentier/Test/Gemfile +3 -0
  57. data/lib/Hashiparmentier/Test/MajBDDGrille.rb +10 -0
  58. data/lib/Hashiparmentier/Test/NotAMalwareDefinitiveEdition +3 -0
  59. data/lib/Hashiparmentier/Test/NotAMalwareDefinitiveEdition~ +2 -0
  60. data/lib/Hashiparmentier/Test/NotAMalware~ +2 -0
  61. data/lib/Hashiparmentier/Test/TestChargerGrille.rb +7 -0
  62. data/lib/Hashiparmentier/Test/TestCompte.rb +51 -0
  63. data/lib/Hashiparmentier/Test/TestFenetre.rb +10 -0
  64. data/lib/Hashiparmentier/Test/TestGrille.rb +27 -0
  65. data/lib/Hashiparmentier/Test/TestJeu.rb +47 -0
  66. data/lib/Hashiparmentier/Test/TestPont.rb +73 -0
  67. data/lib/Hashiparmentier/Test/TestSauvegarde.rb +53 -0
  68. data/lib/Hashiparmentier/Test/execLinux.sh +8 -0
  69. data/lib/Hashiparmentier/Test/icone/Custom-Icon-Design-2014-World-Cup-Flags-Japan.ico +0 -0
  70. data/lib/Hashiparmentier/Test/test.bat +1 -0
  71. data/lib/Hashiparmentier/Test/testExec +2 -0
  72. data/lib/Hashiparmentier/Test/testTestExec.rb +3 -0
  73. data/lib/Hashiparmentier/UI/AideJeuUI.rb +22 -0
  74. data/lib/Hashiparmentier/UI/AideUI.rb +22 -0
  75. data/lib/Hashiparmentier/UI/AstucesUI.rb +23 -0
  76. data/lib/Hashiparmentier/UI/CaseUI.rb +70 -0
  77. data/lib/Hashiparmentier/UI/ChoixDifficulteUI.rb +45 -0
  78. data/lib/Hashiparmentier/UI/ChoixGrilleScrollUI.rb +37 -0
  79. data/lib/Hashiparmentier/UI/ChoixGrilleUI.rb +80 -0
  80. data/lib/Hashiparmentier/UI/ChoixNomUI.rb +39 -0
  81. data/lib/Hashiparmentier/UI/ChoixTailleUI.rb +44 -0
  82. data/lib/Hashiparmentier/UI/Fenetre.rb +32 -0
  83. data/lib/Hashiparmentier/UI/FenetreFinUI.rb +71 -0
  84. data/lib/Hashiparmentier/UI/FenetreJeuUI.rb +193 -0
  85. data/lib/Hashiparmentier/UI/FenetreReglesUI.rb +28 -0
  86. data/lib/Hashiparmentier/UI/FinUI.rb +91 -0
  87. data/lib/Hashiparmentier/UI/GrilleJouableUI.rb +47 -0
  88. data/lib/Hashiparmentier/UI/GrilleUI.rb +140 -0
  89. data/lib/Hashiparmentier/UI/IleUI.rb +87 -0
  90. data/lib/Hashiparmentier/UI/JeuUI.rb +161 -0
  91. data/lib/Hashiparmentier/UI/Menu.rb +322 -0
  92. data/lib/Hashiparmentier/UI/MenuUI.rb +107 -0
  93. data/lib/Hashiparmentier/UI/PontUI.rb +135 -0
  94. data/lib/Hashiparmentier/UI/RacineUI.rb +142 -0
  95. data/lib/Hashiparmentier/UI/ReglesUI.rb +22 -0
  96. data/lib/Hashiparmentier/doc/Action.html +259 -0
  97. data/lib/Hashiparmentier/doc/Aide.html +229 -0
  98. data/lib/Hashiparmentier/doc/AideUI.html +168 -0
  99. data/lib/Hashiparmentier/doc/Case.html +473 -0
  100. data/lib/Hashiparmentier/doc/CaseUI.html +343 -0
  101. data/lib/Hashiparmentier/doc/ChoixDifficulteUI.html +209 -0
  102. data/lib/Hashiparmentier/doc/ChoixGrilleScrollUI.html +239 -0
  103. data/lib/Hashiparmentier/doc/ChoixGrilleUI.html +276 -0
  104. data/lib/Hashiparmentier/doc/ChoixNomUI.html +215 -0
  105. data/lib/Hashiparmentier/doc/ChoixTailleUI.html +210 -0
  106. data/lib/Hashiparmentier/doc/Chrono.html +420 -0
  107. data/lib/Hashiparmentier/doc/Compte.html +514 -0
  108. data/lib/Hashiparmentier/doc/Couleur.html +422 -0
  109. data/lib/Hashiparmentier/doc/DonnerTechnique.html +245 -0
  110. data/lib/Hashiparmentier/doc/Fenetre.html +179 -0
  111. data/lib/Hashiparmentier/doc/FenetreJeuUI.html +274 -0
  112. data/lib/Hashiparmentier/doc/FenetreReglesUI.html +167 -0
  113. data/lib/Hashiparmentier/doc/FinUI.html +274 -0
  114. data/lib/Hashiparmentier/doc/Grille.html +2153 -0
  115. data/lib/Hashiparmentier/doc/GrilleJouableUI.html +229 -0
  116. data/lib/Hashiparmentier/doc/GrilleUI.html +477 -0
  117. data/lib/Hashiparmentier/doc/Hypothese.html +248 -0
  118. data/lib/Hashiparmentier/doc/Ile.html +1103 -0
  119. data/lib/Hashiparmentier/doc/IleUI.html +244 -0
  120. data/lib/Hashiparmentier/doc/Jeu.html +179 -0
  121. data/lib/Hashiparmentier/doc/JeuUI.html +471 -0
  122. data/lib/Hashiparmentier/doc/Menu.html +667 -0
  123. data/lib/Hashiparmentier/doc/MenuUI.html +416 -0
  124. data/lib/Hashiparmentier/doc/Pile.html +383 -0
  125. data/lib/Hashiparmentier/doc/Pont.html +943 -0
  126. data/lib/Hashiparmentier/doc/PontUI.html +307 -0
  127. data/lib/Hashiparmentier/doc/RacineUI.html +387 -0
  128. data/lib/Hashiparmentier/doc/ReglesUI.html +203 -0
  129. data/lib/Hashiparmentier/doc/Sauvegarde.html +672 -0
  130. data/lib/Hashiparmentier/doc/UndoRedo.html +389 -0
  131. data/lib/Hashiparmentier/doc/VerifierGrille.html +225 -0
  132. data/lib/Hashiparmentier/doc/created.rid +46 -0
  133. data/lib/Hashiparmentier/doc/css/fonts.css +167 -0
  134. data/lib/Hashiparmentier/doc/css/rdoc.css +590 -0
  135. data/lib/Hashiparmentier/doc/fonts/Lato-Light.ttf +0 -0
  136. data/lib/Hashiparmentier/doc/fonts/Lato-LightItalic.ttf +0 -0
  137. data/lib/Hashiparmentier/doc/fonts/Lato-Regular.ttf +0 -0
  138. data/lib/Hashiparmentier/doc/fonts/Lato-RegularItalic.ttf +0 -0
  139. data/lib/Hashiparmentier/doc/fonts/SourceCodePro-Bold.ttf +0 -0
  140. data/lib/Hashiparmentier/doc/fonts/SourceCodePro-Regular.ttf +0 -0
  141. data/lib/Hashiparmentier/doc/images/add.png +0 -0
  142. data/lib/Hashiparmentier/doc/images/arrow_up.png +0 -0
  143. data/lib/Hashiparmentier/doc/images/brick.png +0 -0
  144. data/lib/Hashiparmentier/doc/images/brick_link.png +0 -0
  145. data/lib/Hashiparmentier/doc/images/bug.png +0 -0
  146. data/lib/Hashiparmentier/doc/images/bullet_black.png +0 -0
  147. data/lib/Hashiparmentier/doc/images/bullet_toggle_minus.png +0 -0
  148. data/lib/Hashiparmentier/doc/images/bullet_toggle_plus.png +0 -0
  149. data/lib/Hashiparmentier/doc/images/date.png +0 -0
  150. data/lib/Hashiparmentier/doc/images/delete.png +0 -0
  151. data/lib/Hashiparmentier/doc/images/find.png +0 -0
  152. data/lib/Hashiparmentier/doc/images/loadingAnimation.gif +0 -0
  153. data/lib/Hashiparmentier/doc/images/macFFBgHack.png +0 -0
  154. data/lib/Hashiparmentier/doc/images/package.png +0 -0
  155. data/lib/Hashiparmentier/doc/images/page_green.png +0 -0
  156. data/lib/Hashiparmentier/doc/images/page_white_text.png +0 -0
  157. data/lib/Hashiparmentier/doc/images/page_white_width.png +0 -0
  158. data/lib/Hashiparmentier/doc/images/plugin.png +0 -0
  159. data/lib/Hashiparmentier/doc/images/ruby.png +0 -0
  160. data/lib/Hashiparmentier/doc/images/tag_blue.png +0 -0
  161. data/lib/Hashiparmentier/doc/images/tag_green.png +0 -0
  162. data/lib/Hashiparmentier/doc/images/transparent.png +0 -0
  163. data/lib/Hashiparmentier/doc/images/wrench.png +0 -0
  164. data/lib/Hashiparmentier/doc/images/wrench_orange.png +0 -0
  165. data/lib/Hashiparmentier/doc/images/zoom.png +0 -0
  166. data/lib/Hashiparmentier/doc/index.html +154 -0
  167. data/lib/Hashiparmentier/doc/js/darkfish.js +161 -0
  168. data/lib/Hashiparmentier/doc/js/jquery.js +4 -0
  169. data/lib/Hashiparmentier/doc/js/navigation.js +141 -0
  170. data/lib/Hashiparmentier/doc/js/navigation.js.gz +0 -0
  171. data/lib/Hashiparmentier/doc/js/search.js +109 -0
  172. data/lib/Hashiparmentier/doc/js/search_index.js +1 -0
  173. data/lib/Hashiparmentier/doc/js/search_index.js.gz +0 -0
  174. data/lib/Hashiparmentier/doc/js/searcher.js +229 -0
  175. data/lib/Hashiparmentier/doc/js/searcher.js.gz +0 -0
  176. data/lib/Hashiparmentier/doc/table_of_contents.html +1197 -0
  177. data/lib/Hashiparmentier/glade/Fin.glade +222 -0
  178. data/lib/Hashiparmentier/glade/aide.glade +127 -0
  179. data/lib/Hashiparmentier/glade/aideJeu.glade +143 -0
  180. data/lib/Hashiparmentier/glade/astuces.glade +1558 -0
  181. data/lib/Hashiparmentier/glade/fonts/VINERITC.TTF +0 -0
  182. data/lib/Hashiparmentier/glade/images/18790.ico +0 -0
  183. data/lib/Hashiparmentier/glade/images/1stars.png +0 -0
  184. data/lib/Hashiparmentier/glade/images/2stars.png +0 -0
  185. data/lib/Hashiparmentier/glade/images/3stars.png +0 -0
  186. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-07 11-48-54.png +0 -0
  187. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-13 17-54-16.png +0 -0
  188. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-13 18-00-00.png +0 -0
  189. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-13 18-01-25.png +0 -0
  190. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-13 18-17-16.png +0 -0
  191. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-13 18-17-40.png +0 -0
  192. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-13 18-18-01.png +0 -0
  193. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-13 18-18-23.png +0 -0
  194. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-13 18-19-00.png +0 -0
  195. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-13 18-19-17.png +0 -0
  196. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-13 18-19-54.png +0 -0
  197. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 14-24-24.png +0 -0
  198. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 14-24-44.png +0 -0
  199. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 14-24-58.png +0 -0
  200. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 14-25-16.png +0 -0
  201. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 14-25-36.png +0 -0
  202. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 14-25-51.png +0 -0
  203. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 14-26-04.png +0 -0
  204. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 14-26-15.png +0 -0
  205. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 15-01-40.png +0 -0
  206. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 15-02-08.png +0 -0
  207. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 15-02-33.png +0 -0
  208. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 15-02-54.png +0 -0
  209. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 15-03-13.png +0 -0
  210. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 15-03-39.png +0 -0
  211. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 15-03-55.png +0 -0
  212. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 15-04-10.png +0 -0
  213. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 15-33-07.png +0 -0
  214. data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 15-36-05.png +0 -0
  215. data/lib/Hashiparmentier/glade/images/LOGO.png +0 -0
  216. data/lib/Hashiparmentier/glade/images/LOGpR.png +0 -0
  217. data/lib/Hashiparmentier/glade/images/LOGpR2.png +0 -0
  218. data/lib/Hashiparmentier/glade/images/bg.jpg +0 -0
  219. data/lib/Hashiparmentier/glade/images/ex111.png +0 -0
  220. data/lib/Hashiparmentier/glade/images/ex112.png +0 -0
  221. data/lib/Hashiparmentier/glade/images/ex211.png +0 -0
  222. data/lib/Hashiparmentier/glade/images/ex212.png +0 -0
  223. data/lib/Hashiparmentier/glade/images/ex221.png +0 -0
  224. data/lib/Hashiparmentier/glade/images/ex222.png +0 -0
  225. data/lib/Hashiparmentier/glade/images/ex231.png +0 -0
  226. data/lib/Hashiparmentier/glade/images/ex232.png +0 -0
  227. data/lib/Hashiparmentier/glade/images/ex241.png +0 -0
  228. data/lib/Hashiparmentier/glade/images/ex242.png +0 -0
  229. data/lib/Hashiparmentier/glade/images/ex251.png +0 -0
  230. data/lib/Hashiparmentier/glade/images/ex252.png +0 -0
  231. data/lib/Hashiparmentier/glade/images/ex311.png +0 -0
  232. data/lib/Hashiparmentier/glade/images/ex312.png +0 -0
  233. data/lib/Hashiparmentier/glade/images/ex321.png +0 -0
  234. data/lib/Hashiparmentier/glade/images/ex322.png +0 -0
  235. data/lib/Hashiparmentier/glade/images/ex331.png +0 -0
  236. data/lib/Hashiparmentier/glade/images/ex332.png +0 -0
  237. data/lib/Hashiparmentier/glade/images/ex341.png +0 -0
  238. data/lib/Hashiparmentier/glade/images/ex342.png +0 -0
  239. data/lib/Hashiparmentier/glade/images/ex411.png +0 -0
  240. data/lib/Hashiparmentier/glade/images/ex412.png +0 -0
  241. data/lib/Hashiparmentier/glade/images/ex413.png +0 -0
  242. data/lib/Hashiparmentier/glade/images/ex421.png +0 -0
  243. data/lib/Hashiparmentier/glade/images/ex422.png +0 -0
  244. data/lib/Hashiparmentier/glade/images/ex423.png +0 -0
  245. data/lib/Hashiparmentier/glade/images/ex431.png +0 -0
  246. data/lib/Hashiparmentier/glade/images/ex432.png +0 -0
  247. data/lib/Hashiparmentier/glade/images/ex433.png +0 -0
  248. data/lib/Hashiparmentier/glade/images/ex441.png +0 -0
  249. data/lib/Hashiparmentier/glade/images/ex442.png +0 -0
  250. data/lib/Hashiparmentier/glade/images/ex443.png +0 -0
  251. data/lib/Hashiparmentier/glade/images/icone.png +0 -0
  252. data/lib/Hashiparmentier/glade/images/puzzle-solvation.gif +0 -0
  253. data/lib/Hashiparmentier/glade/images/wJapStylePlusNet.jpg +0 -0
  254. data/lib/Hashiparmentier/glade/images/wJapStylePlusNet15.jpg +0 -0
  255. data/lib/Hashiparmentier/glade/jeu.glade +539 -0
  256. data/lib/Hashiparmentier/glade/menu.glade +511 -0
  257. data/lib/Hashiparmentier/glade/regles.glade +856 -0
  258. data/lib/Hashiparmentier/map.txt +316 -0
  259. metadata +347 -0
@@ -0,0 +1,137 @@
1
+
2
+
3
+ require_relative "../Core/Sauvegarde.rb"
4
+ require_relative "../Core/ConnectSqlite3.rb"
5
+ require "active_record"
6
+
7
+ ##
8
+ # Auteur:: Brabant Mano
9
+ # Version:: 0.1
10
+ # Date:: 09/04/2020
11
+ #
12
+ #Cette classe représente les comptes utilisateurs
13
+ class Compte < ActiveRecord::Base
14
+
15
+ #Le compte par defaut
16
+ COMPTE_DEFAULT = "_DEFAULT"
17
+
18
+ has_many :sauvegardes
19
+
20
+ validates :name, presence: true, uniqueness: true
21
+
22
+ #@pseudo => Contient le nom du compte
23
+ attr_reader :pseudo
24
+
25
+ private_class_method :new
26
+
27
+ ##
28
+ #Cette méthode permet de supprimer tous les comptes de la base de donnée
29
+ def Compte.razAllCompte()
30
+ Compte.delete_all()
31
+ end
32
+
33
+
34
+ ##
35
+ #Cette méthode de créer le compte par defaut dont-les sauvegardes vont-être utilisées par les nouveaux comptes
36
+ def Compte.maj()
37
+
38
+ Sauvegarde.razAllSauvegarde()
39
+ Compte.razAllCompte()
40
+ default = new(COMPTE_DEFAULT)
41
+ grilles = Grille.chargerGrilles("../NouvellesGrilles")
42
+ Sauvegarde.creerAll(default, grilles)
43
+
44
+ end
45
+
46
+ ##
47
+ #Ce constructeur permet de créer un nouveau compte
48
+ #param::
49
+ # * pseudo Le pseudo du compte (Il doit être different de COMPTE_DEFAULT)
50
+ def Compte.creer(pseudo)
51
+
52
+ if(pseudo == COMPTE_DEFAULT)
53
+ raise(pseudo + " : Ce nom n'est pas disponible")
54
+ end
55
+ puts "Création du compte #{pseudo}"
56
+ new(pseudo)
57
+
58
+ end
59
+
60
+ #:nodoc:
61
+ def initialize(pseudo)
62
+
63
+ super(:name => pseudo)
64
+ @pseudo = pseudo
65
+ self.sauvegarder()
66
+ if(pseudo != COMPTE_DEFAULT)
67
+ initialiseSauvegarde()
68
+ end
69
+
70
+ end
71
+ #:doc:
72
+
73
+ ##
74
+ #Cette méthode permet de récuperer toutes les grilles du compte par default dans la base
75
+ def initialiseSauvegarde()
76
+
77
+ sauvegardes = Sauvegarde.listeCompte(Compte.recuperer(COMPTE_DEFAULT))
78
+ sauvegardes.each do |s|
79
+ Sauvegarde.creer(self, s.getGrille()).sauvegarder()
80
+ end
81
+
82
+ end
83
+
84
+ ##
85
+ #Cette méthode permet de récuperer un compte dans la base de données
86
+ #param::
87
+ # * pseudo Le pseudo du compte
88
+ #return::
89
+ # * Le compte s'il existe
90
+ # * raiseException Si le compte n'existe pas
91
+ def Compte.recuperer(pseudo)
92
+
93
+ compte = Compte.find_by(name: pseudo);
94
+ if(compte == nil)
95
+ raise("Le compte " + pseudo + " n'existe pas")
96
+ else
97
+ return compte
98
+ end
99
+
100
+ end
101
+
102
+ ##
103
+ #Cette méthode permet de récuperer un compte dans la base de données ou de lcréer s'il n'existe pas
104
+ #param::
105
+ # * pseudo Le pseudo du compte
106
+ #return::
107
+ # * Le compte récupéré ou crée
108
+ def Compte.recuperer_ou_creer(pseudo)
109
+
110
+ compte = Compte.find_by(name: pseudo);
111
+ if(compte == nil)
112
+ Compte.creer(pseudo)
113
+ else
114
+ return compte
115
+ end
116
+
117
+ end
118
+
119
+ ##
120
+ #Cette méthode permet de sauvegarder le compte
121
+ #return::
122
+ # * true Si la sauvegarde a bien été réalisée
123
+ # * false sinon
124
+ def sauvegarder()
125
+
126
+ self.name = @pseudo
127
+ return self.save();
128
+
129
+ end
130
+
131
+ ##
132
+ #Cette méthode permet d'afficher un compte
133
+ def to_s
134
+ return "<Compte> '#{@pseudo}'"
135
+ end
136
+
137
+ end
@@ -0,0 +1,19 @@
1
+
2
+
3
+
4
+
5
+ require "active_record"
6
+
7
+ ##
8
+ # Auteur:: Brabant Mano
9
+ # Version:: 0.1
10
+ # Date:: 09/04/2020
11
+ #
12
+ #Fichier à importer si on veux se connecter à la base de donnée
13
+ ActiveRecord::Base.establish_connection(
14
+
15
+ :adapter => "sqlite3",
16
+ :database => "lib/Hashiparmentier/BDD/BDDDPQADSAHASHIPARMENTIER.db",
17
+ :timeout => 5000
18
+
19
+ )
@@ -0,0 +1,94 @@
1
+
2
+
3
+ ##
4
+ # Auteur:: Brabant Mano
5
+ # Version:: 0.1
6
+ # Date:: 09/04/2020
7
+ #
8
+ #Cette classe représente des couleurs
9
+ class Couleur
10
+
11
+ #@couleur => La couleur représentée, tableau contenant trois valeurs [rouge, vert, bleu], avec rouge, vert et bleu des flottants compris entre 0 et 1
12
+ attr_reader :couleur
13
+
14
+ include Comparable
15
+
16
+ ##
17
+ #Ce constructeur permet de créer une nouvelle couleur
18
+ #param::
19
+ # * couleur La tableau qui représente la couleur
20
+ def initialize(couleur)
21
+ modifCouleur(couleur)
22
+ end
23
+
24
+
25
+ private def modifCouleur(couleur)
26
+ @couleur = couleur
27
+ return self
28
+ end
29
+
30
+ ##
31
+ #Cette méthode permet de connaitre la composante rouge de la couleur
32
+ #return::
33
+ # * La composante rouge de la couleur
34
+ def rouge
35
+ return @couleur[0]
36
+ end
37
+
38
+ ##
39
+ #Cette méthode permet de connaitre la composante verte de la couleur
40
+ #return::
41
+ # * La composante verte de la couleur
42
+ def vert
43
+ return @couleur[1]
44
+ end
45
+
46
+ ##
47
+ #Cette méthode permet de connaitre la composante bleu de la couleur
48
+ #return::
49
+ # * La composante bleu de la couleur
50
+ def bleu
51
+ return @couleur[2]
52
+ end
53
+
54
+ ##
55
+ #Cette méthode permet de comparer la couleur avec une autre
56
+ #param::
57
+ # * autre L'autre couleur
58
+ #return::
59
+ # * 0 Si les deux couleurs sont égales
60
+ # un nombre positif si la couleur est supérieur à l'autre
61
+ # un nombre négatif si la couleur est inférieur à l'autre
62
+ def <=>(autre)
63
+ return @couleur <=> autre.couleur
64
+ end
65
+
66
+ def to_s()
67
+ @couleur.to_s()
68
+ end
69
+
70
+ #La couleur blanc
71
+ BLANC = Couleur.new([1, 1, 1])
72
+
73
+ #La couleur noir
74
+ NOIR = Couleur.new([0, 0, 0])
75
+
76
+ #La couleur jaune
77
+ JAUNE = Couleur.new([1, 1, 0])
78
+
79
+ #La couleur cyan
80
+ CYAN = Couleur.new([0, 1, 1])
81
+
82
+ #La couleur magenta
83
+ MAGENTA = Couleur.new([1, 0, 1])
84
+
85
+ #La couleur bleu
86
+ BLEU = Couleur.new([0, 0, 1])
87
+
88
+ #La couleur vert
89
+ VERT = Couleur.new([0, 1, 0])
90
+
91
+ #La couleur rouge
92
+ ROUGE = Couleur.new([1, 0, 0])
93
+
94
+ end
@@ -0,0 +1,70 @@
1
+
2
+
3
+ require_relative "../Core/Aide.rb"
4
+
5
+ ##
6
+ # Auteur:: Brabant Mano
7
+ # Version:: 0.1
8
+ # Date:: 09/04/2020
9
+ #
10
+ #Cette classe permet de donner de l'aide pour résoudre une grille
11
+ #
12
+ #Hérite de Aide
13
+ class DonnerTechnique < Aide
14
+
15
+ ##
16
+ #Ce constructeur permet de créer une nouvelle aide
17
+ #param::
18
+ # * grille La grille sur laquelle on va donner des aides
19
+ def DonnerTechnique.creer(grille)
20
+ new(grille)
21
+ end
22
+
23
+ #:nodoc:
24
+ def initialize(grille)
25
+ super(grille)
26
+ end
27
+ #:doc:
28
+
29
+ ##
30
+ #L'aide apporté ici est une phrase qui indique des informations sur une ile qui peut poser de façon évidente des ponts
31
+ #
32
+ #Par exemple une ile qui ne possède qu'un seul voisin
33
+ def aider()
34
+ archipelle = false
35
+ cheminComplet = false
36
+ cheminIncomplet = false
37
+ for i in (0..@grille.tailleX - 1)
38
+ for j in (0..@grille.tailleY - 1)
39
+ cGrille = @grille.getCase(i, j)
40
+ if(cGrille.estIle?())
41
+ capa = cGrille.getCapaciteResiduelle()
42
+ nChemins = cGrille.getNombreCheminDisponible()
43
+ nDirection = cGrille.getNombreDirectionConstructible()
44
+ if(capa > 0)
45
+ if(capa == nChemins) #Alors le placement est évident
46
+ cheminComplet = true
47
+ messageComplet = "Une ile doit encore placer " + capa.to_s() + " ponts et possède " + nChemins.to_s() + " ponts disponibles"
48
+ elsif(capa == nChemins - 1 && nDirection <= capa) #On peut placer un pont simple dans (capa - nDirection + 1) directions
49
+ cheminIncomplet = true
50
+ messageIncomplet = "Une ile doit encore placer " + capa.to_s() + " ponts et possède " + nChemins.to_s() + " ponts disponibles dans " + nDirection.to_s() + " directions possible"
51
+ elsif(capa == 1)
52
+ archipelle = true
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ if(cheminComplet)
59
+ message = messageComplet
60
+ elsif(cheminIncomplet)
61
+ message = messageIncomplet
62
+ elsif(archipelle)
63
+ message = "Attention à ne pas former d'archipelle"
64
+ else
65
+ message ="Pas d'aide disponible"
66
+ end
67
+ return message + "\nAttention s'il y a une erreur dans la grille la technique peut-être erronée"
68
+ end
69
+
70
+ end
@@ -0,0 +1,804 @@
1
+ require_relative "../Core/Case.rb"
2
+ require_relative "../Core/Ile.rb"
3
+ require_relative "../Core/Pont.rb"
4
+ require_relative "../Core/Pile.rb"
5
+ require_relative "../Core/UndoRedo.rb"
6
+ require_relative "../Core/Hypothese.rb"
7
+ require_relative "../Core/Action.rb"
8
+
9
+
10
+ ##
11
+ # Auteur:: Brabant Mano, Renoult Florent
12
+ # Version:: 0.1
13
+ # Date:: 09/04/2020
14
+ #
15
+ #Cette classe représente une grille de jeu avec les cases, la pile d'action, les hypoyhèses, etc
16
+ class Grille
17
+
18
+
19
+
20
+ #@dernierIle => La dernière ile séléctionnée par l'utilisateur
21
+
22
+ #@difficulte => La difficulté de la grille
23
+ attr_reader :difficulte
24
+
25
+ #@tailleX => Le nombre de cases en abscisse
26
+ attr_reader :tailleX
27
+
28
+ #@tailleY => Le nombre de cases en ordonnée
29
+ attr_reader :tailleY
30
+
31
+ #@actions => La pile d'action
32
+ attr_reader :actions
33
+
34
+ #@matSolution => La matrice solution
35
+ attr_reader :matSolution
36
+
37
+ #@mat => La matrice de cases
38
+ attr_reader :mat
39
+
40
+ #@score => Le score de la grille
41
+ attr_accessor :score
42
+
43
+ #@couleurs => Les couleur que prennent les pont en fonction du niveau d'hypothèse
44
+ attr_reader :couleurs
45
+
46
+
47
+ include Comparable
48
+
49
+ ##
50
+ #Cette méthode permet de retourner toutes les grilles d'un dossier
51
+ #param::
52
+ # * dossier Le dossier où on va chercher les grilles
53
+ def Grille.chargerGrilles(dossier)
54
+
55
+ ret = Array.new()
56
+ Dir.each_child(dossier) do |fichier|
57
+ text = File.open(dossier + "/" + fichier).read
58
+ text.gsub!(/\r\n/, "\n");
59
+ ret.push(Grille.creer(text))
60
+ end
61
+ return ret
62
+
63
+ end
64
+
65
+
66
+ private_class_method :new
67
+
68
+ ##
69
+ #Ce constructeur permet de créer une nouvelle grille
70
+ #param::
71
+ # * chaine La chaine génératrice
72
+ #Le format de la chaine est::
73
+ # * "#T tailleGrilleX tailleGrilleY"
74
+ # * "#D difficulteGrille"
75
+ # * Ensemble de caractères séparés par des espaces pour coder la grille complète
76
+ #Les caractères spéciaux sont::
77
+ # * \[1-8\] Correspont à une ile avec le même nombre de liens à faire
78
+ # * N Correspont à une case vide
79
+ # * \- Correspont à un pont horizontal simple
80
+ # * \= Correspont à un pont horizontal double
81
+ # * | Correspont à un pont vertical simple
82
+ # * H Correspont à un pont vertical double
83
+ def Grille.creer(chaine)
84
+ new(chaine)
85
+ end
86
+
87
+
88
+ #:nodoc:
89
+ def initialize(chaine)
90
+ #puts "chaine", chaine
91
+
92
+ i = -1
93
+ j = -1
94
+
95
+ chaine.each_line do |l|
96
+ if(l.start_with?("#T"))
97
+ t = l.split(' ')
98
+ @tailleX = t[1].to_i()
99
+ @tailleY = t[2].to_i()
100
+ @mat = Array.new(@tailleX) { Array.new(@tailleY) }
101
+ @matSolution = Array.new(@tailleX) { Array.new(@tailleY) }
102
+ elsif(l.start_with?("#D"))
103
+ d = l.split(' ')
104
+ @difficulte = d[1].to_i()
105
+ else
106
+ i += 1
107
+ j = -1
108
+ l.split(' ') do |c|
109
+ #print c
110
+ j += 1
111
+ if(c =~ /[1-8]/)
112
+ @mat[i][j] = Ile.creer(i, j, c.ord() - '0'.ord(), self)
113
+ @matSolution[i][j] = Ile.creer(i, j, c.ord() - '0'.ord(), self)
114
+ elsif(c == '|')
115
+ @matSolution[i][j] = Pont.construit(i, j, self, Pont::VERTICAL, 1)
116
+ @mat[i][j] = Pont.creer(i, j, self)
117
+ elsif(c == 'H')
118
+ @matSolution[i][j] = Pont.construit(i, j, self, Pont::VERTICAL, 2)
119
+ @mat[i][j] = Pont.creer(i, j, self)
120
+ elsif(c == '-')
121
+ @matSolution[i][j] = Pont.construit(i, j, self, Pont::HORIZONTAL, 1)
122
+ @mat[i][j] = Pont.creer(i, j, self)
123
+ elsif(c == '=')
124
+ @matSolution[i][j] = Pont.construit(i, j, self, Pont::HORIZONTAL, 2)
125
+ @mat[i][j] = Pont.creer(i, j, self)
126
+ elsif(c == 'N')
127
+ @matSolution[i][j] = Pont.creer(i, j, self)
128
+ @mat[i][j] = Pont.creer(i, j, self)
129
+ end
130
+ end
131
+ end
132
+ end
133
+ recommencer()
134
+ end
135
+ #:doc:
136
+
137
+ ##
138
+ #Cette méthode permet d'afficher les case de la grille
139
+ def afficheToi()
140
+ print "\t"
141
+ for colonne in (0..tailleX-1)
142
+ print colonne.to_s() + " "
143
+ end
144
+ print "\n"
145
+ ligne = -1
146
+ @mat.each do |i|
147
+ print (ligne+=1).to_s() + " :\t"
148
+ i.each do |j|
149
+ print j.to_s() + " "
150
+ end
151
+ print "\n"
152
+ end
153
+ end
154
+
155
+ ##
156
+ #Cette méthode permet d'afficher les case de la grille solution
157
+ def afficheSolution()
158
+ print "\t"
159
+ for colonne in (0..tailleX-1)
160
+ print colonne.to_s() + " "
161
+ end
162
+ print "\n"
163
+ ligne = -1
164
+ @matSolution.each do |i|
165
+ print (ligne+=1).to_s() + " :\t"
166
+ i.each do |j|
167
+ print j.to_s() + " "
168
+ end
169
+ print "\n"
170
+ end
171
+ end
172
+
173
+ ##
174
+ #Cette méthode permet de savoir si la grille est fini (si tous les ponts on été placé comme dans la solution)
175
+ #return::
176
+ # * true Si la grille est fini
177
+ # * false Sinon
178
+ def fini?()
179
+ for i in (0..(@tailleX-1))
180
+ for j in (0..(@tailleY-1))
181
+ if(@mat[i][j] != @matSolution[i][j])
182
+ return false
183
+ end
184
+ end
185
+ end
186
+ return true
187
+ end
188
+
189
+ ##
190
+ #Cette méthode permet de savoir si les coordonnées passés sont comprises dans la grille
191
+ #param::
192
+ # * posX La position en abscisse
193
+ # * posY La position en ordonnée
194
+ #return::
195
+ # * true Si les coordonnées sont valides
196
+ # * false Sinon
197
+ def sortLimite?(posX, posY)
198
+ if(posX < 0 || posY < 0 || posX >= @tailleX || posY >= @tailleY)
199
+ return true
200
+ end
201
+ return false
202
+ end
203
+
204
+ ##
205
+ #Cette méthode permet de recuperer la matrice de cases
206
+ def getGrille()
207
+ return @mat
208
+ end
209
+
210
+ ##
211
+ #Cette méthode permet de savoir si la grille à une solution identique à une autre grille
212
+ #param::
213
+ # * grille L'autre grille
214
+ #return::
215
+ # * true Si les grilles ont la même solution
216
+ # * false Sinon
217
+ def memeSolution(grille)
218
+
219
+ return false if(@tailleX != grille.tailleX || @tailleY != grille.tailleY)
220
+ for i in (0..(@tailleX-1))
221
+ for j in (0..(@tailleY-1))
222
+ if(self.getCaseSolution(i, j) != grille.getCaseSolution(i, j))
223
+ return false
224
+ end
225
+ end
226
+ end
227
+ return true
228
+
229
+ end
230
+
231
+ ##
232
+ #Cette méthode permet de recuperer une case de la grille
233
+ #param::
234
+ # * i La position en abscisse
235
+ # * j La position en ordonnée
236
+ #return::
237
+ # * La case à la position [i][j]
238
+ def getCase(i, j)
239
+ return @mat[i][j]
240
+ end
241
+
242
+ #met a jour le temps que l'utilisateur à mis à finir la map
243
+ def setTempsFin(minutes,secondes)
244
+ @minutesFin = minutes
245
+ @secondesFin =secondes
246
+ end
247
+
248
+ ##
249
+ #Cette méthode permet de recuperer une case de la grille solution
250
+ #param::
251
+ # * i La position en abscisse
252
+ # * j La position en ordonnée
253
+ #return::
254
+ # * La case à la position (i, j)
255
+ def getCaseSolution(i, j)
256
+ return @matSolution[i][j]
257
+ end
258
+
259
+ ##
260
+ #Cette méthode permet d'emmetre une nouvelle hypothèse (changer la couleur des ponts que l'on va modifier)
261
+ def creerHypothese()
262
+ begin
263
+ undoCouleurPont(@couleurs.undo())
264
+ rescue => e
265
+ puts e
266
+ end
267
+ end
268
+
269
+ ##
270
+ #Cette méthode permet de valider la dernière hypothèse (prendre tous les ponts de la dernière couleur et la changer à l'avant dernière)
271
+ def valideHypothese()
272
+ begin
273
+ @couleurs.redo()
274
+ @couleurs.redo()
275
+ redoCouleurPont(@couleurs.undo())
276
+ rescue => e
277
+ puts e.message()
278
+ end
279
+ end
280
+
281
+ ##
282
+ #Cette méthode permet de supprimer la dernière hypothèse (supprime tous les ponts de la dernière couleur)
283
+ #param::
284
+ # * jeu Le jeu dont-on va modifier la grille
285
+ def supprimeHypothese()
286
+ begin
287
+ @couleurs.redo()
288
+ @couleurs.redo()
289
+ redoSupprCouleurPont(@couleurs.undo())
290
+ setDernierIle(@dernierIle)
291
+ rescue => e
292
+ puts e.message()
293
+ end
294
+ end
295
+
296
+
297
+
298
+ ##
299
+ #Méthode à appeler quand on appuie sur une ile
300
+ #param::
301
+ # * ile L'ile sur laquelle on a cliqué
302
+ def clickOnIle(ile)
303
+ setDernierIle(ile)
304
+ end
305
+
306
+
307
+ ##
308
+ #Méthode à appeler quand on appuie sur une ile
309
+ #param::
310
+ # * ile L'ile sur laquelle on a cliqué
311
+ def clickOnPont(pont)
312
+
313
+ if(!@dernierIle.eql?(nil))
314
+ if(pont.surbrillance())
315
+ self.chercherVoisins(pont, pont.directionSurbrillance)
316
+ @score -= 20
317
+ else
318
+ self.setDernierIle(nil)
319
+ end
320
+ end
321
+
322
+ end
323
+
324
+ ##
325
+ #Cette méthode permet de remmetre à zéro la grille
326
+ def recommencer()
327
+
328
+ @actions = UndoRedo.creer()
329
+
330
+ setDernierIle(nil)
331
+ @score = 500 * @tailleX
332
+
333
+
334
+ @couleurs = UndoRedo.creer()
335
+
336
+ @couleurs.empiler(Couleur::JAUNE)
337
+ @couleurs.empiler(Couleur::CYAN)
338
+ @couleurs.empiler(Couleur::MAGENTA)
339
+ @couleurs.empiler(Couleur::VERT)
340
+ @couleurs.empiler(Couleur::BLEU)
341
+ @couleurs.empiler(Couleur::NOIR)
342
+
343
+
344
+ undoCouleurPont(@couleurs.undo())
345
+
346
+ @mat.each do |ligne|
347
+ ligne.each do |c|
348
+ c.raz()
349
+ end
350
+ end
351
+
352
+ end
353
+
354
+
355
+ ##
356
+ #Cette méthode permet de créer un pont entre la dernière ile et une autre ile qui passe par un pont donné
357
+ #param::
358
+ # * pont La case pont par lequel doit passer le pont entre les deux iles
359
+ # * direction La direction dans laquelle est dirigé le pont
360
+ def chercherVoisins(pont, direction)
361
+
362
+ if(direction == Pont::HORIZONTAL)
363
+
364
+ i = pont.posX
365
+ j = pont.posY
366
+ while(!(ileDroite = getCase(i, j)).estIle?())
367
+ j += 1
368
+ end
369
+ j = pont.posY
370
+ while(!(ileGauche = getCase(i, j)).estIle?())
371
+ j -= 1
372
+ end
373
+
374
+ temp = @dernierIle
375
+ if(ileGauche == @dernierIle)
376
+ ile2 = ileDroite
377
+ elsif(ileDroite == @dernierIle)
378
+ ile2 = ileGauche
379
+ else
380
+ ile2 = ileDroite
381
+ setDernierIle(ileGauche)
382
+ end
383
+ createPont(ile2)
384
+ setDernierIle(temp)
385
+
386
+ elsif(direction == Pont::VERTICAL)
387
+
388
+ i = pont.posX
389
+ j = pont.posY
390
+ while(!(ileBas = getCase(i, j)).estIle?())
391
+ i += 1
392
+ end
393
+ i = pont.posX
394
+ while(!(ileHaut = getCase(i, j)).estIle?())
395
+ i -= 1
396
+ end
397
+
398
+ temp = @dernierIle
399
+ if(ileBas == @dernierIle)
400
+ ile2 = ileHaut
401
+ elsif(ileHaut == @dernierIle)
402
+ ile2 = ileBas
403
+ else
404
+ ile2 = ileHaut
405
+ setDernierIle(ileBas)
406
+ end
407
+ createPont(ile2)
408
+ setDernierIle(temp)
409
+ end
410
+
411
+ end
412
+
413
+ ##
414
+ #Cette méthode permet d'appeler la méthode Case#redoCouleurPont de chaque case de la grille
415
+ #param::
416
+ # * couleur La couleur à passer au la méthode Case#redoCouleurPont
417
+ def redoCouleurPont(couleur)
418
+
419
+ @mat.each do |ligne|
420
+ ligne.each do |c|
421
+ if(c.estPont?())
422
+ c.redoCouleurPont(couleur)
423
+ end
424
+ end
425
+ end
426
+
427
+ end
428
+
429
+ ##
430
+ #Cette méthode permet d'appeler la méthode Case#redoCouleurPont de chaque case de la grille et de supprimer les ponts de la dernière hypothèse
431
+ #param::
432
+ # * couleur La couleur à passer a la méthode Case#redoCouleurPont
433
+ def redoSupprCouleurPont(couleur)
434
+
435
+ @mat.each do |ligne|
436
+ ligne.each do |c|
437
+ if(c.estPont?())
438
+ if(c.couleurPont == c.couleurPontCourante)
439
+ while(c.valeur != 0)
440
+ #print "Valeur", c.valeur, c.direction, "\n"
441
+ chercherVoisins(c, c.direction)
442
+ end
443
+ end
444
+ c.redoCouleurPont(couleur)
445
+ end
446
+ end
447
+ end
448
+
449
+ end
450
+
451
+
452
+ ##
453
+ #Cette méthode permet d'appeler la méthode Case#undoCouleurPont de chaque case de la grille
454
+ #param::
455
+ # * couleur La couleur à passer au la méthode Case#undoCouleurPont
456
+ def undoCouleurPont(couleur)
457
+
458
+ @mat.each do |ligne|
459
+ ligne.each do |c|
460
+ if(c.estPont?())
461
+ c.undoCouleurPont(couleur)
462
+ end
463
+ end
464
+ end
465
+
466
+ end
467
+
468
+
469
+ ##
470
+ #Cette méthode permet d'ajouter une action à la pile d'action
471
+ #param::
472
+ # * ile1 La premère ile
473
+ # * ile2 La deuxième ile
474
+ # * methode La méthode utilisé (:createPont ou :supprimePont)
475
+ def addAction(ile1, ile2, methode)
476
+ @actions.empiler(Action.creer(ile1, ile2, methode))
477
+ end
478
+
479
+ ##
480
+ #Cette méthode permet d'annuler la dernière action éfféctué par l'utilisateur
481
+ def undo()
482
+ if(!@actions.empty?())
483
+ begin
484
+ tempIle = self.getDernierIle()
485
+ action = @actions.undo()
486
+ self.setDernierIle(action.ile1())
487
+ #Invoque l'inverse de la méthode utilisé sans l'ajouter à la undoRedo d'action
488
+ self.send(homologue(action.methode()), action.ile2(), false)
489
+ self.setDernierIle(tempIle)
490
+ rescue => e
491
+ puts e.message()
492
+ end
493
+ end
494
+ end
495
+
496
+ ##
497
+ #Cette méthode permet de refaire la dernière action annulé par le undo
498
+ def redo()
499
+ if(!@actions.empty?())
500
+ begin
501
+ action = @actions.redo()
502
+ self.setDernierIle(action.ile1())
503
+ #Invoque la méthode utilisé sans l'ajouter à la undoRedo d'action
504
+ self.send(action.methode(), action.ile2(), false)
505
+ rescue => e
506
+ puts e.message()
507
+ end
508
+ end
509
+ end
510
+
511
+ ##
512
+ #Donne la méthode inverse de celle passé en paramètre
513
+ #param::
514
+ # * methode La méthode dont-il faut retourner l'inverse
515
+ #return::
516
+ # * Une méthode qui permet en l'appelant avec les mêmes paramètres de revenir à l'état précedant
517
+ private def homologue(methode)
518
+ if(methode == :createPont)
519
+ return :supprimePont
520
+ elsif(methode == :supprimePont)
521
+ return :createPont
522
+ else
523
+ raise("Je ne connais pas la methode")
524
+ end
525
+ end
526
+
527
+ ##
528
+ #Cette méthode permet de connaitre la direction du pont qui pourrait relier deux iles
529
+ #param::
530
+ # * ile1 La première ile
531
+ # * ile2 La deuxième ile
532
+ #return::
533
+ # * La direction du pont Si les deux iles sont voisines
534
+ # * Pont::NULLE Sinon
535
+ def getDirectionPont(ile1, ile2)
536
+ if(ile1.posX() == ile2.posX()) #alors pont horizontal
537
+ return Pont::HORIZONTAL
538
+ elsif(ile1.posY() == ile2.posY()) #alors pont vertical
539
+ return Pont::VERTICAL
540
+ else
541
+ return Pont::NULLE
542
+ end
543
+ end
544
+
545
+ ##
546
+ #Cette méthode permet de connaitre la direction et les positions des ponts qui pourrait relier deux iles
547
+ #param::
548
+ # * ile1 La première ile
549
+ # * ile2 La deuxième ile
550
+ #return::
551
+ # * direction : La direction du pont, retourne Pont::NULLE si les iles ne sont pas voisines
552
+ # * petitPos : La plus petit coordonnée du pont (en abscisse ou en ordonnée en fontion de la direction)
553
+ # * grandPos : La plus grande coordonnée du pont (en abscisse ou en ordonnée en fontion de la direction)
554
+ def getDifference(ile1, ile2)
555
+
556
+ direction = getDirectionPont(ile1, ile2)
557
+ if(direction == Pont::HORIZONTAL)
558
+ petitPos = [ile2.posY(), ile1.posY()].min() + 1
559
+ grandPos = [ile2.posY(), ile1.posY()].max() - 1
560
+ elsif(direction == Pont::VERTICAL) #alors pont vertical
561
+ petitPos = [ile2.posX(), ile1.posX()].min() + 1
562
+ grandPos = [ile2.posX(), ile1.posX()].max() - 1
563
+ else
564
+ petitPos = 0
565
+ grandPos = 0
566
+ end
567
+ return direction, petitPos, grandPos
568
+
569
+ end
570
+
571
+ ##
572
+ #Cette méthode permet de savoir si deux iles sont voisines
573
+ #param::
574
+ # * ile1 La première ile
575
+ # * ile2 La deuxième ile
576
+ #return::
577
+ # * true Si les iles sont voisines
578
+ # * false Sinon
579
+ def estVoisin?(ile1, ile2 = @dernierIle)
580
+ proc = Proc.new do |pont|
581
+ if(pont.estIle?())
582
+ return false
583
+ end
584
+ end
585
+ return parcoursPont(ile1, ile2, proc)
586
+ end
587
+
588
+ ##
589
+ #Cette méthode permet de créer un pont entre deux iles
590
+ #param::
591
+ # * ile2 La deuxième ile (La première est l'ile @dernierIle)
592
+ # * action Boolean, si true on ajoute l'action à la pile d'action, si false on ne l'ajoute pas
593
+ #return::
594
+ # * true Si le pont a été crée
595
+ # * false Sinon
596
+ def createPont(ile2, action = true)
597
+ direction = getDirectionPont(@dernierIle, ile2)
598
+ if(direction != Pont::NULLE)
599
+ if(action)
600
+ self.addAction(@dernierIle, ile2, :createPont)
601
+ end
602
+ ile2.ajouteNombrePont(@dernierIle)
603
+ @dernierIle.ajouteNombrePont(ile2)
604
+ end
605
+ proc = Proc.new do |pont|
606
+ pont.augmenteValeur(direction)
607
+ end
608
+ return parcoursPont(@dernierIle, ile2, proc)
609
+ end
610
+
611
+ ##
612
+ #Cette méthode permet de supprimer un pont entre deux iles
613
+ #param::
614
+ # * ile2 La deuxième ile (La première est l'ile @dernierIle)
615
+ # * action Boolean, si true on ajoute l'action à la pile d'action, si false on ne l'ajoute pas
616
+ #return::
617
+ # * true Si le pont a été supprimer
618
+ # * false Sinon
619
+ def supprimePont(ile2, action = true)
620
+ direction = getDirectionPont(@dernierIle, ile2)
621
+ if(direction != Pont::NULLE)
622
+ if(action)
623
+ self.addAction(@dernierIle, ile2, :supprimePont)
624
+ end
625
+ ile2.retireNombrePont(@dernierIle)
626
+ @dernierIle.retireNombrePont(ile2)
627
+ end
628
+ proc = Proc.new do |pont|
629
+ pont.diminueValeur(direction)
630
+ end
631
+ return parcoursPont(@dernierIle, ile2, proc)
632
+ end
633
+
634
+
635
+ ##
636
+ #Cette méthode permet de mettre en surbrillance un pont entre deux iles
637
+ #param::
638
+ # * ile2 La deuxième ile (La première est l'ile @dernierIle)
639
+ #return::
640
+ # * true Si le pont a été mis en surbrillance
641
+ # * false Sinon
642
+ def surbrillancePont(ile2)
643
+ direction = getDirectionPont(@dernierIle, ile2)
644
+ proc = Proc.new do |pont|
645
+ pont.metSurbrillance(direction)
646
+ end
647
+ return parcoursPont(@dernierIle, ile2, proc)
648
+ end
649
+
650
+ ##
651
+ #Cette méthode permet de retirer la surbrillance d'un pont entre deux iles
652
+ #param::
653
+ # * ile2 La deuxième ile (La première est l'ile @dernierIle)
654
+ #return::
655
+ # * true Si le pont n'est plus en surbrillance
656
+ # * false Sinon
657
+ def eteintPont(ile2)
658
+ direction = getDirectionPont(@dernierIle, ile2)
659
+ proc = Proc.new do |pont|
660
+ pont.supprSurbrillance(direction)
661
+ end
662
+ return parcoursPont(@dernierIle, ile2, proc)
663
+ end
664
+
665
+ ##
666
+ #Cette méthode permet de savoir si la route entre deux pont est disponible (iles voisines et pas séparées par un pont)
667
+ #param::
668
+ # * ile1 La première ile
669
+ # * ile2 La deuxième ile
670
+ def routeDisponible?(ile1, ile2)
671
+ direction = getDirectionPont(ile1, ile2)
672
+ proc = Proc.new do |pont|
673
+ if(pont.direction != Pont::NULLE && pont.direction != direction)
674
+ return false
675
+ end
676
+ end
677
+ return parcoursPont(ile1, ile2, proc)
678
+ end
679
+
680
+ ##
681
+ #Cette méthode permet de parcourir les ponts entre deux ile avec un bloc
682
+ #param::
683
+ # * ile1 La première ile
684
+ # * ile2 La deuxième ile
685
+ # * proc Le bloc
686
+ #return::
687
+ # * false Si les deux iles ne sont pas voisines
688
+ # * La valeur de retour du bloc sinon
689
+ def parcoursPont(ile1, ile2, proc)
690
+ direction, petitPos, grandPos = getDifference(ile1, ile2)
691
+ if(direction == Pont::HORIZONTAL)
692
+ return parcoursPontHorizontal(petitPos, grandPos, proc, ile1.posX())
693
+ elsif(direction == Pont::VERTICAL)
694
+ return parcoursPontVertical(petitPos, grandPos, proc, ile1.posY())
695
+ else
696
+ return false
697
+ end
698
+ end
699
+
700
+ ##
701
+ #Cette méthode permet de faire un parcous vertical
702
+ private def parcoursPontVertical(petitPos, grandPos, proc, colonne)
703
+ for i in (petitPos..grandPos)
704
+ proc.call(@mat[i][colonne])
705
+ end
706
+ return true
707
+ end
708
+
709
+ ##
710
+ #Cette méthode permet de faire un parcous horizontal
711
+ private def parcoursPontHorizontal(petitPos, grandPos, proc, ligne)
712
+ for i in (petitPos..grandPos)
713
+ proc.call(@mat[ligne][i])
714
+ end
715
+ return true
716
+ end
717
+
718
+ ##
719
+ #Cette méthode permet de modifier la dernière ile séléctionnée
720
+ #param::
721
+ # * ile1 La nouvelle ile
722
+ def setDernierIle(ile1)
723
+ if(!@dernierIle.eql?(nil))
724
+ effacePont()
725
+ @dernierIle.dernier = false
726
+ end
727
+ @dernierIle = ile1
728
+ if(!@dernierIle.eql?(nil))
729
+ montrePont()
730
+ #afficheToi()
731
+ @dernierIle.dernier = true
732
+ end
733
+ end
734
+
735
+ ##
736
+ #Cette méthode permet de recuperer la dernière ile séléctionnée
737
+ #return::
738
+ # * La dernière ile séléctionnée
739
+ def getDernierIle()
740
+ return @dernierIle
741
+ end
742
+
743
+ ##
744
+ #Cette méthode permet de mettre en surbrillance les pont disponibles de @dernierIle
745
+ def montrePont()
746
+ for direction in Ile::DIRECTIONS
747
+ if(@dernierIle.aVoisinDisponible?(direction))
748
+ surbrillancePont(@dernierIle.getVoisin(direction))
749
+ end
750
+ end
751
+ end
752
+
753
+ ##
754
+ #Cette méthode permet d'enlever la surbrillance des pont disponibles de @dernierIle
755
+ def effacePont()
756
+ for direction in Ile::DIRECTIONS
757
+ if(@dernierIle.aVoisinDisponible?(direction))
758
+ eteintPont(@dernierIle.getVoisin(direction))
759
+ end
760
+ end
761
+ end
762
+
763
+ ##
764
+ #Cette méthode permet de retourner la valeur du pont entre deux ile
765
+ #return::
766
+ # * La valeur du pont entre deux iles Si elles sont rélié
767
+ # * 0 Sinon
768
+ def valeurPont(ile1, ile2)
769
+ direction, petitPos, grandPos = getDifference(ile1, ile2)
770
+ if(direction == Pont::HORIZONTAL)
771
+ pont = @mat[ile1.posX()][petitPos]
772
+ elsif(direction == Pont::VERTICAL)
773
+ pont = @mat[petitPos][ile1.posY()]
774
+ elsif(direction == Pont::NULLE)
775
+ return 0
776
+ end
777
+
778
+ if(pont.direction == direction)
779
+ return pont.valeur
780
+ end
781
+
782
+ return 0
783
+
784
+ end
785
+
786
+ ##
787
+ #Cette méthode permet de sauvegarder la grille dans la base de donnée
788
+ def sauvegarder(compte)
789
+
790
+ save = Sauvegarde.recuperer(compte, self)
791
+ save.setGrille(self)
792
+ if(fini?())
793
+ save.setScore([save.getScore(), @score].max) if self.fini?()
794
+ end
795
+ save.sauvegarder()
796
+
797
+ end
798
+
799
+
800
+ def getMeilleurScore(compte)
801
+ Sauvegarde.recuperer(compte, self).getScore()
802
+ end
803
+
804
+ end