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.
- checksums.yaml +7 -0
- data/bin/Hashiparmentier +3 -0
- data/launcher.command +3 -0
- data/lib/Hashiparmentier.rb +8 -0
- data/lib/Hashiparmentier/BDD/BDDDPQADSAHASHIPARMENTIER.db +0 -0
- data/lib/Hashiparmentier/BDD/Base.sqlite +0 -0
- data/lib/Hashiparmentier/Base.sqlite +0 -0
- data/lib/Hashiparmentier/CSS/Style.rb +184 -0
- data/lib/Hashiparmentier/Core/Action.rb +48 -0
- data/lib/Hashiparmentier/Core/Aide.rb +28 -0
- data/lib/Hashiparmentier/Core/Case.rb +92 -0
- data/lib/Hashiparmentier/Core/Chrono.rb +96 -0
- data/lib/Hashiparmentier/Core/Compte.rb +137 -0
- data/lib/Hashiparmentier/Core/ConnectSqlite3.rb +19 -0
- data/lib/Hashiparmentier/Core/Couleur.rb +94 -0
- data/lib/Hashiparmentier/Core/DonnerTechnique.rb +70 -0
- data/lib/Hashiparmentier/Core/Grille.rb +804 -0
- data/lib/Hashiparmentier/Core/Hypothese.rb +43 -0
- data/lib/Hashiparmentier/Core/Ile.rb +330 -0
- data/lib/Hashiparmentier/Core/Jeu.rb +177 -0
- data/lib/Hashiparmentier/Core/Pile.rb +85 -0
- data/lib/Hashiparmentier/Core/Pont.rb +300 -0
- data/lib/Hashiparmentier/Core/Sauvegarde.rb +176 -0
- data/lib/Hashiparmentier/Core/UndoRedo.rb +93 -0
- data/lib/Hashiparmentier/Core/VerifierGrille.rb +51 -0
- data/lib/Hashiparmentier/Data/Golden Bridge.jpg +0 -0
- data/lib/Hashiparmentier/Data/Pont Gaulois.jpg +0 -0
- data/lib/Hashiparmentier/Data/Zubi Zuri.jpg +0 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-1010-0-001.txt +12 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-1010-0-002.txt +12 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-1010-0-003.txt +12 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-1010-1-001.txt +12 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-1010-1-002.txt +12 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-1010-1-003.txt +12 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-1010-2-001.txt +12 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-1010-2-002.txt +12 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-1010-2-003.txt +12 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-1515-0-001.txt +17 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-1515-0-002.txt +17 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-1515-0-003.txt +17 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-1515-1-001.txt +17 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-1515-1-002.txt +17 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-1515-1-003.txt +17 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-1515-2-001.txt +17 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-1515-2-002.txt +17 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-1515-2-003.txt +17 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-77-0-001.txt +9 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-77-0-002.txt +9 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-77-0-003.txt +9 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-77-1-001.txt +9 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-77-1-002.txt +9 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-77-1-003.txt +9 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-77-2-001.txt +9 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-77-2-002.txt +9 -0
- data/lib/Hashiparmentier/NouvellesGrilles/map-77-2-003.txt +9 -0
- data/lib/Hashiparmentier/Test/Gemfile +3 -0
- data/lib/Hashiparmentier/Test/MajBDDGrille.rb +10 -0
- data/lib/Hashiparmentier/Test/NotAMalwareDefinitiveEdition +3 -0
- data/lib/Hashiparmentier/Test/NotAMalwareDefinitiveEdition~ +2 -0
- data/lib/Hashiparmentier/Test/NotAMalware~ +2 -0
- data/lib/Hashiparmentier/Test/TestChargerGrille.rb +7 -0
- data/lib/Hashiparmentier/Test/TestCompte.rb +51 -0
- data/lib/Hashiparmentier/Test/TestFenetre.rb +10 -0
- data/lib/Hashiparmentier/Test/TestGrille.rb +27 -0
- data/lib/Hashiparmentier/Test/TestJeu.rb +47 -0
- data/lib/Hashiparmentier/Test/TestPont.rb +73 -0
- data/lib/Hashiparmentier/Test/TestSauvegarde.rb +53 -0
- data/lib/Hashiparmentier/Test/execLinux.sh +8 -0
- data/lib/Hashiparmentier/Test/icone/Custom-Icon-Design-2014-World-Cup-Flags-Japan.ico +0 -0
- data/lib/Hashiparmentier/Test/test.bat +1 -0
- data/lib/Hashiparmentier/Test/testExec +2 -0
- data/lib/Hashiparmentier/Test/testTestExec.rb +3 -0
- data/lib/Hashiparmentier/UI/AideJeuUI.rb +22 -0
- data/lib/Hashiparmentier/UI/AideUI.rb +22 -0
- data/lib/Hashiparmentier/UI/AstucesUI.rb +23 -0
- data/lib/Hashiparmentier/UI/CaseUI.rb +70 -0
- data/lib/Hashiparmentier/UI/ChoixDifficulteUI.rb +45 -0
- data/lib/Hashiparmentier/UI/ChoixGrilleScrollUI.rb +37 -0
- data/lib/Hashiparmentier/UI/ChoixGrilleUI.rb +80 -0
- data/lib/Hashiparmentier/UI/ChoixNomUI.rb +39 -0
- data/lib/Hashiparmentier/UI/ChoixTailleUI.rb +44 -0
- data/lib/Hashiparmentier/UI/Fenetre.rb +32 -0
- data/lib/Hashiparmentier/UI/FenetreFinUI.rb +71 -0
- data/lib/Hashiparmentier/UI/FenetreJeuUI.rb +193 -0
- data/lib/Hashiparmentier/UI/FenetreReglesUI.rb +28 -0
- data/lib/Hashiparmentier/UI/FinUI.rb +91 -0
- data/lib/Hashiparmentier/UI/GrilleJouableUI.rb +47 -0
- data/lib/Hashiparmentier/UI/GrilleUI.rb +140 -0
- data/lib/Hashiparmentier/UI/IleUI.rb +87 -0
- data/lib/Hashiparmentier/UI/JeuUI.rb +161 -0
- data/lib/Hashiparmentier/UI/Menu.rb +322 -0
- data/lib/Hashiparmentier/UI/MenuUI.rb +107 -0
- data/lib/Hashiparmentier/UI/PontUI.rb +135 -0
- data/lib/Hashiparmentier/UI/RacineUI.rb +142 -0
- data/lib/Hashiparmentier/UI/ReglesUI.rb +22 -0
- data/lib/Hashiparmentier/doc/Action.html +259 -0
- data/lib/Hashiparmentier/doc/Aide.html +229 -0
- data/lib/Hashiparmentier/doc/AideUI.html +168 -0
- data/lib/Hashiparmentier/doc/Case.html +473 -0
- data/lib/Hashiparmentier/doc/CaseUI.html +343 -0
- data/lib/Hashiparmentier/doc/ChoixDifficulteUI.html +209 -0
- data/lib/Hashiparmentier/doc/ChoixGrilleScrollUI.html +239 -0
- data/lib/Hashiparmentier/doc/ChoixGrilleUI.html +276 -0
- data/lib/Hashiparmentier/doc/ChoixNomUI.html +215 -0
- data/lib/Hashiparmentier/doc/ChoixTailleUI.html +210 -0
- data/lib/Hashiparmentier/doc/Chrono.html +420 -0
- data/lib/Hashiparmentier/doc/Compte.html +514 -0
- data/lib/Hashiparmentier/doc/Couleur.html +422 -0
- data/lib/Hashiparmentier/doc/DonnerTechnique.html +245 -0
- data/lib/Hashiparmentier/doc/Fenetre.html +179 -0
- data/lib/Hashiparmentier/doc/FenetreJeuUI.html +274 -0
- data/lib/Hashiparmentier/doc/FenetreReglesUI.html +167 -0
- data/lib/Hashiparmentier/doc/FinUI.html +274 -0
- data/lib/Hashiparmentier/doc/Grille.html +2153 -0
- data/lib/Hashiparmentier/doc/GrilleJouableUI.html +229 -0
- data/lib/Hashiparmentier/doc/GrilleUI.html +477 -0
- data/lib/Hashiparmentier/doc/Hypothese.html +248 -0
- data/lib/Hashiparmentier/doc/Ile.html +1103 -0
- data/lib/Hashiparmentier/doc/IleUI.html +244 -0
- data/lib/Hashiparmentier/doc/Jeu.html +179 -0
- data/lib/Hashiparmentier/doc/JeuUI.html +471 -0
- data/lib/Hashiparmentier/doc/Menu.html +667 -0
- data/lib/Hashiparmentier/doc/MenuUI.html +416 -0
- data/lib/Hashiparmentier/doc/Pile.html +383 -0
- data/lib/Hashiparmentier/doc/Pont.html +943 -0
- data/lib/Hashiparmentier/doc/PontUI.html +307 -0
- data/lib/Hashiparmentier/doc/RacineUI.html +387 -0
- data/lib/Hashiparmentier/doc/ReglesUI.html +203 -0
- data/lib/Hashiparmentier/doc/Sauvegarde.html +672 -0
- data/lib/Hashiparmentier/doc/UndoRedo.html +389 -0
- data/lib/Hashiparmentier/doc/VerifierGrille.html +225 -0
- data/lib/Hashiparmentier/doc/created.rid +46 -0
- data/lib/Hashiparmentier/doc/css/fonts.css +167 -0
- data/lib/Hashiparmentier/doc/css/rdoc.css +590 -0
- data/lib/Hashiparmentier/doc/fonts/Lato-Light.ttf +0 -0
- data/lib/Hashiparmentier/doc/fonts/Lato-LightItalic.ttf +0 -0
- data/lib/Hashiparmentier/doc/fonts/Lato-Regular.ttf +0 -0
- data/lib/Hashiparmentier/doc/fonts/Lato-RegularItalic.ttf +0 -0
- data/lib/Hashiparmentier/doc/fonts/SourceCodePro-Bold.ttf +0 -0
- data/lib/Hashiparmentier/doc/fonts/SourceCodePro-Regular.ttf +0 -0
- data/lib/Hashiparmentier/doc/images/add.png +0 -0
- data/lib/Hashiparmentier/doc/images/arrow_up.png +0 -0
- data/lib/Hashiparmentier/doc/images/brick.png +0 -0
- data/lib/Hashiparmentier/doc/images/brick_link.png +0 -0
- data/lib/Hashiparmentier/doc/images/bug.png +0 -0
- data/lib/Hashiparmentier/doc/images/bullet_black.png +0 -0
- data/lib/Hashiparmentier/doc/images/bullet_toggle_minus.png +0 -0
- data/lib/Hashiparmentier/doc/images/bullet_toggle_plus.png +0 -0
- data/lib/Hashiparmentier/doc/images/date.png +0 -0
- data/lib/Hashiparmentier/doc/images/delete.png +0 -0
- data/lib/Hashiparmentier/doc/images/find.png +0 -0
- data/lib/Hashiparmentier/doc/images/loadingAnimation.gif +0 -0
- data/lib/Hashiparmentier/doc/images/macFFBgHack.png +0 -0
- data/lib/Hashiparmentier/doc/images/package.png +0 -0
- data/lib/Hashiparmentier/doc/images/page_green.png +0 -0
- data/lib/Hashiparmentier/doc/images/page_white_text.png +0 -0
- data/lib/Hashiparmentier/doc/images/page_white_width.png +0 -0
- data/lib/Hashiparmentier/doc/images/plugin.png +0 -0
- data/lib/Hashiparmentier/doc/images/ruby.png +0 -0
- data/lib/Hashiparmentier/doc/images/tag_blue.png +0 -0
- data/lib/Hashiparmentier/doc/images/tag_green.png +0 -0
- data/lib/Hashiparmentier/doc/images/transparent.png +0 -0
- data/lib/Hashiparmentier/doc/images/wrench.png +0 -0
- data/lib/Hashiparmentier/doc/images/wrench_orange.png +0 -0
- data/lib/Hashiparmentier/doc/images/zoom.png +0 -0
- data/lib/Hashiparmentier/doc/index.html +154 -0
- data/lib/Hashiparmentier/doc/js/darkfish.js +161 -0
- data/lib/Hashiparmentier/doc/js/jquery.js +4 -0
- data/lib/Hashiparmentier/doc/js/navigation.js +141 -0
- data/lib/Hashiparmentier/doc/js/navigation.js.gz +0 -0
- data/lib/Hashiparmentier/doc/js/search.js +109 -0
- data/lib/Hashiparmentier/doc/js/search_index.js +1 -0
- data/lib/Hashiparmentier/doc/js/search_index.js.gz +0 -0
- data/lib/Hashiparmentier/doc/js/searcher.js +229 -0
- data/lib/Hashiparmentier/doc/js/searcher.js.gz +0 -0
- data/lib/Hashiparmentier/doc/table_of_contents.html +1197 -0
- data/lib/Hashiparmentier/glade/Fin.glade +222 -0
- data/lib/Hashiparmentier/glade/aide.glade +127 -0
- data/lib/Hashiparmentier/glade/aideJeu.glade +143 -0
- data/lib/Hashiparmentier/glade/astuces.glade +1558 -0
- data/lib/Hashiparmentier/glade/fonts/VINERITC.TTF +0 -0
- data/lib/Hashiparmentier/glade/images/18790.ico +0 -0
- data/lib/Hashiparmentier/glade/images/1stars.png +0 -0
- data/lib/Hashiparmentier/glade/images/2stars.png +0 -0
- data/lib/Hashiparmentier/glade/images/3stars.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-07 11-48-54.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-13 17-54-16.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-13 18-00-00.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-13 18-01-25.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-13 18-17-16.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-13 18-17-40.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-13 18-18-01.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-13 18-18-23.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-13 18-19-00.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-13 18-19-17.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-13 18-19-54.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 14-24-24.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 14-24-44.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 14-24-58.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 14-25-16.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 14-25-36.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 14-25-51.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 14-26-04.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 14-26-15.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 15-01-40.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 15-02-08.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 15-02-33.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 15-02-54.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 15-03-13.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 15-03-39.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 15-03-55.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 15-04-10.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 15-33-07.png +0 -0
- data/lib/Hashiparmentier/glade/images/Capture du 2020-02-18 15-36-05.png +0 -0
- data/lib/Hashiparmentier/glade/images/LOGO.png +0 -0
- data/lib/Hashiparmentier/glade/images/LOGpR.png +0 -0
- data/lib/Hashiparmentier/glade/images/LOGpR2.png +0 -0
- data/lib/Hashiparmentier/glade/images/bg.jpg +0 -0
- data/lib/Hashiparmentier/glade/images/ex111.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex112.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex211.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex212.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex221.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex222.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex231.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex232.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex241.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex242.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex251.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex252.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex311.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex312.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex321.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex322.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex331.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex332.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex341.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex342.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex411.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex412.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex413.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex421.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex422.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex423.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex431.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex432.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex433.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex441.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex442.png +0 -0
- data/lib/Hashiparmentier/glade/images/ex443.png +0 -0
- data/lib/Hashiparmentier/glade/images/icone.png +0 -0
- data/lib/Hashiparmentier/glade/images/puzzle-solvation.gif +0 -0
- data/lib/Hashiparmentier/glade/images/wJapStylePlusNet.jpg +0 -0
- data/lib/Hashiparmentier/glade/images/wJapStylePlusNet15.jpg +0 -0
- data/lib/Hashiparmentier/glade/jeu.glade +539 -0
- data/lib/Hashiparmentier/glade/menu.glade +511 -0
- data/lib/Hashiparmentier/glade/regles.glade +856 -0
- data/lib/Hashiparmentier/map.txt +316 -0
- 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
|