From 39553c14788ad81e9c50d9cfb6dfd255ab962a7d Mon Sep 17 00:00:00 2001 From: Lionel Jouin Date: Fri, 14 Sep 2018 13:45:09 +0200 Subject: [PATCH] Import --- .classpath | 7 + .gitignore | 2 + .project | 17 + LICENSE | 674 ------------------ ico/gamew.png | Bin 0 -> 19469 bytes ico/gear.png | Bin 0 -> 4047 bytes ico/gearw.png | Bin 0 -> 19904 bytes ico/pause.png | Bin 0 -> 17818 bytes ico/people.png | Bin 0 -> 5549 bytes ico/web.png | Bin 0 -> 3363 bytes options.xml | 8 + src/Main.java | 29 + src/controller/AccueilController.java | 55 ++ src/controller/ClassementController.java | 47 ++ src/controller/Controller.java | 37 + src/controller/JeuController.java | 317 ++++++++ src/controller/OptionsController.java | 75 ++ src/controller/OptionsJeuController.java | 121 ++++ src/controller/PanelController.java | 29 + src/controller/PanelControllerInterface.java | 6 + src/model/Model.java | 24 + src/model/ModelTableClassement.java | 58 ++ src/model/dao/ConnectionMySql.java | 36 + src/model/dao/ScoreDAO.java | 160 +++++ src/model/jeu/Association.java | 126 ++++ src/model/jeu/Caracteristique.java | 25 + src/model/jeu/Carte.java | 127 ++++ src/model/jeu/GestionnaireAssociations.java | 75 ++ .../jeu/GestionnaireCaracteristiques.java | 44 ++ src/model/jeu/GestionnaireJoueurs.java | 134 ++++ src/model/jeu/GroupeCartes.java | 101 +++ src/model/jeu/Jeu.java | 292 ++++++++ src/model/jeu/Joueur.java | 82 +++ src/model/jeu/Option.java | 223 ++++++ src/model/jeu/Score.java | 90 +++ src/model/jeu/Thematique.java | 157 ++++ src/model/jeu/interfaces/CarteListener.java | 11 + src/model/jeu/interfaces/CartesListener.java | 11 + src/model/jeu/interfaces/JoueurListener.java | 9 + src/model/jeu/interfaces/JoueursListener.java | 10 + src/ui/SingleMouseClickSelectList.java | 54 ++ src/ui/StylingUI.java | 161 +++++ src/view/AccueilPanel.java | 160 +++++ src/view/ClassementPanel.java | 119 ++++ src/view/JeuPanel.java | 98 +++ src/view/OptionsJeuPanel.java | 311 ++++++++ src/view/OptionsPanel.java | 232 ++++++ src/view/Panels.java | 11 + src/view/Window.java | 95 +++ .../jeuPanel/AssociationTrouveePanel.java | 163 +++++ src/view/jeuPanel/CentreJeuPanel.java | 241 +++++++ src/view/jeuPanel/ChimoryPanel.java | 358 ++++++++++ src/view/jeuPanel/ClassementJeuPanel.java | 136 ++++ src/view/jeuPanel/PausePanel.java | 107 +++ thematiques/chimie/chimie.xml | 168 +++++ thematiques/chimie/desktop.ini | 5 + thematiques/chimie/images/P1.png | Bin 0 -> 1567 bytes thematiques/chimie/images/P10.png | Bin 0 -> 1126 bytes thematiques/chimie/images/P11.png | Bin 0 -> 1137 bytes thematiques/chimie/images/P12.png | Bin 0 -> 1065 bytes thematiques/chimie/images/P13.png | Bin 0 -> 1422 bytes thematiques/chimie/images/P14.png | Bin 0 -> 874 bytes thematiques/chimie/images/P15.png | Bin 0 -> 1024 bytes thematiques/chimie/images/P16.png | Bin 0 -> 2045 bytes thematiques/chimie/images/P17.png | Bin 0 -> 1212 bytes thematiques/chimie/images/P18.png | Bin 0 -> 1201 bytes thematiques/chimie/images/P19.png | Bin 0 -> 1400 bytes thematiques/chimie/images/P2.png | Bin 0 -> 1941 bytes thematiques/chimie/images/P20.png | Bin 0 -> 649 bytes thematiques/chimie/images/P21.png | Bin 0 -> 709 bytes thematiques/chimie/images/P22.png | Bin 0 -> 1608 bytes thematiques/chimie/images/P23.png | Bin 0 -> 1782 bytes thematiques/chimie/images/P3.png | Bin 0 -> 1463 bytes thematiques/chimie/images/P4.png | Bin 0 -> 1982 bytes thematiques/chimie/images/P5.png | Bin 0 -> 1552 bytes thematiques/chimie/images/P6.png | Bin 0 -> 1846 bytes thematiques/chimie/images/P7.png | Bin 0 -> 2209 bytes thematiques/chimie/images/P8.png | Bin 0 -> 1961 bytes thematiques/chimie/images/P9.png | Bin 0 -> 1610 bytes thematiques/chimie/images/RS1.png | Bin 0 -> 1497 bytes thematiques/chimie/images/RS10.png | Bin 0 -> 949 bytes thematiques/chimie/images/RS11.png | Bin 0 -> 946 bytes thematiques/chimie/images/RS12.png | Bin 0 -> 1105 bytes thematiques/chimie/images/RS13.png | Bin 0 -> 1105 bytes thematiques/chimie/images/RS14.png | Bin 0 -> 1101 bytes thematiques/chimie/images/RS15.png | Bin 0 -> 1024 bytes thematiques/chimie/images/RS16.png | Bin 0 -> 1254 bytes thematiques/chimie/images/RS17.png | Bin 0 -> 1417 bytes thematiques/chimie/images/RS18.png | Bin 0 -> 1370 bytes thematiques/chimie/images/RS19.png | Bin 0 -> 1049 bytes thematiques/chimie/images/RS2.png | Bin 0 -> 952 bytes thematiques/chimie/images/RS20.png | Bin 0 -> 861 bytes thematiques/chimie/images/RS21.png | Bin 0 -> 1121 bytes thematiques/chimie/images/RS22.png | Bin 0 -> 2082 bytes thematiques/chimie/images/RS23.png | Bin 0 -> 1405 bytes thematiques/chimie/images/RS3.png | Bin 0 -> 1497 bytes thematiques/chimie/images/RS4.png | Bin 0 -> 986 bytes thematiques/chimie/images/RS5.png | Bin 0 -> 1273 bytes thematiques/chimie/images/RS6.png | Bin 0 -> 1176 bytes thematiques/chimie/images/RS7.png | Bin 0 -> 1599 bytes thematiques/chimie/images/RS8.png | Bin 0 -> 1576 bytes thematiques/chimie/images/RS9.png | Bin 0 -> 1559 bytes thematiques/chimieFacile/chimieFacile.xml | 57 ++ thematiques/espace/espace.xml | 37 + 104 files changed, 5058 insertions(+), 674 deletions(-) create mode 100644 .classpath create mode 100644 .project delete mode 100644 LICENSE create mode 100644 ico/gamew.png create mode 100644 ico/gear.png create mode 100644 ico/gearw.png create mode 100644 ico/pause.png create mode 100644 ico/people.png create mode 100644 ico/web.png create mode 100644 options.xml create mode 100644 src/Main.java create mode 100644 src/controller/AccueilController.java create mode 100644 src/controller/ClassementController.java create mode 100644 src/controller/Controller.java create mode 100644 src/controller/JeuController.java create mode 100644 src/controller/OptionsController.java create mode 100644 src/controller/OptionsJeuController.java create mode 100644 src/controller/PanelController.java create mode 100644 src/controller/PanelControllerInterface.java create mode 100644 src/model/Model.java create mode 100644 src/model/ModelTableClassement.java create mode 100644 src/model/dao/ConnectionMySql.java create mode 100644 src/model/dao/ScoreDAO.java create mode 100644 src/model/jeu/Association.java create mode 100644 src/model/jeu/Caracteristique.java create mode 100644 src/model/jeu/Carte.java create mode 100644 src/model/jeu/GestionnaireAssociations.java create mode 100644 src/model/jeu/GestionnaireCaracteristiques.java create mode 100644 src/model/jeu/GestionnaireJoueurs.java create mode 100644 src/model/jeu/GroupeCartes.java create mode 100644 src/model/jeu/Jeu.java create mode 100644 src/model/jeu/Joueur.java create mode 100644 src/model/jeu/Option.java create mode 100644 src/model/jeu/Score.java create mode 100644 src/model/jeu/Thematique.java create mode 100644 src/model/jeu/interfaces/CarteListener.java create mode 100644 src/model/jeu/interfaces/CartesListener.java create mode 100644 src/model/jeu/interfaces/JoueurListener.java create mode 100644 src/model/jeu/interfaces/JoueursListener.java create mode 100644 src/ui/SingleMouseClickSelectList.java create mode 100644 src/ui/StylingUI.java create mode 100644 src/view/AccueilPanel.java create mode 100644 src/view/ClassementPanel.java create mode 100644 src/view/JeuPanel.java create mode 100644 src/view/OptionsJeuPanel.java create mode 100644 src/view/OptionsPanel.java create mode 100644 src/view/Panels.java create mode 100644 src/view/Window.java create mode 100644 src/view/jeuPanel/AssociationTrouveePanel.java create mode 100644 src/view/jeuPanel/CentreJeuPanel.java create mode 100644 src/view/jeuPanel/ChimoryPanel.java create mode 100644 src/view/jeuPanel/ClassementJeuPanel.java create mode 100644 src/view/jeuPanel/PausePanel.java create mode 100644 thematiques/chimie/chimie.xml create mode 100644 thematiques/chimie/desktop.ini create mode 100644 thematiques/chimie/images/P1.png create mode 100644 thematiques/chimie/images/P10.png create mode 100644 thematiques/chimie/images/P11.png create mode 100644 thematiques/chimie/images/P12.png create mode 100644 thematiques/chimie/images/P13.png create mode 100644 thematiques/chimie/images/P14.png create mode 100644 thematiques/chimie/images/P15.png create mode 100644 thematiques/chimie/images/P16.png create mode 100644 thematiques/chimie/images/P17.png create mode 100644 thematiques/chimie/images/P18.png create mode 100644 thematiques/chimie/images/P19.png create mode 100644 thematiques/chimie/images/P2.png create mode 100644 thematiques/chimie/images/P20.png create mode 100644 thematiques/chimie/images/P21.png create mode 100644 thematiques/chimie/images/P22.png create mode 100644 thematiques/chimie/images/P23.png create mode 100644 thematiques/chimie/images/P3.png create mode 100644 thematiques/chimie/images/P4.png create mode 100644 thematiques/chimie/images/P5.png create mode 100644 thematiques/chimie/images/P6.png create mode 100644 thematiques/chimie/images/P7.png create mode 100644 thematiques/chimie/images/P8.png create mode 100644 thematiques/chimie/images/P9.png create mode 100644 thematiques/chimie/images/RS1.png create mode 100644 thematiques/chimie/images/RS10.png create mode 100644 thematiques/chimie/images/RS11.png create mode 100644 thematiques/chimie/images/RS12.png create mode 100644 thematiques/chimie/images/RS13.png create mode 100644 thematiques/chimie/images/RS14.png create mode 100644 thematiques/chimie/images/RS15.png create mode 100644 thematiques/chimie/images/RS16.png create mode 100644 thematiques/chimie/images/RS17.png create mode 100644 thematiques/chimie/images/RS18.png create mode 100644 thematiques/chimie/images/RS19.png create mode 100644 thematiques/chimie/images/RS2.png create mode 100644 thematiques/chimie/images/RS20.png create mode 100644 thematiques/chimie/images/RS21.png create mode 100644 thematiques/chimie/images/RS22.png create mode 100644 thematiques/chimie/images/RS23.png create mode 100644 thematiques/chimie/images/RS3.png create mode 100644 thematiques/chimie/images/RS4.png create mode 100644 thematiques/chimie/images/RS5.png create mode 100644 thematiques/chimie/images/RS6.png create mode 100644 thematiques/chimie/images/RS7.png create mode 100644 thematiques/chimie/images/RS8.png create mode 100644 thematiques/chimie/images/RS9.png create mode 100644 thematiques/chimieFacile/chimieFacile.xml create mode 100644 thematiques/espace/espace.xml diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..d93f655 --- /dev/null +++ b/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.gitignore b/.gitignore index 32858aa..e8b8fa6 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ # Mobile Tools for Java (J2ME) .mtj.tmp/ +/bin/ + # Package Files # *.jar *.war diff --git a/.project b/.project new file mode 100644 index 0000000..98bef1a --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + PTS2-G3 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 9cecc1d..0000000 --- a/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {one line to give the program's name and a brief idea of what it does.} - Copyright (C) {year} {name of author} - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - {project} Copyright (C) {year} {fullname} - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/ico/gamew.png b/ico/gamew.png new file mode 100644 index 0000000000000000000000000000000000000000..eb471fbabae0490426130082088791afafa0ddab GIT binary patch literal 19469 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 literal 0 HcmV?d00001 diff --git a/ico/gear.png b/ico/gear.png new file mode 100644 index 0000000000000000000000000000000000000000..a3c1dea0aacb1d4a85bdfe2a78bd7d253e1b2d07 GIT binary patch literal 4047 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 literal 0 HcmV?d00001 diff --git a/ico/gearw.png b/ico/gearw.png new file mode 100644 index 0000000000000000000000000000000000000000..c46011bd29c718fc12168f6db1b03bf120a7db54 GIT binary patch literal 19904 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 literal 0 HcmV?d00001 diff --git a/ico/people.png b/ico/people.png new file mode 100644 index 0000000000000000000000000000000000000000..6c24a7f42937020382469a9922e22da1ce4f5ced GIT binary patch literal 5549 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 ODgdizqT7JN$NnF5aLcp+ literal 0 HcmV?d00001 diff --git a/ico/web.png b/ico/web.png new file mode 100644 index 0000000000000000000000000000000000000000..7b49bdccdca9393c53f56f5051160e1a5aaff4ac GIT binary patch literal 3363 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 + + chimieFacile + 1680x1050 + + + + diff --git a/src/Main.java b/src/Main.java new file mode 100644 index 0000000..091cc5e --- /dev/null +++ b/src/Main.java @@ -0,0 +1,29 @@ +import controller.Controller; +import model.Model; +import view.Window; + +public class Main { + + public static void main(String[] args) { + + // http://www.developpez.net/forums/d881330/java/interfaces-graphiques-java/awt-swing/fenetres-dialogues/question-cardlayout-changement-panel/ + // http://thebadprogrammer.com/swing-uimanager-keys/ + // http://www.duncanjauncey.com/java/ui/uimanager/UIDefaults_Java1.7.0_Linux_2.6.38-11-server_CDE_Motif.html + + /* + * Faire des listener sur le model dans le controlleur pour quae quand + * le model change la vue soit notifier et change aussi + */ + + // https://github.com/koppelbw/TicTacToe/tree/master/src + + + Model model = new Model(); + Window vue = new Window(); + Controller controller = new Controller(model, vue); + + vue.setVisible(true); + + } + +} diff --git a/src/controller/AccueilController.java b/src/controller/AccueilController.java new file mode 100644 index 0000000..8d568b6 --- /dev/null +++ b/src/controller/AccueilController.java @@ -0,0 +1,55 @@ +package controller; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.sql.ResultSet; +import java.sql.SQLException; + +import javax.swing.JButton; +import javax.swing.JTable; + +import model.ModelTableClassement; +import model.dao.ScoreDAO; +import view.AccueilPanel; +import view.Panels; + +public class AccueilController extends Controller implements PanelControllerInterface { + + private Controller mC; + private AccueilPanel accueilPanel; + + public AccueilController(Controller mC) { + + this.mC = mC; + this.accueilPanel = mC.view.getAccueilPanel(); + this.accueilPanel.addButtonListener(new ButtonListener()); + + } + + private class ButtonListener implements ActionListener{ + + @Override + public void actionPerformed(ActionEvent e) { + JButton optionsJeuButton = accueilPanel.getOptionsJeuButton(); + JButton optionsButton = accueilPanel.getOptionsButton(); + JButton classementButton = accueilPanel.getClassementButton(); + + if (e.getSource() == optionsJeuButton) + mC.panelController.changeView(Panels.OPTIONS_JEU); + else if (e.getSource() == optionsButton) + mC.panelController.changeView(Panels.OPTIONS); + else if (e.getSource() == classementButton) + mC.panelController.changeView(Panels.CLASSEMENT); + + } + } + + @Override + public void initPanel() { + JTable scoreTable = accueilPanel.getScoreTable(); + scoreTable.setModel(new ModelTableClassement(10)); + + System.out.println(scoreTable.getModel().getRowCount() +" test"); + } + +} diff --git a/src/controller/ClassementController.java b/src/controller/ClassementController.java new file mode 100644 index 0000000..865da6e --- /dev/null +++ b/src/controller/ClassementController.java @@ -0,0 +1,47 @@ +package controller; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; +import javax.swing.JTable; + +import model.ModelTableClassement; +import view.AccueilPanel; +import view.ClassementPanel; +import view.Panels; + +public class ClassementController extends Controller implements PanelControllerInterface { + + private Controller mC; + private ClassementPanel classementPanel; + + public ClassementController(Controller mC) { + + this.mC = mC; + this.classementPanel = mC.view.getClassementPanel(); + this.classementPanel.addButtonListener(new ButtonListener()); + + } + + private class ButtonListener implements ActionListener{ + + @Override + public void actionPerformed(ActionEvent e) { + + JButton accueilButton = classementPanel.getAccueilButton(); + + if (e.getSource() == accueilButton) + mC.panelController.changeView(Panels.ACCUEIL); + } + } + + @Override + public void initPanel() { + JTable scoreTable = classementPanel.getScoreTable(); + scoreTable.setModel(new ModelTableClassement(100)); + + System.out.println(scoreTable.getModel().getRowCount() +" test"); + } + +} diff --git a/src/controller/Controller.java b/src/controller/Controller.java new file mode 100644 index 0000000..33576f3 --- /dev/null +++ b/src/controller/Controller.java @@ -0,0 +1,37 @@ +package controller; + +import java.util.ArrayList; +import java.util.HashMap; + +import model.Model; +import view.AccueilPanel; +import view.Panels; +import view.Window; + +public class Controller { + + protected Window view; + protected Model model; + protected HashMap controllers = new HashMap<>(); + protected PanelController panelController; + + public Controller() { + + } + + public Controller(Model gameModel, Window view) { + this(); + this.view = view; + this.model = gameModel; + + controllers.put(Panels.ACCUEIL, new AccueilController(this)); + controllers.put(Panels.OPTIONS_JEU, new OptionsJeuController(this)); + controllers.put(Panels.OPTIONS, new OptionsController(this)); + controllers.put(Panels.JEU, new JeuController(this)); + controllers.put(Panels.CLASSEMENT, new ClassementController(this)); + + panelController = new PanelController(this); + + } + +} diff --git a/src/controller/JeuController.java b/src/controller/JeuController.java new file mode 100644 index 0000000..28b38b3 --- /dev/null +++ b/src/controller/JeuController.java @@ -0,0 +1,317 @@ +package controller; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.sql.Time; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JButton; +import javax.swing.JPanel; + +import model.dao.ScoreDAO; +import model.jeu.Association; +import model.jeu.Caracteristique; +import model.jeu.Carte; +import model.jeu.Score; +import model.jeu.interfaces.CartesListener; +import model.jeu.interfaces.JoueursListener; +import view.JeuPanel; +import view.Panels; + +public class JeuController extends Controller implements PanelControllerInterface { + + private Controller mC; + private JeuPanel jeuPanel; + private boolean repondu = false; + // private Association associationTrouvee = null; + private int indexCarteReactifSubstrat = -1; + private int indexCarteProduit = -1; + private int indexCarteReaction = -1; + + private List cartesReactifSubstrat; + private List cartesProduit; + private List cartesReaction; + + private Association associationTrouvee = null; + + public JeuController(Controller mC) { + + this.mC = mC; + this.jeuPanel = mC.view.getJeuPanel(); + + this.jeuPanel.addButtonListener(new ButtonListener()); + + // this.jeuPanel.addCarteListener(new CarteListener()); + + } + + private class ButtonListener implements ActionListener { + + @Override + public void actionPerformed(ActionEvent e) { + + JButton pauseButton = jeuPanel.getChimoryPanel().getPauseButton(); + JButton reprendreButton = jeuPanel.getPausePanel().getReprendreButton(); + JButton optionsButton = jeuPanel.getPausePanel().getOptionsButton(); + JButton quitterButton = jeuPanel.getPausePanel().getQuitterButton(); + + JButton accepter = jeuPanel.getChimoryPanel().getCenter().getAccepter(); + JButton oui = jeuPanel.getChimoryPanel().getCenter().getOui(); + JButton non = jeuPanel.getChimoryPanel().getCenter().getNon(); + + if (e.getSource() == pauseButton) + jeuPanel.afficherPause(true); + else if (e.getSource() == reprendreButton) + jeuPanel.afficherPause(false); + else if (e.getSource() == optionsButton) + mC.panelController.changeView(Panels.OPTIONS); + else if (e.getSource() == quitterButton) + mC.panelController.changeView(Panels.ACCUEIL); + else if (e.getSource() == oui) { + + repondu = true; + // mC.model.getJeu().verifieSelection(); + jeuPanel.getChimoryPanel().getCenter().afficherQuestion(); + + } else if (e.getSource() == non) { + + mC.model.getJeu().verifieSelection(); + jeuPanel.getChimoryPanel().getCenter().reset(); + + } else if (e.getSource() == accepter) { + + List listeCaracteristique = new ArrayList<>(); + int[] lC = jeuPanel.getChimoryPanel().getCenter().getCaracteristiques(); + for (int i = 0; i < lC.length; i++) { + listeCaracteristique + .add(mC.model.getJeu().getGestionnaireCaracteristiques().getCaracteristique(lC[i])); + } + + mC.model.getJeu().verifieCaracteristiques(associationTrouvee, listeCaracteristique); + + associationTrouvee = null; + + jeuPanel.getChimoryPanel().getCenter().reset(); + + if ((mC.model.getJeu().getCartesReactifSubstrat().nombreCarte() + - mC.model.getJeu().getCartesReactifSubstrat().nombreCarteTrouvee()) <= 0 + || (mC.model.getJeu().getCartesProduit().nombreCarte() + - mC.model.getJeu().getCartesProduit().nombreCarteTrouvee()) <= 0 + || (mC.model.getJeu().getCartesReaction().nombreCarte() + - mC.model.getJeu().getCartesReaction().nombreCarteTrouvee()) <= 0) { + // ajout des scores avant de quitter la partie + ScoreDAO scoreDAO = new ScoreDAO(); + for (int j = 0; j < mC.model.getJeu().getGestionnaireJoueurs().nombreJoueurs(); j++) { + Score score = new Score(); + score.setDifficulte(mC.model.getJeu().getDifficulte()); + score.setModeJeu("standard"); + score.setNbJoueurs(mC.model.getJeu().getGestionnaireJoueurs().nombreJoueurs()); + score.setPseudo(mC.model.getJeu().getGestionnaireJoueurs().getJoueur(j).getPseudo()); + score.setScore(mC.model.getJeu().getGestionnaireJoueurs().getJoueur(j).getPoints()); + long temps = mC.model.getJeu().getGestionnaireJoueurs().getJoueur(j).getTemps(); + int heure = (int)temps/3600000; + int minutes = (int)temps/60000-heure*60; + int secondes = (int)temps/1000 - minutes*60; + score.setTemps(new Time(heure,minutes,secondes)); + score.setThematique(mC.model.getJeu().getThematique().getThematiqueActuel()); + scoreDAO.ajouter(score); + } + + mC.panelController.changeView(Panels.ACCUEIL); + } + + } + } + } + + private class CarteListener implements MouseListener { + + @Override + public void mouseClicked(MouseEvent e) { + } + + @Override + public void mouseEntered(MouseEvent e) { + + for (int i = 0; i < cartesReactifSubstrat.size(); i++) + if (e.getSource() == cartesReactifSubstrat.get(i)) + System.out.println(mC.model.getJeu().getCartesReactifSubstrat().getCarte(i).getNom()); + + for (int i = 0; i < cartesProduit.size(); i++) + if (e.getSource() == cartesProduit.get(i)) + System.out.println(mC.model.getJeu().getCartesProduit().getCarte(i).getNom()); + + for (int i = 0; i < cartesReaction.size(); i++) + if (e.getSource() == cartesReaction.get(i)) + System.out.println(mC.model.getJeu().getCartesReaction().getCarte(i).getNom()); + + } + + @Override + public void mouseExited(MouseEvent e) { + } + + @Override + public void mousePressed(MouseEvent e) { + + for (int i = 0; i < cartesReactifSubstrat.size(); i++) + if (e.getSource() == cartesReactifSubstrat.get(i)) + if (mC.model.getJeu().getCarteReactifSubstratSelectionne() == null) + mC.model.getJeu().selectionneCarteReactifSubstrat(i); + + for (int i = 0; i < cartesProduit.size(); i++) + if (e.getSource() == cartesProduit.get(i)) + if (mC.model.getJeu().getCarteProduitSelectionnee() == null) + mC.model.getJeu().selectionneCarteProduit(i); + + for (int i = 0; i < cartesReaction.size(); i++) + if (e.getSource() == cartesReaction.get(i)) + if (mC.model.getJeu().getCarteReactionSelectionne() == null) + if (repondu) + mC.model.getJeu().selectionneCarteReaction(i); + + } + + @Override + public void mouseReleased(MouseEvent e) { + } + + } + + @Override + public void initPanel() { + mC.model.getJeu().getGestionnaireJoueurs().removeListener(); + mC.model.getJeu().getCartesReactifSubstrat().removeListener(); + mC.model.getJeu().getCartesProduit().removeListener(); + mC.model.getJeu().getCartesReaction().removeListener(); + mC.model.getJeu().initialiserPartie(); + + jeuPanel.afficherPause(false); + jeuPanel.getChimoryPanel().resetCartes(); + + // Initialisation Classement + mC.model.getJeu().getGestionnaireJoueurs().getJoueurs().size(); + + String[] joueursNom = new String[mC.model.getJeu().getGestionnaireJoueurs().getJoueurs().size()]; + for (int i = 0; i < mC.model.getJeu().getGestionnaireJoueurs().getJoueurs().size(); i++) + joueursNom[i] = mC.model.getJeu().getGestionnaireJoueurs().getJoueurs().get(i).getPseudo(); + + jeuPanel.getChimoryPanel().getClassement().initPlayers(joueursNom); + jeuPanel.getChimoryPanel().getClassement() + .setJoueurActuel(mC.model.getJeu().getGestionnaireJoueurs().getIndexJoueurActuel()); + + // Initialisation Cartes + jeuPanel.getChimoryPanel().setNbCartesProduit(mC.model.getJeu().getCartesProduit().getNbCarte()); + jeuPanel.getChimoryPanel() + .setNbCartesReactifSubstrat(mC.model.getJeu().getCartesReactifSubstrat().getNbCarte()); + jeuPanel.getChimoryPanel().setNbCartesReaction(mC.model.getJeu().getCartesReaction().getNbCarte()); + + for (int i = 0; i < mC.model.getJeu().getCartesReactifSubstrat().getNbCarte(); i++) + jeuPanel.getChimoryPanel().initCartesReactifSubstrat("", ""); + + for (int i = 0; i < mC.model.getJeu().getCartesProduit().getNbCarte(); i++) + jeuPanel.getChimoryPanel().initCartesProduit("", ""); + + for (int i = 0; i < mC.model.getJeu().getCartesReaction().getNbCarte(); i++) + jeuPanel.getChimoryPanel().initCartesReaction(mC.model.getJeu().getCartesReaction().getCarte(i).getNom(), + "thematiques/" + mC.model.getJeu().getThematique().getThematiqueActuel() + "/images/" + + mC.model.getJeu().getCartesReaction().getCarte(i).getImage()); + + jeuPanel.getChimoryPanel().initCartes(); + + cartesReactifSubstrat = jeuPanel.getChimoryPanel().getCartesReactifSubstrat(); + cartesProduit = jeuPanel.getChimoryPanel().getCartesProduit(); + cartesReaction = jeuPanel.getChimoryPanel().getCartesReaction(); + + this.jeuPanel.addCarteListener(new CarteListener()); + + jeuPanel.getChimoryPanel().getCenter().reset(); + + // Initialisation Caracteristiques + jeuPanel.getChimoryPanel().getCenter().resetCaracteristiques(); + String[] caracteristiques = new String[mC.model.getJeu().getGestionnaireCaracteristiques() + .getNbCaracteristiques()]; + for (int i = 0; i < mC.model.getJeu().getGestionnaireCaracteristiques().getNbCaracteristiques(); i++) + caracteristiques[i] = mC.model.getJeu().getGestionnaireCaracteristiques().getCaracteristique(i).toString(); + jeuPanel.getChimoryPanel().getCenter().addCaracteristiques(caracteristiques); + + // listener + mC.model.getJeu().getGestionnaireJoueurs().addListener(new JoueursListener() { + @Override + public void pointsJoueurChange(int indexJoueur, int points) { + jeuPanel.getChimoryPanel().getClassement().setPoints(indexJoueur, points); + } + + @Override + public void joueurActuelChange(int indexJoueur) { + jeuPanel.getChimoryPanel().getClassement().setJoueurActuel(indexJoueur); + } + + @Override + public void tempsJoueurChange(int indexJoueur, long temps) { + jeuPanel.getChimoryPanel().getClassement().setTemps(indexJoueur, temps); + } + }); + + mC.model.getJeu().getCartesReactifSubstrat().addListener(new CartesListener() { + @Override + public void trouve(int index, Carte carte) { + jeuPanel.getChimoryPanel().getFound().ajouterCartesReactifSubstrat(carte.getNom(), carte.getImage()); + } + + @Override + public void retourne(int index, Carte carte) { + jeuPanel.getChimoryPanel().retourne(cartesReactifSubstrat, index); + jeuPanel.getChimoryPanel().getCenter().afficherCarte(0, carte.getNom(), "thematiques/" + + mC.model.getJeu().getThematique().getThematiqueActuel() + "/images/" + carte.getImage()); + if (mC.model.getJeu().getCarteProduitSelectionnee() != null) + jeuPanel.getChimoryPanel().getCenter().afficherQuestion(); + } + }); + mC.model.getJeu().getCartesProduit().addListener(new CartesListener() { + @Override + public void trouve(int index, Carte carte) { + jeuPanel.getChimoryPanel().getFound().ajouterCartesProduit(carte.getNom(), carte.getImage()); + } + + @Override + public void retourne(int index, Carte carte) { + jeuPanel.getChimoryPanel().retourne(cartesProduit, index); + jeuPanel.getChimoryPanel().getCenter().afficherCarte(1, carte.getNom(), "thematiques/" + + mC.model.getJeu().getThematique().getThematiqueActuel() + "/images/" + carte.getImage()); + if (mC.model.getJeu().getCarteReactifSubstratSelectionne() != null) + jeuPanel.getChimoryPanel().getCenter().afficherQuestion(); + } + }); + mC.model.getJeu().getCartesReaction().addListener(new CartesListener() { + @Override + public void trouve(int index, Carte carte) { + jeuPanel.getChimoryPanel().getFound().ajouterCartesReaction(carte.getNom(), carte.getImage()); + } + + @Override + public void retourne(int index, Carte carte) { + + jeuPanel.getChimoryPanel().retourne(cartesReaction, index); + jeuPanel.getChimoryPanel().getCenter().afficherCarte(2, carte.getNom(), "thematiques/" + + mC.model.getJeu().getThematique().getThematiqueActuel() + "/images/" + carte.getImage()); + + if (repondu) { + + repondu = false; + associationTrouvee = mC.model.getJeu().verifieSelection(); + + if (associationTrouvee != null) + jeuPanel.getChimoryPanel().getCenter().afficherCaracteristiques(); + else + jeuPanel.getChimoryPanel().getCenter().reset(); + + } + } + }); + + } +} diff --git a/src/controller/OptionsController.java b/src/controller/OptionsController.java new file mode 100644 index 0000000..385503e --- /dev/null +++ b/src/controller/OptionsController.java @@ -0,0 +1,75 @@ +package controller; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; + +import model.jeu.Option; +import model.jeu.Thematique; +import view.OptionsPanel; + +public class OptionsController extends Controller implements PanelControllerInterface { + + private Controller mC; + private OptionsPanel optionsPanel; + + public OptionsController(Controller mC) { + + this.mC = mC; + this.optionsPanel = mC.view.getOptionsPanel(); + this.optionsPanel.addButtonListener(new ButtonListener()); + + } + + private class ButtonListener implements ActionListener{ + + @Override + public void actionPerformed(ActionEvent e) { + + JButton sauvegarderButton = optionsPanel.getSauvegarderButton(); + JButton annulerButton = optionsPanel.getAnnulerButton(); + + if(e.getSource() == sauvegarderButton){ + mC.model.getOption().setThematiqueDefaut(optionsPanel.getThematiqueComboBox().getSelectedItem().toString()); + mC.model.getOption().setResolution(optionsPanel.getResolutionComboBox().getSelectedItem().toString()); + mC.model.getOption().setUrlBDD(optionsPanel.getHotePortTextField().getText()); + mC.model.getOption().setUser(optionsPanel.getIdentifiantTextField().getText()); + mC.model.getOption().setPassword(optionsPanel.getPasswordTextField().getText()); + mC.model.getOption().save(); + mC.panelController.lastView(); + } + else if(e.getSource() == annulerButton) + mC.panelController.lastView(); + + } + } + + @Override + public void initPanel() { + //reset + optionsPanel.getThematiqueComboBox().removeAllItems(); + optionsPanel.getResolutionComboBox().removeAllItems(); + + // + mC.model.getOption().load(); + mC.model.getJeu().getThematique().listeThematique(); + + //remplissage + for (int i = 0;i scores; + public ModelTableClassement(int lim){ + ScoreDAO scoreDAO = new ScoreDAO(); + this.scores = scoreDAO.toList(lim); + } + + @Override + public int getColumnCount() { + return 9; + } + + @Override + public int getRowCount() { + // TODO Auto-generated method stub + return scores.size(); + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + if (columnIndex == 0) + return scores.get(rowIndex).getIdentifiant(); + if (columnIndex == 1) + return scores.get(rowIndex).getPseudo(); + if (columnIndex == 2) + return scores.get(rowIndex).getScore(); + if (columnIndex == 3) + return scores.get(rowIndex).getTemps(); + if (columnIndex == 4) + return scores.get(rowIndex).getThematique(); + if (columnIndex == 5) + return scores.get(rowIndex).getNbJoueurs(); + if (columnIndex == 6) + return scores.get(rowIndex).getModeJeu(); + if (columnIndex == 7) + return scores.get(rowIndex).getDifficulte(); + if (columnIndex == 8) + return scores.get(rowIndex).getDateHeure(); + return null; + } + + @Override + public String getColumnName(int column) { + return titles[column]; + } +} diff --git a/src/model/dao/ConnectionMySql.java b/src/model/dao/ConnectionMySql.java new file mode 100644 index 0000000..8f028ef --- /dev/null +++ b/src/model/dao/ConnectionMySql.java @@ -0,0 +1,36 @@ +package model.dao; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.lang.Class; + +public class ConnectionMySql { + public static String url = ""; + public static String user = ""; + public static String password = ""; + private static Connection connection = null; + + public static Connection getConnection() { + try { + Class.forName("com.mysql.jdbc.Driver").newInstance(); + } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + try { + connection = DriverManager.getConnection(url, user, password); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return connection; + } + + public static void Close() throws SQLException { + if (connection != null) { + connection.close(); + } + } +} diff --git a/src/model/dao/ScoreDAO.java b/src/model/dao/ScoreDAO.java new file mode 100644 index 0000000..e6cfe4d --- /dev/null +++ b/src/model/dao/ScoreDAO.java @@ -0,0 +1,160 @@ +package model.dao; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; + +import model.jeu.Score; + +public class ScoreDAO{ + public ScoreDAO(){ + Statement stmt = null; + String requete = "CREATE TABLE IF NOT EXISTS `Score` (" + + "`identifiant` int(11) NOT NULL AUTO_INCREMENT," + + "`pseudo` varchar(255) NOT NULL," + + "`score` int(11) DEFAULT NULL," + + "`temps` time DEFAULT NULL," + + "`thematique` varchar(255) NOT NULL," + + "`nbJoueurs` int(4) NOT NULL," + + "`modeJeu` varchar(255) NOT NULL," + + "`difficulte` varchar(255) NOT NULL," + + "`dateHeure` datetime NOT NULL," + + "PRIMARY KEY (`identifiant`)" + + ") ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;"; + try { + + Connection conn = ConnectionMySql.getConnection(); + stmt = conn.createStatement(); + stmt.executeUpdate(requete); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public List toList(int lim) { + + List scores = new ArrayList(); + + Statement stmt = null; + ResultSet rs = null; + try { + + Connection conn = ConnectionMySql.getConnection(); + stmt = conn.createStatement(); + String requete = "SELECT Identifiant, Pseudo, Score, Temps, Thematique, NbJoueurs, ModeJeu, Difficulte, DateHeure " + + "FROM Score ORDER BY nbJoueurs DESC, difficulte DESC, score DESC, Temps ASC LIMIT 0, "+lim+";"; + rs = stmt.executeQuery(requete); + while (rs.next()) { + Score score = new Score(); + score.setIdentifiant(rs.getInt("Identifiant")); + score.setPseudo(rs.getString("Pseudo")); + score.setScore(rs.getInt("Score")); + score.setTemps(rs.getTime("Temps")); + score.setThematique(rs.getString("Thematique")); + score.setNbJoueurs(rs.getInt("NbJoueurs")); + score.setModeJeu(rs.getString("ModeJeu")); + score.setDifficulte(rs.getInt("Difficulte")); + score.setDateHeure(rs.getDate("DateHeure")); + scores.add(score); + } + + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (stmt != null) { + stmt.close(); + } + + } catch (Exception e2) { + e2.printStackTrace(); + } + } + return scores; + } + + + public Score trouver(int id) { + + Score score = new Score(); + Statement stmt; + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + + Connection conn = ConnectionMySql.getConnection(); + + String requete = "SELECT Identifiant, Pseudo, Score, Temps, Thematique, NbJoueurs, ModeJeu, Difficulte, DateHeure " + + "FROM Score WHERE Identifiant = ?;"; + pstmt = conn.prepareStatement(requete); + pstmt.setLong(1, id); + + rs = pstmt.executeQuery(); + while (rs.next()) { + score.setIdentifiant(rs.getInt("Identifiant")); + score.setPseudo(rs.getString("Pseudo")); + score.setScore(rs.getInt("Score")); + score.setTemps(rs.getTime("Temps")); + score.setThematique(rs.getString("Thematique")); + score.setNbJoueurs(rs.getInt("NbJoueurs")); + score.setModeJeu(rs.getString("ModeJeu")); + score.setDifficulte(rs.getInt("Difficulte")); + score.setDateHeure(rs.getDate("DateHeure")); + } + + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (pstmt != null) { + pstmt.close(); + } + + } catch (Exception e2) { + e2.printStackTrace(); + } + } + return score; + } + + + public void ajouter(Score scr) { + + PreparedStatement pstmt = null; + try { + Connection conn = ConnectionMySql.getConnection(); + + String requete = "Insert Into Score(Pseudo, Score, Temps, Thematique, NbJoueurs, ModeJeu, Difficulte, DateHeure)" + + "VALUES(?, ?, ?, ?, ?, ?, ?, NOW())"; + + pstmt = conn.prepareStatement(requete); + + pstmt.setString(1, scr.getPseudo()); + pstmt.setInt(2, scr.getScore()); + pstmt.setTime(3, scr.getTemps()); + pstmt.setString(4, scr.getThematique()); + pstmt.setInt(5, scr.getNbJoueurs()); + pstmt.setString(6, scr.getModeJeu()); + pstmt.setInt(7, scr.getDifficulte()); + + pstmt.executeUpdate(); + + } catch (Exception e) { + e.printStackTrace(); + + } finally { + try { + if (pstmt != null) { + pstmt.close(); + } + + } catch (Exception e2) { + e2.printStackTrace(); + } + } + } +} + diff --git a/src/model/jeu/Association.java b/src/model/jeu/Association.java new file mode 100644 index 0000000..f231d31 --- /dev/null +++ b/src/model/jeu/Association.java @@ -0,0 +1,126 @@ +package model.jeu; + +import java.util.ArrayList; +import java.util.List; +/** + * Classe désignant une association. + * Elle associe les 3 cartes de la réaction, des caractéristiques, et une difficulté. + * @author Nicolas + * + * + */ +public class Association { + + private Carte carteProduit; + private Carte carteReactifSubstrat; + private Carte carteReaction; + private List caracteristiques = new ArrayList<>(); + private boolean trouvee = false; + private int difficulte; + /** + * + * @param carteProduit désigne la carte produit de l'association ou la carte de l'association présente dans le 1er paquet + * @param carteReactifSubstrat désigne la carte réactif + substrat de l'association ou la carte de l'associtaion présente dans le 2ème paquet + * @param carteReaction désigne la carte réacton de l'association ou la carte de l'assocition présente dans le 3eme paquet + * @param difficulte désigne la difficulté de l'association. Si la + */ + public Association(Carte carteProduit, Carte carteReactifSubstrat, Carte carteReaction, int difficulte) { + this.carteProduit = carteProduit; + this.carteReactifSubstrat = carteReactifSubstrat; + this.carteReaction = carteReaction; + this.difficulte = difficulte; + } + + @Override + public boolean equals(Object association) { + if (association == null) + return false; + if (association == this) + return true; + if (!(association instanceof Association)) + return false; + Association myAssociation = (Association) association; + if (this.carteReaction == null && this.difficulte == -1) + return (this.carteProduit.equals(myAssociation.getCarteProduit()) + && this.carteReactifSubstrat.equals(myAssociation.getCarteReactifSubstrat())); + else + return (this.carteProduit.equals(myAssociation.getCarteProduit()) + && this.carteReactifSubstrat.equals(myAssociation.getCarteReactifSubstrat()) + && this.carteReaction.equals(myAssociation.getCarteReaction())); + } + /** + * + * @param carteProduit + * @param carteReactifSubstrat + * @return retourne true si les 2 cartes désignées en paramètres sont associés à l'association, sinon false + */ + public boolean isAssociation(Carte carteProduit, Carte carteReactifSubstrat) { + return (this.carteProduit.equals(carteProduit) && this.carteReactifSubstrat.equals(carteReactifSubstrat)); + } + /** + * + * @return retourne true si l'assocition contient la caractérisque donnée en paramètre. + */ + public boolean containsCaracteristique(Caracteristique caracteristique) { + return caracteristiques.contains(caracteristique); + } + + @Override + public String toString() { + return "[" + carteProduit + ", " + carteReactifSubstrat + ", " + carteReaction + "]"; + } + /** + * Ajoute à l'association la caractérique donnée en paramètre. + */ + public void addCaracteristique(Caracteristique caracteristique) { + caracteristiques.add(caracteristique); + } + /** + * Supprime de l'association la caractérique donnée en paramètre. + */ + public void removeCaracteristique(int index) { + caracteristiques.remove(index); + } + /** + * Permet désigner une association comme "trouvée". Une fois trouvée, elle n'est plus consultable + */ + public void trouve() { + trouvee = true; + } + /** + * + * @return Retourne l'état de l'association : true si elle est trouvée, false si elle ne l'est pas + */ + public boolean isTrouvee() { + return trouvee; + } + /** + * + * @return Retourne la carteProduit de l'association + */ + public Carte getCarteProduit() { + return carteProduit; + } + /** + * + * @return Retourne la carteReactifSubstrat de l'association + */ + public Carte getCarteReactifSubstrat() { + return carteReactifSubstrat; + } + /** + * + * @return Retourne la carteReaction de l'association + */ + public Carte getCarteReaction() { + return carteReaction; + } + /** + * + * @return Retourne la difficulté de l'association + */ + public int getDifficulte() { + return difficulte; + } + +} diff --git a/src/model/jeu/Caracteristique.java b/src/model/jeu/Caracteristique.java new file mode 100644 index 0000000..fee4aaa --- /dev/null +++ b/src/model/jeu/Caracteristique.java @@ -0,0 +1,25 @@ +package model.jeu; +/** + * Classe représentant une caractéristique. + * Une caractéristique a simplement un nom. + * @author Nicolas + * + */ +public class Caracteristique { + + private String nom; + private String couleur; + /** + * + * @param nom Le nom de la caractéristique + */ + public Caracteristique(String nom) { + this.nom = nom; + } + + @Override + public String toString() { + return nom; + } + +} diff --git a/src/model/jeu/Carte.java b/src/model/jeu/Carte.java new file mode 100644 index 0000000..00a587e --- /dev/null +++ b/src/model/jeu/Carte.java @@ -0,0 +1,127 @@ +package model.jeu; + +import java.util.ArrayList; +import java.util.List; + +import model.jeu.interfaces.CarteListener; +import model.jeu.interfaces.JoueurListener; + +/** + * Désigne une carte. + * @author Nicolas + * + */ +public class Carte { + + private int indentifiant; + private String nom; + private String image = null; + private boolean trouvee = false; + private boolean retournee = false; + + private List listeners = new ArrayList<>(); + + public void addListener(CarteListener l) { + listeners.add(l); + } + public void removeListener() { + listeners.clear(); + } + public boolean listenersContains(CarteListener carteListener) { + return listeners.contains(carteListener); + } + + /** + * + * @param nom Le nom de la carte + * @param indentifiant L'identifiant de la carte + */ + public Carte(String nom, int indentifiant, String image) { + this.nom = nom; + this.indentifiant = indentifiant; + this.image = image; + } + /** + * + * @return Retourne l'identifiant de la carte + */ + public int getIdentifiant() { + return indentifiant; + } + /** + * + * @return Retourne le nom de la carte + */ + public String getNom() { + return nom; + } + /** + * + * @return Retourne true si les 2 cartes ont le meme identifiant, sinon false + */ + @Override + public boolean equals(Object carte){ + if (carte == null) return false; + if (carte == this) return true; + if (!(carte instanceof Carte))return false; + Carte myCarte = (Carte)carte; + return (this.indentifiant == myCarte.getIdentifiant()); + } + /** + * Passe la carte a l'état "trouvée" + */ + public void trouve() { + trouvee = true; + + for (CarteListener l : listeners) + l.trouve(this); + } + /** + * + * @return Retourne true si la carte fait partie d'une association trouvée, sinon false + */ + public Boolean isTrouvee() { + return trouvee; + } + /** + * Retourne la carte. + * Si elle est visible elle devient cachée, si elle est cachée elle devient visible. + */ + public void retourne() { + if (retournee) { + retournee = false; + } else { + retournee = true; + } + for (CarteListener l : listeners) + l.retourne(this); + } + /** + * + * @return true si la carte est retournée, false sinon. + */ + public Boolean isRetournee() { + return retournee; + } + + @Override + public String toString() { + String stateCarte = ""; + if (trouvee) + stateCarte = "X"; + else if (retournee) + stateCarte = "+"; + else + stateCarte = "-"; + return "["+stateCarte+"] "+nom; + } + + public void setImage(String image) { + this.image = image; + } + public String getImage() { + return image; + } + + +} \ No newline at end of file diff --git a/src/model/jeu/GestionnaireAssociations.java b/src/model/jeu/GestionnaireAssociations.java new file mode 100644 index 0000000..b3484c1 --- /dev/null +++ b/src/model/jeu/GestionnaireAssociations.java @@ -0,0 +1,75 @@ +package model.jeu; + +import java.util.ArrayList; +import java.util.List; +/** + * Permet la gestion d'une liste d'associations + * + * @author Nicolas + * + */ +public class GestionnaireAssociations { + + private List associations = new ArrayList<>(); + /** + * Ajoute l'association passé en paramètre à la liste du gestionnaire + */ + public void addAssociation(Association association) { + associations.add(association); + } + /** + * Supprime l'association passé en paramètre à la liste du gestionnaire + */ + public void removeAssociation(int index) { + associations.remove(index); + } + /** + * @return Retourne l'association se trouvant à l'index indiqué en paramètre + */ + public Association getAssociation(int index) { + return associations.get(index); + } + /** + * Réinitialise toutes les associations se trouvant dans le gestionnaire + */ + public void removeAll() { + associations.clear(); + } + /** + * @return Retourne le nombre d'associations se trouvant dans le gestionnaire + */ + public int getNbAssociations() { + return associations.size(); + } + /** + * @return Retourne la carte réaction de l'association qui correspond aux cartes passées en paramètre. S'il n'y a pas de réaction correspondant aux cartes passées en paramètre, retourne null. + */ + public Carte getReaction(Carte carteProduit, Carte carteReactifSubstrat) { + return getAssociation(new Association(carteProduit, carteReactifSubstrat, null, -1)).getCarteReaction(); + } + /** + * + * @return Retourne l'association Si elle est présente dans le gestionnaire, sinon retourne null. + */ + public Association getAssociation(Association association) { + int i = associations.indexOf(association); + if (i == -1) + return null; + else + return associations.get(i); + } + + @Override + public String toString() { + return associations.toString(); + } + /** + * Ajoute la caractéristique donnée en paramètre à l'association se trouvant à l'index donné en paramètre. + * @param index index de l'association + * @param caracteristique caractéristique à ajouter + */ + public void addCaracteristiqueToAssociation(int index, Caracteristique caracteristique) { + associations.get(index).addCaracteristique(caracteristique); + } + +} diff --git a/src/model/jeu/GestionnaireCaracteristiques.java b/src/model/jeu/GestionnaireCaracteristiques.java new file mode 100644 index 0000000..1a5029a --- /dev/null +++ b/src/model/jeu/GestionnaireCaracteristiques.java @@ -0,0 +1,44 @@ +package model.jeu; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +/** + * Gère une liste de caractéristiques + * @author Nicolas + * + */ +public class GestionnaireCaracteristiques { + + private List caracteristiques = new ArrayList<>(); + + public void addCaracteristique(Caracteristique caracteristique) { + caracteristiques.add(caracteristique); + } + + public void removeAll() { + caracteristiques.clear(); + } + + public Caracteristique getCaracteristique(int index) { + return caracteristiques.get(index); + } + + public int getNbCaracteristiques() { + return caracteristiques.size(); + } + + @Override + public String toString() { + String rtrString = ""; + for (int i = 0;i joueurs = new ArrayList<>(); + private Joueur joueurActuel; + private int indexJoueurActuel; + + private long temps = 0; + + private List listeners = new ArrayList<>(); + + public void addListener(JoueursListener l) { + listeners.add(l); + } + public void removeListener() { + listeners.clear(); + } + + /** + * Permet l'ajout de joueurs jusqu'à une maximum de 4 + * @return Retourne true si la joueur à été ajouté, false sinon + */ + public boolean addJoueur(Joueur joueur) { + if (joueurs.size() < 4) { + joueurs.add(joueur); + joueur.addListener(new JoueurListener() { + @Override + public void tempsChange(long temps) { + for (JoueursListener l : listeners) + for (int i = 0;i getJoueurs(){ + return joueurs; + } + + public int nombreJoueurs() { + return joueurs.size(); + } + /** + * + * @return Retourne le joueur actuel + */ + public Joueur getJoueurActuel() { + return joueurActuel; + } + + public int getIndexJoueurActuel() { + for (int i = 0;i=joueurs.size()) + indexJoueurActuel = 0; + joueurActuel = joueurs.get(indexJoueurActuel); + + for (JoueursListener l : listeners) + l.joueurActuelChange(indexJoueurActuel); + + } + + public void resetJoueurs() { + for(int i = 0;i cartes = new ArrayList<>(); + + private List listeners = new ArrayList<>(); + private List Carteslisteners = new ArrayList<>(); + + public void addListener(CartesListener l) { + listeners.add(l); + } + public void removeListener() { + listeners.clear(); + } + + /** + * Ajoute une carte au groupe + */ + public void addCarte(Carte carte) { + cartes.add(carte); + carte.addListener(new CarteListener() { + @Override + public void trouve(Carte carte) { + for (CartesListener l : listeners) + for (int i = 0;i caracteristiques; + private Association associationTrouvee = null; + + //!\\ CONSTRUCTEUR //!\\ + public Jeu() { + thematique = new Thematique(this); + } + + /** + * Initialise la partie : + * - Initialise tous les scores et temps de chaque joueurs + * - Charge les thématiques + * - Mélange les groupes des cartes + */ + public void initialiserPartie() { + + carteProduitSelectionnee = null; + carteReactifSubstratSelectionne = null; + carteReactionSelectionne = null; + + getGestionnaireJoueurs().resetJoueurs(); + getGestionnaireJoueurs().setJoueurActuel(getGestionnaireJoueurs().getJoueur((int)(getGestionnaireJoueurs().nombreJoueurs() * Math.random()))); + getThematique().loadThematique(); + + getCartesProduit().shuffle(); + getCartesReactifSubstrat().shuffle(); + getCartesReaction().shuffle(); + //getGestionnaireCaracteristiques().shuffle(); + } + /** + * Déroulement de la partie, jusqu'à ce que chaque association soit trouvée + */ + + + + /** + * mode console + */ + public void parseCaracteristiques(String st) { + caracteristiques = new ArrayList<>(); + st = st.replace(" ", ""); + String[] ss = st.split(","); + for(int i = 0;i=0 &&Integer.parseInt(ss[i])=0 && difficulte<=3) + this.difficulte = difficulte; + } + + /* + * ROUND + */ + /** + * Mode Console + * Permet la sélection de la carte Produit + * @param index Index de la carte dans le groupe + * @return Retourne true si une carte est sélectionnée, false sinon + */ + public boolean selectionneCarteProduit(int index) { + if (index < 0 || index >= cartesProduit.nombreCarte()) + return false; + if (cartesProduit.getCarte(index).isTrouvee()) + return false; + carteProduitSelectionnee = cartesProduit.getCarte(index); + carteProduitSelectionnee.retourne(); + return true; + } + /** + * Mode Console + * Permet la sélection de la carte Réactif + Substrat + * @param index Index de la carte dans le groupe + * @return Retourne true si une carte est sélectionnée, false sinon + */ + public boolean selectionneCarteReactifSubstrat(int index) { + if (index < 0 || index >= cartesReactifSubstrat.nombreCarte()) + return false; + if (cartesReactifSubstrat.getCarte(index).isTrouvee()) + return false; + carteReactifSubstratSelectionne = cartesReactifSubstrat.getCarte(index); + carteReactifSubstratSelectionne.retourne(); + return true; + } + /** + * Mode Console + * Permet la sélection de la carte Réaction + * @param index Index de la carte dans le groupe + * @return Retourne true si une carte est sélectionnée, false sinon + */ + public boolean selectionneCarteReaction(int index) { + if (index < -1 || index >= cartesReaction.nombreCarte()) + return false; + + if (carteProduitSelectionnee == null || carteReactifSubstratSelectionne == null) + return false; + + if (index == -1) { + carteReactionSelectionne = null; + } else { + if (cartesReaction.getCarte(index).isTrouvee()) + return false; + carteReactionSelectionne = cartesReaction.getCarte(index); + carteReactionSelectionne.retourne(); + } + return true; + } + /** + * Verifie les cartes sélectionnée. + * Attribue des points au joueur actuel si une association est trouvée. + * Retire des points si une carte Réaction est sélectionné et qu'aucune association ne correspond. + * @return Retourne l'association si une association est trouvée, null sinon. + */ + public Association verifieSelection() { + Association associationReel = getGestionnaireAssociations() + .getAssociation( + new Association( + carteProduitSelectionnee, + carteReactifSubstratSelectionne, null, -1)); + if (associationReel == null && carteReactionSelectionne != null) { + getGestionnaireJoueurs().getJoueurActuel().ajouterPoint(-25); + carteProduitSelectionnee.retourne(); + carteReactifSubstratSelectionne.retourne(); + + carteReactionSelectionne.retourne(); + getGestionnaireJoueurs().joueurSuivant(); + carteProduitSelectionnee = null; + carteReactifSubstratSelectionne = null; + carteReactionSelectionne = null; + return null; + } else if (associationReel != null && carteReactionSelectionne != null + && carteReactionSelectionne.equals(associationReel.getCarteReaction()) && associationReel.isTrouvee() == false) { + carteProduitSelectionnee.trouve(); + carteReactifSubstratSelectionne.trouve(); + carteReactionSelectionne.trouve(); + getGestionnaireJoueurs().getJoueurActuel().ajouterPoint(100); + return associationReel; + } else { + carteProduitSelectionnee.retourne(); + carteReactifSubstratSelectionne.retourne(); + if (carteReactionSelectionne != null) + carteReactionSelectionne.retourne(); + getGestionnaireJoueurs().joueurSuivant(); + carteProduitSelectionnee = null; + carteReactifSubstratSelectionne = null; + carteReactionSelectionne = null; + return null; + } + } + /** + * + * @param association L'association où les caractéristiques sont vérifiées + * @param caracteristiques Liste de caractériques à vérifier + * @return Retourne le nombre de points supplémentaire (+10 par caractéristiques correspondantes et -10 par caractérisques qui ne correspondent pas. + */ + public int verifieCaracteristiques(Association association, List caracteristiques) { + int points = 0; + for(Caracteristique caracteristique : caracteristiques) { + if (association.containsCaracteristique(caracteristique)) + points += pointCaracteristiqueTrouvee; + else + points -= pointCaracteristiqueTrouvee; + } + gestionnaireJoueurs.getJoueurActuel().ajouterPoint(points); + carteProduitSelectionnee = null; + carteReactifSubstratSelectionne = null; + carteReactionSelectionne = null; + return points; + } + + /** + * Ne fonctionne PAS, a voir avec l'interface + * Affiche le tableau des scores et donne le vainqueur + */ + public void terminerPartie() { + vainqueur(); // a voir avec interface + } + + /** + * NE fonctionne pas + * a voir avec l'nterface + * @return Retourne la liste des vainqueurs (il peut y en avoir plusieurs) + */ + public Joueur vainqueur() { + int min = Integer.MAX_VALUE; + int meilleurScore = meilleurScore(); + Joueur vainqueur=null; + for (Joueur joueur : gestionnaireJoueurs.getJoueurs()) + if (min > joueur.getTemps() && joueur.getPoints() == meilleurScore) + vainqueur=joueur; + + return vainqueur; + + } + + /** + * Calcule le meilleur score actuel de la partie + * @return Retourne le meilleur score + */ + public int meilleurScore(){ + int max = Integer.MIN_VALUE; + + for (Joueur joueur : gestionnaireJoueurs.getJoueurs()) + if (max < joueur.getPoints()) + max = joueur.getPoints(); + + + return max; + } + + public Carte getCarteProduitSelectionnee() { + return carteProduitSelectionnee; + } + + public Carte getCarteReactifSubstratSelectionne() { + return carteReactifSubstratSelectionne; + } + + public Carte getCarteReactionSelectionne() { + return carteReactionSelectionne; + } + + public List classement() { + ArrayList lesJoueurs= new ArrayList(this.gestionnaireJoueurs.getJoueurs()); + Collections.sort(lesJoueurs); + return lesJoueurs; + } + +} diff --git a/src/model/jeu/Joueur.java b/src/model/jeu/Joueur.java new file mode 100644 index 0000000..7098568 --- /dev/null +++ b/src/model/jeu/Joueur.java @@ -0,0 +1,82 @@ +package model.jeu; + +import java.util.ArrayList; +import java.util.List; + +import model.jeu.interfaces.CarteListener; +import model.jeu.interfaces.JoueurListener; +import model.jeu.interfaces.JoueursListener; + +public class Joueur implements Comparable { + + private int points; + private long temps; + private String pseudo; + + private List listeners = new ArrayList<>(); + + public void addListener(JoueurListener l) { + listeners.add(l); + } + public void removeListener() { + listeners.clear(); + } + public boolean listenersContains(JoueurListener joueurListener) { + return listeners.contains(joueurListener); + } + + public Joueur(String pseudo) { + this.pseudo = pseudo; + points = 0; + temps = 0; + } + /** + * reinitialise le temps et le score du joueur + */ + public void resetJoueur() { + points = 0; + temps = 0; + } + + public String getPseudo() { + return pseudo; + } + + public void setPseudo(String pseudo) { + this.pseudo = pseudo; + } + + public int getPoints() { + return points; + } + + public long getTemps() { + return temps; + } + + public void ajouterPoint(int points) { + + this.points += points; + + for (JoueurListener l : listeners) + l.pointsChange(this.points); + } + public void ajouterTemps(long temps) { + this.temps += temps; + for (JoueurListener l : listeners) + l.tempsChange(this.temps); + } + + @Override + public String toString() { + return pseudo+" ("+points+" points)"; + } + + @Override + public int compareTo(Joueur joueur) { + if(this.getPoints() == joueur.getPoints()) + return (int) (joueur.getTemps() - this.getTemps()); + return this.getPoints() - joueur.getPoints(); + } + +} \ No newline at end of file diff --git a/src/model/jeu/Option.java b/src/model/jeu/Option.java new file mode 100644 index 0000000..416b8c7 --- /dev/null +++ b/src/model/jeu/Option.java @@ -0,0 +1,223 @@ +package model.jeu; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.StringTokenizer; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Result; +import javax.xml.transform.Source; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.dom.bootstrap.DOMImplementationRegistry; +import org.w3c.dom.ls.DOMImplementationLS; +import org.w3c.dom.ls.LSOutput; +import org.w3c.dom.ls.LSSerializer; + +import model.dao.ConnectionMySql; +import ui.StylingUI; + +public class Option { + private String thematiqueDefaut; + private Boolean son; + private Boolean tutoriel; + private int volumeMusique; + private int volumeSon; + private String resolution; + private String urlBDD; + private String user; + private String password; + + + String[] resolutions = {"2560x1440","1920*1080","1680x1050","1600x900","1440x900","1366x768","1280x1024","1280x800","1280x720 ","1024x768"}; + + public Option() { + load(); + } + + public void load() { + try { + + File fXmlFile = new File("options.xml"); + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + Document doc = dBuilder.parse(fXmlFile); + doc.getDocumentElement().normalize(); + + NodeList option; + option = doc.getElementsByTagName("thematiqueDefaut"); + this.thematiqueDefaut = option.item(0).getTextContent(); + + NodeList resolution; + resolution = doc.getElementsByTagName("resolution"); + this.resolution = resolution.item(0).getTextContent(); + StringTokenizer resol = new StringTokenizer(this.resolution, "x"); + StylingUI.windowsWidth = Integer.parseInt(resol.nextToken()); + StylingUI.windowsHeight = Integer.parseInt(resol.nextToken()); + + NodeList urlBDD; + urlBDD = doc.getElementsByTagName("urlBDD"); + this.urlBDD = urlBDD.item(0).getTextContent(); + ConnectionMySql.url = this.urlBDD; + + NodeList user; + user = doc.getElementsByTagName("user"); + this.user = user.item(0).getTextContent(); + ConnectionMySql.user = this.user; + + NodeList password; + password = doc.getElementsByTagName("password"); + this.password = password.item(0).getTextContent(); + ConnectionMySql.password = this.password; + + } catch (Exception e) { + e.printStackTrace(); + } + + } + + public String getUrlBDD() { + return urlBDD; + } + + public void setUrlBDD(String urlBDD) { + this.urlBDD = urlBDD; + } + + public String getUser() { + return user; + } + + public void setUser(String user) { + this.user = user; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getThematiqueDefaut() { + return thematiqueDefaut; + } + + public void save() { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = null; + try { + builder = factory.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + Document document = builder.newDocument(); + Element options = document.createElement("Options"); + document.appendChild(options); + + Node node; + + node = document.createElement("thematiqueDefaut"); + node.setTextContent(thematiqueDefaut); + options.appendChild(node); + + node = document.createElement("resolution"); + node.setTextContent(resolution); + options.appendChild(node); + + node = document.createElement("urlBDD"); + node.setTextContent(urlBDD); + options.appendChild(node); + + node = document.createElement("user"); + node.setTextContent(user); + options.appendChild(node); + + node = document.createElement("password"); + node.setTextContent(password); + options.appendChild(node); + + DomSerializer serializer = new DomSerializer(document); + try { + serializer.serialize("options.xml"); + } catch (ClassCastException | ClassNotFoundException | InstantiationException | IllegalAccessException + | IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + public void setThematiqueDefaut(String thematiqueDefaut) { + this.thematiqueDefaut = thematiqueDefaut; + } + + public void setResolution(String string) { + this.resolution = string; + + } + + public String getResolution() { + return resolution; + } + + public String[] getResolutionsDisponibles() { + return resolutions; + } +} + +class DomSerializer { + + private Document document; + + public DomSerializer(Document document) { + super(); + this.document = document; + } + + public void serialize(String filename) throws IOException, ClassCastException, ClassNotFoundException, + InstantiationException, IllegalAccessException { + + // teste la compatibilité DOM3 + DOMImplementationLS implLS = null; + if (document.getImplementation().hasFeature("LS", "3.0")) { + implLS = (DOMImplementationLS) document.getImplementation(); + } else { + DOMImplementationRegistry implementation = DOMImplementationRegistry.newInstance(); + implLS = (DOMImplementationLS) implementation.getDOMImplementation("LS 3.0"); + } + if (implLS == null) { + System.out.println("API DOM Load and Save non supportée"); + return; + } + + // Ecriture du document + LSSerializer serializer = implLS.createLSSerializer(); + LSOutput output = implLS.createLSOutput(); + FileOutputStream writer = new FileOutputStream(filename); + output.setByteStream(writer); + serializer.getDomConfig().setParameter("format-pretty-print", true); + serializer.write(document, output); + } + + @SuppressWarnings("unused") + private void __test_serialize() throws TransformerException { + Transformer transformer = TransformerFactory.newInstance().newTransformer(); + Result output = new StreamResult(new File("output.xml")); + Source input = new DOMSource(this.document); + + transformer.transform(input, output); + } +} diff --git a/src/model/jeu/Score.java b/src/model/jeu/Score.java new file mode 100644 index 0000000..8bee280 --- /dev/null +++ b/src/model/jeu/Score.java @@ -0,0 +1,90 @@ +package model.jeu; + +import java.sql.Date; +import java.sql.Time; + +public class Score { + + private int identifiant; + private String pseudo; + private int score; + private Time temps; + private String thematique; + private int nbJoueurs; + private String modeJeu; + private int difficulte; + private Date dateHeure; + + public int getIdentifiant() { + return this.identifiant; + } + + public void setIdentifiant(int identifiant) { + this.identifiant = identifiant; + } + + public String getPseudo() { + return this.pseudo; + } + + public void setPseudo(String pseudo) { + this.pseudo = pseudo; + } + + public int getScore() { + return this.score; + } + + public void setScore(int score) { + this.score = score; + } + + public Time getTemps() { + return this.temps; + } + + public void setTemps(Time temps) { + this.temps = temps; + } + + public String getThematique() { + return this.thematique; + } + + public void setThematique(String thematique) { + this.thematique = thematique; + } + + public int getNbJoueurs() { + return this.nbJoueurs; + } + + public void setNbJoueurs(int nbJoueurs) { + this.nbJoueurs = nbJoueurs; + } + + public String getModeJeu() { + return this.modeJeu; + } + + public void setModeJeu(String modeJeu) { + this.modeJeu = modeJeu; + } + + public int getDifficulte() { + return this.difficulte; + } + + public void setDifficulte(int difficulte) { + this.difficulte = difficulte; + } + + public Date getDateHeure() { + return this.dateHeure; + } + + public void setDateHeure(Date dateHeure) { + this.dateHeure = dateHeure; + } + +} diff --git a/src/model/jeu/Thematique.java b/src/model/jeu/Thematique.java new file mode 100644 index 0000000..b0a3552 --- /dev/null +++ b/src/model/jeu/Thematique.java @@ -0,0 +1,157 @@ +package model.jeu; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import model.jeu.Association; +import model.jeu.Caracteristique; +import model.jeu.Carte; +import model.jeu.Jeu; + +public class Thematique { + + private Jeu jeu; + private String thematiqueActuel; + private List thematiques = new ArrayList<>(); + + public Thematique(Jeu jeu) { + this.jeu = jeu; + } + + public void setThematiqueActuel(String thematiqueActuel) { + this.thematiqueActuel = thematiqueActuel; + } + + public String getThematiqueActuel() { + return thematiqueActuel; + } + + public void loadThematique() { + + this.thematiqueActuel = thematiqueActuel; + + resetThematique(); + + try { + + File fXmlFile = new File("thematiques/" + thematiqueActuel + "/"+thematiqueActuel+".xml"); + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + Document doc = dBuilder.parse(fXmlFile); + doc.getDocumentElement().normalize(); + + HashMap cartesMap = new HashMap(); + + NodeList cartes = doc.getElementsByTagName("cartes").item(0).getChildNodes(); + + for (int temp = 0; temp < cartes.getLength(); temp++) { + Node nNode = cartes.item(temp); + if (nNode.getNodeType() == Node.ELEMENT_NODE) { + Element eElement = (Element) nNode; + cartesMap.put(eElement.getAttribute("id"), + new Carte(eElement.getTextContent(), Integer.parseInt(eElement.getAttribute("id")), eElement.getAttribute("img"))); + } + } + + NodeList caracteristiques = doc.getElementsByTagName("caracteristiques").item(0).getChildNodes(); + ; + + for (int temp = 0; temp < caracteristiques.getLength(); temp++) { + Node nNode = caracteristiques.item(temp); + if (nNode.getNodeType() == Node.ELEMENT_NODE) { + Element eElement = (Element) nNode; + jeu.getGestionnaireCaracteristiques() + .addCaracteristique(new Caracteristique(eElement.getTextContent())); + } + } + + NodeList associations = doc.getElementsByTagName("association"); + + for (int temp = 0; temp < associations.getLength(); temp++) { + Node nNode = associations.item(temp); + if (nNode.getNodeType() == Node.ELEMENT_NODE) { + Element eElement = (Element) nNode; + if (Integer.parseInt(eElement.getAttribute("difficulte")) <= jeu.getDifficulte() || jeu.getDifficulte() == 0) { + jeu.getCartesProduit() + .addCarte(new Carte(cartesMap.get(eElement.getAttribute("produit")).getNom(), + cartesMap.get(eElement.getAttribute("produit")).getIdentifiant(), + cartesMap.get(eElement.getAttribute("produit")).getImage() + )); + jeu.getCartesReactifSubstrat() + .addCarte(new Carte(cartesMap.get(eElement.getAttribute("reactifSubstrat")).getNom(), + cartesMap.get(eElement.getAttribute("reactifSubstrat")).getIdentifiant(), + cartesMap.get(eElement.getAttribute("reactifSubstrat")).getImage() + )); + jeu.getCartesReaction() + .addCarte(new Carte(cartesMap.get(eElement.getAttribute("reaction")).getNom(), + cartesMap.get(eElement.getAttribute("reaction")).getIdentifiant(), + cartesMap.get(eElement.getAttribute("reaction")).getImage() + )); + + jeu.getGestionnaireAssociations() + .addAssociation(new Association( + jeu.getCartesProduit().getCarte(jeu.getCartesProduit().nombreCarte() - 1), + jeu.getCartesReactifSubstrat() + .getCarte(jeu.getCartesReactifSubstrat().nombreCarte() - 1), + jeu.getCartesReaction().getCarte(jeu.getCartesReaction().nombreCarte() - 1), + Integer.parseInt(eElement.getAttribute("difficulte")))); + + NodeList caracteristiquesOfAssociation = eElement.getElementsByTagName("caracteristique"); + for (int tempa = 0; tempa < caracteristiquesOfAssociation.getLength(); tempa++) { + Node nNodea = caracteristiquesOfAssociation.item(tempa); + if (nNodea.getNodeType() == Node.ELEMENT_NODE) { + Element eElementa = (Element) nNodea; + jeu.getGestionnaireAssociations() + .getAssociation(jeu.getGestionnaireAssociations().getNbAssociations() - 1) + .addCaracteristique(jeu.getGestionnaireCaracteristiques() + .getCaracteristique(Integer.parseInt(eElementa.getTextContent()))); + } + } + + } + + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void resetThematique() { + jeu.getGestionnaireAssociations().removeAll(); + jeu.getGestionnaireCaracteristiques().removeAll(); + jeu.getCartesProduit().removeAll(); + jeu.getCartesReactifSubstrat().removeAll(); + jeu.getCartesReaction().removeAll(); + } + + public void listeThematique() { + File folder = new File("thematiques"); + File[] listOfFiles = folder.listFiles(); + thematiques.clear(); + for (int i = 0; i < listOfFiles.length; i++) { + if (listOfFiles[i].isDirectory()) { + thematiques.add(listOfFiles[i].getName()); + } + } + } + + public int nbThematique() { + return thematiques.size(); + } + + public String getThematique(int index) { + return thematiques.get(index); + } + +} diff --git a/src/model/jeu/interfaces/CarteListener.java b/src/model/jeu/interfaces/CarteListener.java new file mode 100644 index 0000000..437dcc1 --- /dev/null +++ b/src/model/jeu/interfaces/CarteListener.java @@ -0,0 +1,11 @@ +package model.jeu.interfaces; + +import model.jeu.Carte; + +public interface CarteListener { + + public void retourne(Carte carte); + + public void trouve(Carte carte); + +} diff --git a/src/model/jeu/interfaces/CartesListener.java b/src/model/jeu/interfaces/CartesListener.java new file mode 100644 index 0000000..669559a --- /dev/null +++ b/src/model/jeu/interfaces/CartesListener.java @@ -0,0 +1,11 @@ +package model.jeu.interfaces; + +import model.jeu.Carte; + +public interface CartesListener { + + public void retourne(int index, Carte carte); + + public void trouve(int index, Carte carte); + +} diff --git a/src/model/jeu/interfaces/JoueurListener.java b/src/model/jeu/interfaces/JoueurListener.java new file mode 100644 index 0000000..61e0a37 --- /dev/null +++ b/src/model/jeu/interfaces/JoueurListener.java @@ -0,0 +1,9 @@ +package model.jeu.interfaces; + +public interface JoueurListener { + + public void pointsChange(int points); + + public void tempsChange(long temps); + +} diff --git a/src/model/jeu/interfaces/JoueursListener.java b/src/model/jeu/interfaces/JoueursListener.java new file mode 100644 index 0000000..d6dc962 --- /dev/null +++ b/src/model/jeu/interfaces/JoueursListener.java @@ -0,0 +1,10 @@ +package model.jeu.interfaces; + +public interface JoueursListener { + + public void joueurActuelChange(int indexJoueur); + + public void pointsJoueurChange(int indexJoueur, int points); + + public void tempsJoueurChange(int indexJoueur, long temps); +} diff --git a/src/ui/SingleMouseClickSelectList.java b/src/ui/SingleMouseClickSelectList.java new file mode 100644 index 0000000..ddf1e5d --- /dev/null +++ b/src/ui/SingleMouseClickSelectList.java @@ -0,0 +1,54 @@ +package ui; + +import java.awt.Toolkit; +import java.awt.event.MouseEvent; + +import javax.swing.JList; +import javax.swing.ListModel; + +public class SingleMouseClickSelectList extends JList { + + public SingleMouseClickSelectList(ListModel model) { + super(model); + } + + @Override + public void updateUI() { + setForeground(null); + setBackground(null); + setSelectionForeground(null); + setSelectionBackground(null); + super.updateUI(); + } + + @Override + public void processMouseMotionEvent(MouseEvent e) { + super.processMouseMotionEvent(convertMouseEvent(e)); + } + + @Override + public void processMouseEvent(MouseEvent e) { + if (e.getID() == MouseEvent.MOUSE_ENTERED || e.getID() == MouseEvent.MOUSE_EXITED) { + super.processMouseEvent(e); + } else { + if (getCellBounds(0, getModel().getSize() - 1).contains(e.getPoint())) { + super.processMouseEvent(convertMouseEvent(e)); + } else { + e.consume(); + requestFocusInWindow(); + } + } + } + + private MouseEvent convertMouseEvent(MouseEvent e) { + return new MouseEvent( + e.getComponent(), + e.getID(), e.getWhen(), + e.getModifiers() | Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), + e.getX(), e.getY(), + e.getXOnScreen(), e.getYOnScreen(), + e.getClickCount(), + e.isPopupTrigger(), + e.getButton()); + } +} diff --git a/src/ui/StylingUI.java b/src/ui/StylingUI.java new file mode 100644 index 0000000..7b8fd13 --- /dev/null +++ b/src/ui/StylingUI.java @@ -0,0 +1,161 @@ +package ui; + + +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.GridBagLayout; + +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTable; +import javax.swing.JTextField; +import javax.swing.border.Border; +import javax.swing.border.CompoundBorder; +import javax.swing.border.EmptyBorder; +import javax.swing.border.LineBorder; + +public class StylingUI { + + public static int windowsWidth = 1300; + public static int windowsHeight = 800; + //public final static int windowsWidth = 1100; + //public final static int windowsHeight = 650; + public final static Color blue = new Color(52, 152, 219); + public final static Color gray = new Color(236, 240, 241); + + public final static Color reactifSubstratCouleur = new Color(228, 196, 196); + public final static Color produitCouleur = new Color(196, 225, 228); + public final static Color reactionCouleur = new Color(196, 228, 197); + + public static void buttonStyle(JButton button) { + + button.setForeground(Color.WHITE); + button.setBackground(blue); + button.setBorderPainted(false); + button.setFocusPainted(false); + Border line = new LineBorder(Color.BLACK); + Border margin = new EmptyBorder(5, 15, 5, 15); + Border compound = new CompoundBorder(line, margin); + button.setBorder(compound); + button.setFont(new Font("Haettenschweiler", Font.PLAIN, 35)); + + } + + public static void buttonStyleSmall(JButton button) { + + button.setForeground(Color.WHITE); + button.setBackground(blue); + button.setBorderPainted(false); + button.setFocusPainted(false); + Border line = new LineBorder(Color.BLACK); + Border margin = new EmptyBorder(2, 10, 2, 10); + Border compound = new CompoundBorder(line, margin); + button.setBorder(compound); + button.setFont(new Font("Haettenschweiler", Font.PLAIN, 25)); + + } + + public static void seeMoreButtonStyle(JButton button) { + + button.setForeground(Color.BLACK); + button.setBackground(StylingUI.gray); + button.setBorderPainted(false); + button.setFocusPainted(false); + Border line = new LineBorder(Color.BLACK); + Border margin = new EmptyBorder(0, 0, 0, 0); + Border compound = new CompoundBorder(line, margin); + button.setBorder(null); + button.setFont(new Font("Dialog", Font.PLAIN, 20)); + + } + + public static void arButtonStyle(JButton button) { + + button.setForeground(Color.WHITE); + button.setBackground(blue); + button.setBorderPainted(false); + button.setFocusPainted(false); + button.setPreferredSize(new Dimension(30, 30)); + button.setBorder(null); + button.setFont(new Font("Haettenschweiler", Font.PLAIN, 20)); + + } + + + + + + public static void panelStyle(JPanel panel) { + + panel.setBackground(StylingUI.gray); + ((FlowLayout) panel.getLayout()).setVgap(0); + panel.setPreferredSize(new Dimension(StylingUI.windowsWidth, StylingUI.windowsHeight)); + panel.setBounds(0, 0, StylingUI.windowsWidth, StylingUI.windowsHeight); + + } + + public static void contentPanelStyle(JPanel panel) { + + panel.setBackground(StylingUI.gray); + panel.setPreferredSize(new Dimension(StylingUI.windowsWidth / 2, StylingUI.windowsHeight)); + panel.setBounds(0, 0, StylingUI.windowsWidth / 2, StylingUI.windowsHeight); + panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); + //panel.setLayout(new FlowLayout()); + } + + + + + public static void tableStyle(JTable table) { + + table.setBackground(StylingUI.gray); + table.setRowHeight(25); + table.getTableHeader().setBackground(StylingUI.gray); + table.setShowGrid(false); + table.setAlignmentX(Component.LEFT_ALIGNMENT); + table.getTableHeader().setAlignmentX(Component.LEFT_ALIGNMENT); + + } + + + + + public static void titleLabelStyle(JLabel label) { + + label.setFont(new Font("Haettenschweiler", Font.PLAIN, 55)); + + } + + public static void subtitleLabelStyle(JLabel label) { + + label.setFont(new Font("Haettenschweiler", Font.PLAIN, 35)); + + } + + public static void labelStyle(JLabel label) { + + label.setFont(new Font("Haettenschweiler", Font.PLAIN, 25)); + + } + + public static void carteStyle(JLabel label) { + + label.setFont(new Font("Arial", Font.PLAIN, 8)); + + } + + public static void jTextFieldStyle(JTextField jtf){ + jtf.setFont(new Font("Arial", Font.PLAIN, 14)); + } + public static void carteStyleCentre(JLabel label) { + + label.setFont(new Font("Arial", Font.PLAIN, 12)); + + } + +} diff --git a/src/view/AccueilPanel.java b/src/view/AccueilPanel.java new file mode 100644 index 0000000..8cf9743 --- /dev/null +++ b/src/view/AccueilPanel.java @@ -0,0 +1,160 @@ +package view; + +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Image; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.FileInputStream; +import java.io.IOException; + +import javax.imageio.ImageIO; +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.UIManager; + +import controller.PanelController; +import model.ModelTableClassement; +import ui.StylingUI; + +public class AccueilPanel extends JPanel { + + //private PanelController panelController; + + private JPanel contentPanel; + private JButton optionsJeuButton; + private JButton optionsButton; + private JButton classementButton; + private JLabel titreLabel; + private JLabel classementLabel; + private JTable scoreTable; + + //public AccueilPanel(PanelController panelController) { + public AccueilPanel() { + + //this.panelController = panelController; + StylingUI.panelStyle(this); + initComponents(); + + } + + private void initComponents() { + + + + contentPanel = new JPanel(); + StylingUI.contentPanelStyle(contentPanel); + + titreLabel = new JLabel("CHIM'ORY"); + classementLabel = new JLabel("CLASSEMENT"); + + StylingUI.titleLabelStyle(titreLabel); + StylingUI.subtitleLabelStyle(classementLabel); + + StylingUI.buttonStyle(optionsJeuButton = new JButton("JOUER")); + StylingUI.buttonStyle(optionsButton = new JButton("OPTIONS")); + StylingUI.seeMoreButtonStyle(classementButton = new JButton("+")); + + try { + Image img = ImageIO.read(new FileInputStream("ico/gamew.png")); + img = img.getScaledInstance(35, 35, Image.SCALE_DEFAULT); + optionsJeuButton.setIcon(new ImageIcon(img)); + } catch (IOException e) { + e.printStackTrace(); + } + + try { + Image img = ImageIO.read(new FileInputStream("ico/gearw.png")); + img = img.getScaledInstance(30, 30, Image.SCALE_DEFAULT); + optionsButton.setIcon(new ImageIcon(img)); + } catch (IOException e) { + e.printStackTrace(); + } + + try { + Image img = ImageIO.read(new FileInputStream("ico/web.png")); + img = img.getScaledInstance(30, 30, Image.SCALE_DEFAULT); + classementLabel.setIcon(new ImageIcon(img)); + } catch (IOException e) { + e.printStackTrace(); + } + scoreTable = new JTable(); + scoreTable.setModel(new ModelTableClassement(10)); + System.out.println(scoreTable.getModel().getRowCount() +" test"); + StylingUI.tableStyle(scoreTable); + + optionsJeuButton.setMaximumSize(new Dimension(Integer.MAX_VALUE, optionsJeuButton.getMinimumSize().height)); + optionsButton.setMaximumSize(new Dimension(Integer.MAX_VALUE, optionsButton.getMinimumSize().height)); + classementButton.setMaximumSize(new Dimension(Integer.MAX_VALUE, classementButton.getMinimumSize().height)); + + contentPanel.add(Box.createRigidArea(new Dimension(0, 10))); + contentPanel.add(titreLabel); + contentPanel.add(Box.createRigidArea(new Dimension(0, 10))); + contentPanel.add(optionsJeuButton); + contentPanel.add(Box.createRigidArea(new Dimension(0, 10))); + contentPanel.add(optionsButton); + contentPanel.add(Box.createRigidArea(new Dimension(0, 10))); + contentPanel.add(classementLabel); + contentPanel.add(Box.createRigidArea(new Dimension(0, 5))); + contentPanel.add(scoreTable.getTableHeader()); + contentPanel.add(scoreTable); + contentPanel.add(classementButton); + + this.add(contentPanel); + + /* + optionsJeuButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + panelController.changeView(Panels.OPTIONS_JEU); + } + }); + + optionsButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + panelController.changeView(Panels.OPTIONS); + } + }); + + classementButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + panelController.changeView(Panels.CLASSEMENT); + } + }); + */ + + } + + + public JTable getScoreTable() { + return scoreTable; + } + + public void addButtonListener(ActionListener listener) { + optionsJeuButton.addActionListener(listener); + optionsButton.addActionListener(listener); + classementButton.addActionListener(listener); + } + + public JButton getOptionsJeuButton() { + return optionsJeuButton; + } + public JButton getOptionsButton() { + return optionsButton; + } + public JButton getClassementButton() { + return classementButton; + } + + + +} diff --git a/src/view/ClassementPanel.java b/src/view/ClassementPanel.java new file mode 100644 index 0000000..36e80c2 --- /dev/null +++ b/src/view/ClassementPanel.java @@ -0,0 +1,119 @@ +package view; + +import java.awt.Button; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; + +import controller.PanelController; +import ui.StylingUI; + +public class ClassementPanel extends JPanel { + + //private PanelController panelController; + + private JPanel contentPanel; + private JButton accueilButton; + private JLabel titreLabel; + private JLabel filtresLabel; + + private GridBagConstraints c; + private JLabel thematiqueLabel; + private JLabel nombreJoueursLabel; + private JComboBox thematiqueComboBox; + private JComboBox nombreJoueursComboBox; + + private JTable scoreTable; + + //public ClassementPanel(PanelController panelController) { + public ClassementPanel() { + + //this.panelController = panelController; + StylingUI.panelStyle(this); + initComponents(); + + } + + private void initComponents() { + + contentPanel = new JPanel(); + StylingUI.contentPanelStyle(contentPanel); + + StylingUI.buttonStyle(accueilButton = new JButton("ACCUEIL")); + + StylingUI.titleLabelStyle(titreLabel = new JLabel("CLASSEMENT")); + StylingUI.subtitleLabelStyle(filtresLabel = new JLabel("FILTRES")); + + StylingUI.labelStyle(thematiqueLabel = new JLabel("THEMATIQUE")); + StylingUI.labelStyle(nombreJoueursLabel = new JLabel("NOMBRE DE JOUEURS")); + + thematiqueComboBox = new JComboBox<>(); + nombreJoueursComboBox = new JComboBox<>(); + thematiqueComboBox.setAlignmentX(Component.LEFT_ALIGNMENT); + nombreJoueursComboBox.setAlignmentX(Component.LEFT_ALIGNMENT); + thematiqueComboBox.setMaximumSize(new Dimension(150, 25)); + nombreJoueursComboBox.setMaximumSize(new Dimension(150, 25)); + + Object[][] data = { { "1", "Tux", "150", "00:04:35" }, { "2", "James Hughes", "150", "00:04:42" }, + { "3", "Linus Torvalds", "150", "00:04:51" }, { "4", "Ian Murdock", "150", "00:05:10" }, + { "5", "Dinosaure", "150", "00:05:15" }, { "6", "Diplodocus", "150", "00:05:23" }, + { "7", "Diplodocus", "150", "00:05:52" }, { "8", "Stegosaurus", "150", "00:06:37" }, + { "9", "Lapin", "150", "00:07:24" }, { "10", "Compsognathus", "150", "00:07:45" } }; + String title[] = { "Position", "Pseudo", "Points", "Temps" }; + + scoreTable = new JTable(data, title); + JScrollPane scrolltable = new JScrollPane(scoreTable); + StylingUI.tableStyle(scoreTable); + + contentPanel.add(titreLabel); + contentPanel.add(filtresLabel); + contentPanel.add(thematiqueLabel); + contentPanel.add(thematiqueComboBox); + contentPanel.add(Box.createRigidArea(new Dimension(0, 10))); + contentPanel.add(nombreJoueursLabel); + contentPanel.add(nombreJoueursComboBox); + contentPanel.add(Box.createRigidArea(new Dimension(0, 10))); + contentPanel.add(scoreTable.getTableHeader()); + contentPanel.add(scrolltable); + contentPanel.add(Box.createRigidArea(new Dimension(0, 10))); + contentPanel.add(accueilButton); + + this.add(contentPanel); + + /* + accueilButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + panelController.lastView(); + } + }); + */ + + } + + public void addButtonListener(ActionListener listener) { + accueilButton.addActionListener(listener); + } + + public JButton getAccueilButton() { + return accueilButton; + } + + public JTable getScoreTable() { + // TODO Auto-generated method stub + return scoreTable; + } +} diff --git a/src/view/JeuPanel.java b/src/view/JeuPanel.java new file mode 100644 index 0000000..54746d6 --- /dev/null +++ b/src/view/JeuPanel.java @@ -0,0 +1,98 @@ +package view; + +import java.awt.BorderLayout; +import java.awt.Button; +import java.awt.CardLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.Image; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.io.FileInputStream; +import java.io.IOException; + +import javax.imageio.ImageIO; +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JLayeredPane; +import javax.swing.JPanel; +import javax.swing.event.AncestorEvent; +import javax.swing.event.AncestorListener; + +import controller.PanelController; +import javafx.scene.layout.Border; +import ui.StylingUI; +import view.jeuPanel.AssociationTrouveePanel; +import view.jeuPanel.CentreJeuPanel; +import view.jeuPanel.ChimoryPanel; +import view.jeuPanel.ClassementJeuPanel; +import view.jeuPanel.PausePanel; + +public class JeuPanel extends JPanel { + + private ChimoryPanel chimoryPanel; + private PausePanel pausePanel; + + public JeuPanel() { + + StylingUI.panelStyle(this); + initComponents(); + + } + + private void initComponents() { + + JLayeredPane layeredPane = new JLayeredPane(); + layeredPane.setPreferredSize(new Dimension(StylingUI.windowsWidth, StylingUI.windowsHeight)); + + chimoryPanel = new ChimoryPanel(this); + pausePanel = new PausePanel(this); + + layeredPane.add(chimoryPanel, new Integer(1)); + layeredPane.add(pausePanel, new Integer(2)); + + pausePanel.setVisible(false); + + this.add(layeredPane); + + } + + public void initJeu() { + chimoryPanel.setVisible(true); + pausePanel.setVisible(false); + } + + public void afficherPause(boolean afficher) { + pausePanel.setVisible(afficher); + } + + public void addButtonListener(ActionListener listener) { + pausePanel.addButtonListener(listener); + chimoryPanel.addButtonListener(listener); + } + + public void addCarteListener(MouseListener listener) { + chimoryPanel.addCarteListener(listener); + } + + + public ChimoryPanel getChimoryPanel() { + return chimoryPanel; + } + public PausePanel getPausePanel() { + return pausePanel; + } + +} diff --git a/src/view/OptionsJeuPanel.java b/src/view/OptionsJeuPanel.java new file mode 100644 index 0000000..f3abbc2 --- /dev/null +++ b/src/view/OptionsJeuPanel.java @@ -0,0 +1,311 @@ +package view; + +import java.awt.BorderLayout; +import java.awt.Button; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.Image; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.FileInputStream; +import java.io.IOException; + +import javax.imageio.ImageIO; +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JLayeredPane; +import javax.swing.JPanel; +import javax.swing.JTextField; + +import controller.PanelController; +import ui.StylingUI; + +public class OptionsJeuPanel extends JPanel { + + //private PanelController panelController; + + private JPanel contentPanel; + private JButton annulerButton; + private JButton jouerButton; + private JLabel titreLabel; + + JPanel arPanel; + JPanel modePanel; + JPanel thematiquePanel; + JPanel difficultePanel; + JPanel buttonsPanel; + JPanel subButtonsPanel; + + private JPanel player[] = new JPanel[4]; + private JLabel playerLabel[] = new JLabel[4]; + private JTextField playerTextField[] = new JTextField[4]; + private JButton boutonsAR[] = new JButton[4]; + + private JLabel modeLabel; + private JLabel thematiqueLabel; + private JLabel difficulteLabel; + private JComboBox modeComboBox; + private JComboBox thematiqueComboBox; + private JComboBox difficulteComboBox; + + //public OptionsJeuPanel(PanelController panelController) { + public OptionsJeuPanel() { + + //this.panelController = panelController; + StylingUI.panelStyle(this); + initComponents(); + + } + + private void initComponents() { + + contentPanel = new JPanel(); + StylingUI.contentPanelStyle(contentPanel); + + StylingUI.titleLabelStyle(titreLabel = new JLabel("OPTIONS PARTIE")); + + StylingUI.buttonStyle(annulerButton = new JButton("ANNULER")); + StylingUI.buttonStyle(jouerButton = new JButton("JOUER")); + + JPanel players = new JPanel(); + players.setBackground(StylingUI.gray); + players.setLayout(new BoxLayout(players, BoxLayout.LINE_AXIS)); + players.setMaximumSize(new Dimension(contentPanel.getWidth(), contentPanel.getWidth()/4)); + + ImageIcon imgIcon = new ImageIcon(); + try { + Image img = ImageIO.read(new FileInputStream("ico/people.png")); + img = img.getScaledInstance(contentPanel.getWidth()/6, contentPanel.getWidth()/6, Image.SCALE_DEFAULT); + imgIcon = new ImageIcon(img); + } catch (IOException e) { + e.printStackTrace(); + } + for(int a = 0;a<4;a++) { + player[a] = new JPanel(); + player[a].setLayout(new BorderLayout()); + //player[a].setLayout(new FlowLayout()); + player[a].setPreferredSize(new Dimension(contentPanel.getWidth()/4, contentPanel.getWidth()/4)); + player[a].setBackground(StylingUI.gray); + playerLabel[a] = new JLabel(imgIcon); + playerTextField[a] = new JTextField(); + playerTextField[a].setColumns(5); + player[a].add(playerLabel[a], BorderLayout.NORTH); + player[a].add(playerTextField[a], BorderLayout.SOUTH); + players.add(player[a]); + } + + players.setAlignmentX(Component.LEFT_ALIGNMENT); + + + + StylingUI.labelStyle(modeLabel = new JLabel("MODE DE JEU")); + StylingUI.labelStyle(thematiqueLabel = new JLabel("THEMATIQUE")); + StylingUI.labelStyle(difficulteLabel = new JLabel("DIFFICULTE")); + modeComboBox = new JComboBox<>(); + thematiqueComboBox = new JComboBox<>(); + difficulteComboBox = new JComboBox<>(); + modeComboBox.setMaximumSize(new Dimension(150, 25)); + thematiqueComboBox.setMaximumSize(new Dimension(150, 25)); + difficulteComboBox.setMaximumSize(new Dimension(150, 25)); + + modeComboBox.addItem("Normal"); + difficulteComboBox.addItem("Facile"); + difficulteComboBox.addItem("Normale"); + difficulteComboBox.addItem("Difficile"); + + //thematiqueComboBox.addItem("chimie"); + + arPanel = new JPanel(); + arPanel.setLayout(new GridBagLayout()); + arPanel.setAlignmentX(Component.LEFT_ALIGNMENT); + arPanel.setBackground(StylingUI.gray); + GridBagConstraints c = new GridBagConstraints(); + c.weightx = 4; + + boutonsAR[0] = new JButton("-"); + boutonsAR[1] = new JButton("+"); + boutonsAR[2] = new JButton("+"); + boutonsAR[3] = new JButton("+"); + + StylingUI.arButtonStyle(boutonsAR[0]); + StylingUI.arButtonStyle(boutonsAR[1]); + StylingUI.arButtonStyle(boutonsAR[2]); + StylingUI.arButtonStyle(boutonsAR[3]); + + + c.gridx = 0; + c.gridy = 0; + arPanel.add(boutonsAR[0], c); + c.gridx = 1; + arPanel.add(boutonsAR[1], c); + c.gridx = 2; + arPanel.add(boutonsAR[2], c); + c.gridx = 3; + arPanel.add(boutonsAR[3], c); + + arPanel.setMaximumSize(new Dimension(Short.MAX_VALUE, arPanel.getPreferredSize().height)); + + + + + modePanel = new JPanel(); + modePanel.setLayout(new BorderLayout()); + modePanel.setAlignmentX(Component.LEFT_ALIGNMENT); + modePanel.setBackground(StylingUI.gray); + modePanel.add(modeLabel); + modePanel.add(modeComboBox, BorderLayout.EAST); + + thematiquePanel = new JPanel(); + thematiquePanel.setLayout(new BorderLayout()); + thematiquePanel.setAlignmentX(Component.LEFT_ALIGNMENT); + thematiquePanel.setBackground(StylingUI.gray); + thematiquePanel.add(thematiqueLabel); + thematiquePanel.add(thematiqueComboBox, BorderLayout.EAST); + + difficultePanel = new JPanel(); + difficultePanel.setLayout(new BorderLayout()); + difficultePanel.setAlignmentX(Component.LEFT_ALIGNMENT); + difficultePanel.setBackground(StylingUI.gray); + difficultePanel.add(difficulteLabel); + difficultePanel.add(difficulteComboBox, BorderLayout.EAST); + + buttonsPanel = new JPanel(); + subButtonsPanel = new JPanel(); + buttonsPanel.setLayout(new BorderLayout()); + buttonsPanel.setAlignmentX(Component.LEFT_ALIGNMENT); + buttonsPanel.setBackground(StylingUI.gray); + subButtonsPanel.add(annulerButton); + subButtonsPanel.add(jouerButton); + buttonsPanel.add(subButtonsPanel, BorderLayout.LINE_END); + + modePanel.setMaximumSize(new Dimension(Short.MAX_VALUE, modePanel.getPreferredSize().height)); + thematiquePanel.setMaximumSize(new Dimension(Short.MAX_VALUE, thematiquePanel.getPreferredSize().height)); + difficultePanel.setMaximumSize(new Dimension(Short.MAX_VALUE, difficultePanel.getPreferredSize().height)); + buttonsPanel.setMaximumSize(new Dimension(Short.MAX_VALUE, buttonsPanel.getPreferredSize().height)); + + contentPanel.add(titreLabel); + contentPanel.add(players); + contentPanel.add(Box.createRigidArea(new Dimension(0, 10))); + contentPanel.add(arPanel); + contentPanel.add(Box.createRigidArea(new Dimension(0, 10))); + contentPanel.add(modePanel); + contentPanel.add(Box.createRigidArea(new Dimension(0, 10))); + contentPanel.add(thematiquePanel); + contentPanel.add(Box.createRigidArea(new Dimension(0, 10))); + contentPanel.add(difficultePanel); + contentPanel.add(Box.createRigidArea(new Dimension(0, 10))); + contentPanel.add(buttonsPanel); + //contentPanel.add(annulerButton); + //contentPanel.add(jouerButton); + + setPlayer(0, true); + setPlayer(1, false); + setPlayer(2, false); + setPlayer(3, false); + + + this.add(contentPanel); + + /* + annulerButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + panelController.changeView(Panels.ACCUEIL); + } + }); + + jouerButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + panelController.changeView(Panels.JEU); + } + }); + */ + + + /* + for(int a = 0;a<4;a++) { + final int b = a; + boutonsAR[a].addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + setPlayer(b, !playerLabel[b].isVisible()); + } + }); + } + */ + } + + public void setPlayer(int index, boolean state) { + if (state) { + playerLabel[index].setVisible(true); + playerTextField[index].setVisible(true); + playerTextField[index].setText("Joueur "+(index+1));; + boutonsAR[index].setText("-"); + } else { + playerLabel[index].setVisible(false); + playerTextField[index].setVisible(false); + boutonsAR[index].setText("+"); + } + } + + public void addButtonListener(ActionListener listener) { + annulerButton.addActionListener(listener); + jouerButton.addActionListener(listener); + boutonsAR[0].addActionListener(listener); + boutonsAR[1].addActionListener(listener); + boutonsAR[2].addActionListener(listener); + boutonsAR[3].addActionListener(listener); + } + + public JButton getAnnulerButton() { + return annulerButton; + } + + public JButton getJouerButton() { + return jouerButton; + } + + public JButton[] getBoutonsAR() { + return boutonsAR; + } + + public JLabel[] getPlayerLabel() { + return playerLabel; + } + + public JTextField[] getPlayerTextField() { + return playerTextField; + } + + public JComboBox getModeComboBox() { + return modeComboBox; + } + + public JComboBox getThematiqueComboBox() { + return thematiqueComboBox; + } + + public JComboBox getDifficulteComboBox() { + return difficulteComboBox; + } + + public void resetThematiqueComboBox() { + thematiqueComboBox.removeAllItems(); + } + + public void addToThematiqueComboBox(String thematique) { + thematiqueComboBox.addItem(thematique); + } + +} diff --git a/src/view/OptionsPanel.java b/src/view/OptionsPanel.java new file mode 100644 index 0000000..3719ff1 --- /dev/null +++ b/src/view/OptionsPanel.java @@ -0,0 +1,232 @@ +package view; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JSlider; +import javax.swing.JTextField; +import javax.swing.UIManager; + +import controller.PanelController; +import ui.StylingUI; + +public class OptionsPanel extends JPanel { + + //private PanelController panelController; + private JPanel contentPanel; + private JPanel gridPanel; + private GridBagConstraints c; + private JButton sauvegarderButton; + private JButton annulerButton; + private JLabel titreLabel; + + private JLabel tutorielLabel; + private JLabel sonLabel; + private JLabel musiqueLabel; + private JLabel sonsLabel; + private JLabel thematiqueLabel; + private JLabel resolutionLabel; + private JLabel daltonismeLabel; + private JLabel optionsAdminLabel; + private JLabel hotePortLabel; + private JLabel identifiantLabel; + private JLabel passwordLabel; + + private JCheckBox tutorielCheckBox; + private JCheckBox sonCheckBox; + private JSlider musiqueSlider; + private JSlider sonsSlider; + private JComboBox thematiqueComboBox; + private JComboBox resolutionComboBox; + private JCheckBox daltonismeCheckBox; + private JTextField hotePortTextField; + private JTextField identifiantTextField; + private JTextField passwordTextField; + + //public OptionsPanel(PanelController panelController) { + public OptionsPanel() { + + //this.panelController = panelController; + StylingUI.panelStyle(this); + initComponents(); + + } + + private void initComponents() { + + contentPanel = new JPanel(); + StylingUI.contentPanelStyle(contentPanel); + + StylingUI.buttonStyle(sauvegarderButton = new JButton("SAUVEGARDER")); + StylingUI.buttonStyle(annulerButton = new JButton("ANNULER")); + + StylingUI.titleLabelStyle(titreLabel = new JLabel("OPTIONS")); + StylingUI.labelStyle(tutorielLabel = new JLabel("ACTIVER LE TUTORIEL")); + StylingUI.labelStyle(sonLabel = new JLabel("ACTIVER LE SON")); + StylingUI.labelStyle(musiqueLabel = new JLabel("VOLUME DE LA MUSIQUE")); + StylingUI.labelStyle(sonsLabel = new JLabel("VOLUME DES SONS")); + StylingUI.labelStyle(thematiqueLabel = new JLabel("THEMATIQUE")); + StylingUI.labelStyle(resolutionLabel = new JLabel("RESOLUTION")); + StylingUI.labelStyle(daltonismeLabel = new JLabel("DALTONISME")); + StylingUI.subtitleLabelStyle(optionsAdminLabel = new JLabel("OPTIONS ADMINISTATEUR")); + StylingUI.labelStyle(hotePortLabel = new JLabel("HOTE:PORT")); + StylingUI.labelStyle(identifiantLabel = new JLabel("IDENTIFIANT")); + StylingUI.labelStyle(passwordLabel = new JLabel("MOT DE PASSE")); + + tutorielCheckBox = new JCheckBox(); + sonCheckBox = new JCheckBox(); + musiqueSlider = new JSlider(); + sonsSlider = new JSlider(); + thematiqueComboBox = new JComboBox<>(); + resolutionComboBox = new JComboBox<>(); + daltonismeCheckBox = new JCheckBox(); + hotePortTextField = new JTextField(); + identifiantTextField = new JTextField(); + passwordTextField = new JTextField(); + + hotePortTextField.setColumns(30); + identifiantTextField.setColumns(20); + passwordTextField.setColumns(20); + + StylingUI.jTextFieldStyle(hotePortTextField); + StylingUI.jTextFieldStyle(identifiantTextField); + StylingUI.jTextFieldStyle(passwordTextField); + + gridPanel = new JPanel(new GridBagLayout()); + gridPanel.setBackground(StylingUI.gray); + gridPanel.setAlignmentX(Component.LEFT_ALIGNMENT); + + c = new GridBagConstraints(); + c.weightx = 2; + c.weighty = 14; + + contentPanel.add(titreLabel); + + c.anchor = GridBagConstraints.WEST; + c.gridx = 0; + c.gridy = 0; + gridPanel.add(tutorielLabel, c); + c.gridy = 1; + gridPanel.add(sonLabel, c); + c.gridy = 2; + gridPanel.add(musiqueLabel, c); + c.gridy = 3; + c.gridwidth = 2; + gridPanel.add(musiqueSlider, c); + c.gridy = 4; + c.gridwidth = 1; + gridPanel.add(sonsLabel, c); + c.gridy = 5; + c.gridwidth = 2; + gridPanel.add(sonsSlider, c); + c.gridy = 6; + c.gridwidth = 1; + gridPanel.add(thematiqueLabel, c); + c.gridy = 7; + gridPanel.add(resolutionLabel, c); + c.gridy = 8; + gridPanel.add(daltonismeLabel, c); + c.gridy = 9; + gridPanel.add(optionsAdminLabel, c); + c.gridy = 10; + gridPanel.add(hotePortLabel, c); + c.gridy = 11; + gridPanel.add(identifiantLabel, c); + c.gridy = 12; + gridPanel.add(passwordLabel, c); + c.gridy = 13; + c.anchor = GridBagConstraints.EAST; + gridPanel.add(annulerButton, c); + + c.gridx = 1; + + c.gridy = 0; + gridPanel.add(tutorielCheckBox, c); + c.gridy = 1; + gridPanel.add(sonCheckBox, c); + c.gridy = 6; + gridPanel.add(thematiqueComboBox, c); + c.gridy = 7; + gridPanel.add(resolutionComboBox, c); + c.gridy = 8; + gridPanel.add(daltonismeCheckBox, c); + c.gridy = 10; + gridPanel.add(hotePortTextField, c); + c.gridy = 11; + gridPanel.add(identifiantTextField, c); + c.gridy = 12; + gridPanel.add(passwordTextField, c); + c.gridy = 13; + gridPanel.add(sauvegarderButton, c); + + contentPanel.add(gridPanel); + this.add(contentPanel); + + } + + public JTextField getHotePortTextField() { + return hotePortTextField; + } + + public void setHotePortTextField(JTextField hotePortTextField) { + this.hotePortTextField = hotePortTextField; + } + + public JTextField getIdentifiantTextField() { + return identifiantTextField; + } + + public void setIdentifiantTextField(JTextField identifiantTextField) { + this.identifiantTextField = identifiantTextField; + } + + public JTextField getPasswordTextField() { + return passwordTextField; + } + + public void setPasswordTextField(JTextField passwordTextField) { + this.passwordTextField = passwordTextField; + } + + public void addButtonListener(ActionListener listener) { + sauvegarderButton.addActionListener(listener); + annulerButton.addActionListener(listener); + } + + public JComboBox getThematiqueComboBox() { + return thematiqueComboBox; + } + + public void setThematiqueComboBox(JComboBox thematiqueComboBox) { + this.thematiqueComboBox = thematiqueComboBox; + } + + public JButton getSauvegarderButton() { + return sauvegarderButton; + } + + public JButton getAnnulerButton() { + return annulerButton; + } + public void addToThematiqueComboBox(String thematique) { + thematiqueComboBox.addItem(thematique); + } + + public JComboBox getResolutionComboBox() { + return resolutionComboBox; + } + public void addToResolutionComboBox(String resolution) { + resolutionComboBox.addItem(resolution); + } + +} diff --git a/src/view/Panels.java b/src/view/Panels.java new file mode 100644 index 0000000..d74adf4 --- /dev/null +++ b/src/view/Panels.java @@ -0,0 +1,11 @@ +package view; + +public enum Panels { + + ACCUEIL, + OPTIONS_JEU, + OPTIONS, + JEU, + CLASSEMENT; + +} diff --git a/src/view/Window.java b/src/view/Window.java new file mode 100644 index 0000000..0f4c5cb --- /dev/null +++ b/src/view/Window.java @@ -0,0 +1,95 @@ +package view; + +import java.awt.BorderLayout; +import java.awt.CardLayout; + +import javax.swing.JFrame; +import javax.swing.JPanel; + +import ui.StylingUI; + +public class Window extends JFrame { + + private CardLayout cardLayout; + private JPanel view; + //private PanelController panelController; + + private JPanel accueilPanel; + private JPanel optionsPanel; + private JPanel optionsJeuPanel; + private JPanel jeuPanel; + private JPanel classementPanel; + + public Window() { + + this.setTitle("Chim'ory"); + this.setSize(StylingUI.windowsWidth, StylingUI.windowsHeight); + + this.setLocationRelativeTo(null); + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + cardLayout = new CardLayout(); + view = new JPanel(cardLayout); + + //panelController = new PanelController(view, cardLayout); + /* + accueilPanel = new AccueilPanel(panelController); + optionsPanel = new OptionsPanel(panelController); + optionsJeuPanel = new OptionsJeuPanel(panelController); + jeuPanel = new JeuPanel(panelController); + classementPanel = new ClassementPanel(panelController); + */ + accueilPanel = new AccueilPanel(); + optionsPanel = new OptionsPanel(); + optionsJeuPanel = new OptionsJeuPanel(); + jeuPanel = new JeuPanel(); + classementPanel = new ClassementPanel(); + + view.add(accueilPanel, Panels.ACCUEIL.toString()); + view.add(optionsJeuPanel, Panels.OPTIONS_JEU.toString()); + view.add(optionsPanel, Panels.OPTIONS.toString()); + view.add(jeuPanel, Panels.JEU.toString()); + view.add(classementPanel, Panels.CLASSEMENT.toString()); + + this.add(view, BorderLayout.CENTER); + + this.pack(); + + //panelController.changeView(Panels.ACCUEIL); + //panelController.changeView(Panels.JEU); + + this.setVisible(true); + + } + + + public JPanel getView() { + return view; + } + public CardLayout getCardLayout() { + return cardLayout; + } + public AccueilPanel getAccueilPanel() { + return (AccueilPanel) accueilPanel; + } + public OptionsPanel getOptionsPanel() { + return (OptionsPanel) optionsPanel; + } + public OptionsJeuPanel getOptionsJeuPanel() { + return (OptionsJeuPanel) optionsJeuPanel; + } + public JeuPanel getJeuPanel() { + return (JeuPanel) jeuPanel; + } + public ClassementPanel getClassementPanel() { + return (ClassementPanel) classementPanel; + } + + + + /* + * public static void changePanel(Panels name) { cardLayout.show(view, + * name.toString()); } + */ + +} diff --git a/src/view/jeuPanel/AssociationTrouveePanel.java b/src/view/jeuPanel/AssociationTrouveePanel.java new file mode 100644 index 0000000..cc3a35e --- /dev/null +++ b/src/view/jeuPanel/AssociationTrouveePanel.java @@ -0,0 +1,163 @@ +package view.jeuPanel; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Image; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.imageio.ImageIO; +import javax.swing.ImageIcon; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; + +import ui.StylingUI; + +public class AssociationTrouveePanel extends JPanel { + + JScrollPane reactifSubstratPanel; + JScrollPane produitPanel; + JScrollPane reactionPanel; + + JPanel reactifSubstratPanelFlow; + JPanel produitPanelFlow; + JPanel reactionPanelFlow; + + public AssociationTrouveePanel(Dimension dimension) { + + this.setPreferredSize(dimension); + //this.setBackground(Color.red); + + ((FlowLayout) this.getLayout()).setVgap(0); + ((FlowLayout) this.getLayout()).setHgap(0); + + reactifSubstratPanelFlow = new JPanel(); + produitPanelFlow = new JPanel(); + reactionPanelFlow = new JPanel(); + + reactifSubstratPanel = new JScrollPane(reactifSubstratPanelFlow); + produitPanel = new JScrollPane(produitPanelFlow); + reactionPanel = new JScrollPane(reactionPanelFlow); + + Dimension pDimension = new Dimension((int) dimension.getWidth(), (int) dimension.getHeight() / 3); + + reactifSubstratPanel.setPreferredSize(pDimension); + produitPanel.setPreferredSize(pDimension); + reactionPanel.setPreferredSize(pDimension); + + reactifSubstratPanel.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); + reactifSubstratPanel.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); + produitPanel.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); + produitPanel.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); + reactionPanel.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); + reactionPanel.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); + + reactifSubstratPanel.setBackground(Color.black); + produitPanel.setBackground(Color.red); + reactionPanel.setBackground(Color.green); + + this.add(reactifSubstratPanel); + this.add(produitPanel); + this.add(reactionPanel); + } + + public void reset() { + + reactifSubstratPanelFlow.removeAll(); + produitPanelFlow.removeAll(); + reactionPanelFlow.removeAll(); + + reactifSubstratPanelFlow.validate(); + produitPanelFlow.validate(); + reactionPanelFlow.validate(); + + } + + public void ajouterCartesReactifSubstrat(String nom, String image) { + double carteHeight = this.getPreferredSize().getHeight()/3-40; + double carteWidth = carteHeight*0.75; + + JPanel carte = new JPanel(); + carte.setPreferredSize(new Dimension((int) carteWidth, (int) carteHeight)); + carte.setBackground(StylingUI.reactifSubstratCouleur); + + JLabel jlb = new JLabel(nom); + StylingUI.carteStyle(jlb); + carte.add(jlb); + JLabel nlbl; + try { + Image img = ImageIO.read(new FileInputStream(image)); + img = img.getScaledInstance(carte.getPreferredSize().width, + carte.getPreferredSize().width*img.getHeight(null)/img.getWidth(null), + Image.SCALE_DEFAULT); + nlbl = new JLabel(new ImageIcon(img)); + } catch (IOException e) { + nlbl = new JLabel(); + } + carte.add(nlbl); + + reactifSubstratPanelFlow.add(carte); + reactifSubstratPanelFlow.validate(); + reactifSubstratPanelFlow.repaint(); + } + + public void ajouterCartesProduit(String nom, String image) { + double carteHeight = this.getPreferredSize().getHeight()/3-40; + double carteWidth = carteHeight*0.75; + + JPanel carte = new JPanel(); + carte.setPreferredSize(new Dimension((int) carteWidth, (int) carteHeight)); + carte.setBackground(StylingUI.produitCouleur); + + JLabel jlb = new JLabel(nom); + StylingUI.carteStyle(jlb); + carte.add(jlb); + JLabel nlbl; + try { + Image img = ImageIO.read(new FileInputStream(image)); + img = img.getScaledInstance(carte.getPreferredSize().width, + carte.getPreferredSize().width*img.getHeight(null)/img.getWidth(null), + Image.SCALE_DEFAULT); + nlbl = new JLabel(new ImageIcon(img)); + } catch (IOException e) { + nlbl = new JLabel(); + } + carte.add(nlbl); + + produitPanelFlow.add(carte); + produitPanelFlow.validate(); + produitPanelFlow.repaint(); + } + public void ajouterCartesReaction(String nom, String image) { + double carteHeight = this.getPreferredSize().getHeight()/3-40; + double carteWidth = carteHeight*0.75; + + JPanel carte = new JPanel(); + carte.setPreferredSize(new Dimension((int) carteWidth, (int) carteHeight)); + carte.setBackground(StylingUI.reactionCouleur); + + JLabel jlb = new JLabel(nom); + StylingUI.carteStyle(jlb); + carte.add(jlb); + JLabel nlbl; + try { + Image img = ImageIO.read(new FileInputStream(image)); + img = img.getScaledInstance(carte.getPreferredSize().width, + carte.getPreferredSize().width*img.getHeight(null)/img.getWidth(null), + Image.SCALE_DEFAULT); + nlbl = new JLabel(new ImageIcon(img)); + } catch (IOException e) { + nlbl = new JLabel(); + } + carte.add(nlbl); + + reactionPanelFlow.add(carte); + reactionPanelFlow.validate(); + reactionPanelFlow.repaint(); + } + +} diff --git a/src/view/jeuPanel/CentreJeuPanel.java b/src/view/jeuPanel/CentreJeuPanel.java new file mode 100644 index 0000000..a76b3fc --- /dev/null +++ b/src/view/jeuPanel/CentreJeuPanel.java @@ -0,0 +1,241 @@ +package view.jeuPanel; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Image; +import java.awt.Toolkit; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +import javax.imageio.ImageIO; +import javax.swing.DefaultListModel; +import javax.swing.DefaultListSelectionModel; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.ListModel; +import javax.swing.ListSelectionModel; +import javax.swing.ScrollPaneConstants; + +import ui.SingleMouseClickSelectList; +import ui.StylingUI; + +public class CentreJeuPanel extends JPanel { + + private JPanel top; + private JPanel mid; + private JPanel bottom; + private JPanel qaJPanel; + private JPanel cJPanel; + private JPanel[] cartes; + private JLabel[] cartesLabel; + private JLabel[] cartesImage; + private JButton accepter; + private JButton oui; + private JButton non; + + private DefaultListModel dlm; + private JList listeCaracteristique; + + public CentreJeuPanel(Dimension dimension) { + this.setPreferredSize(dimension); + + this.setLayout(new BorderLayout()); + + top = new JPanel(); + bottom = new JPanel(); + top.setBackground(StylingUI.gray); + bottom.setBackground(StylingUI.gray); + top.setLayout(new BorderLayout()); + + top.setPreferredSize(new Dimension((int) this.getPreferredSize().getWidth(), (int) this.getPreferredSize().getHeight()/2)); + bottom.setPreferredSize(new Dimension((int) this.getPreferredSize().getWidth(), (int) this.getPreferredSize().getHeight()/2)); + + this.add(top, BorderLayout.NORTH); + this.add(bottom, BorderLayout.SOUTH); + + cartes = new JPanel[3]; + cartesLabel = new JLabel[3]; + cartesImage = new JLabel[3]; + + double cardsHeight = this.getPreferredSize().getHeight()/2 - 10; + double cardsWidth = cardsHeight*0.75 - 10; + + cartes[0] = new JPanel(); + cartes[1] = new JPanel(); + cartes[2] = new JPanel(); + /* + cartes[0].setLayout(new BorderLayout()); + cartes[1].setLayout(new BorderLayout()); + cartes[2].setLayout(new BorderLayout()); + */ + cartesLabel[0] = new JLabel(); + cartesLabel[1] = new JLabel(); + cartesLabel[2] = new JLabel(); + cartesImage[0] = new JLabel(); + cartesImage[1] = new JLabel(); + cartesImage[2] = new JLabel(); + + Dimension carteDimension = new Dimension((int) cardsWidth, (int) cardsHeight); + cartes[0].setPreferredSize(carteDimension); + cartes[1].setPreferredSize(carteDimension); + cartes[2].setPreferredSize(carteDimension); + + cartes[0].setBackground(StylingUI.reactifSubstratCouleur); + cartes[1].setBackground(StylingUI.produitCouleur); + cartes[2].setBackground(StylingUI.reactionCouleur); + /* + cartes[0].add(cartesLabel[0], BorderLayout.NORTH); + cartes[0].add(cartesImage[0], BorderLayout.SOUTH); + cartes[1].add(cartesLabel[1], BorderLayout.NORTH); + cartes[1].add(cartesImage[1], BorderLayout.SOUTH); + cartes[2].add(cartesLabel[2], BorderLayout.NORTH); + cartes[2].add(cartesImage[2], BorderLayout.SOUTH); + */ + cartes[0].add(cartesLabel[0]); + cartes[0].add(cartesImage[0]); + cartes[1].add(cartesLabel[1]); + cartes[1].add(cartesImage[1]); + cartes[2].add(cartesLabel[2]); + cartes[2].add(cartesImage[2]); + StylingUI.carteStyleCentre(cartesLabel[0]); + StylingUI.carteStyleCentre(cartesLabel[1]); + StylingUI.carteStyleCentre(cartesLabel[2]); + + dlm = new DefaultListModel(); + listeCaracteristique = new SingleMouseClickSelectList(dlm); + + listeCaracteristique.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + + JScrollPane scrollPane = new JScrollPane(listeCaracteristique); + scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + + JLabel caracteristiquesLabel = new JLabel("CARACTERISTIQUES"); + StylingUI.labelStyle(caracteristiquesLabel); + accepter = new JButton("ACCEPTER"); + StylingUI.buttonStyleSmall(accepter); + + Dimension listeCaracteristiqueDimension = new Dimension( + (int) (top.getPreferredSize().getWidth()-carteDimension.getWidth()*2), + (int) (top.getPreferredSize().getHeight()-accepter.getPreferredSize().getHeight()-caracteristiquesLabel.getPreferredSize().getHeight())); + scrollPane.setPreferredSize(listeCaracteristiqueDimension); + scrollPane.setSize(listeCaracteristiqueDimension); + + mid = new JPanel(); + JPanel midTop = new JPanel(); + midTop.setLayout(new BorderLayout()); + mid.setLayout(new BorderLayout()); + + midTop.add(caracteristiquesLabel, BorderLayout.NORTH); + midTop.add(scrollPane, BorderLayout.SOUTH); + mid.add(midTop, BorderLayout.NORTH); + mid.add(accepter, BorderLayout.SOUTH); + + top.add(cartes[0], BorderLayout.WEST); + top.add(mid, BorderLayout.CENTER); + top.add(cartes[1], BorderLayout.EAST); + + JPanel question = new JPanel(); + JPanel reponse = new JPanel(); + question.setBackground(StylingUI.gray); + reponse.setBackground(StylingUI.gray); + JLabel askAssoc = new JLabel("Y'a t'il une association ?"); + oui = new JButton("OUI"); + non = new JButton("NON"); + StylingUI.buttonStyleSmall(oui); + StylingUI.buttonStyleSmall(non); + StylingUI.subtitleLabelStyle(askAssoc); + + qaJPanel = new JPanel(); + cJPanel = new JPanel(); + qaJPanel.setBackground(StylingUI.gray); + cJPanel.setBackground(StylingUI.gray); + + qaJPanel.setLayout(new BorderLayout()); + + question.add(askAssoc); + reponse.add(oui); + reponse.add(non); + + qaJPanel.add(question, BorderLayout.NORTH); + qaJPanel.add(reponse, BorderLayout.CENTER); + cJPanel.add(cartes[2]); + + bottom.add(qaJPanel); + qaJPanel.setVisible(false); + bottom.add(cJPanel); + cJPanel.setVisible(true); + + //top.setVisible(true); + //cartes[1].setVisible(false); + } + + public void addButtonListener(ActionListener listener) { + accepter.addActionListener(listener); + oui.addActionListener(listener); + non.addActionListener(listener); + } + + public void afficherCarte(int id, String nom, String image) { + cartesLabel[id].setText(nom); + try { + Image img = ImageIO.read(new FileInputStream(image)); + img = img.getScaledInstance(cartes[id].getWidth(), cartes[id].getWidth()*img.getHeight(null)/img.getWidth(null), Image.SCALE_DEFAULT); + cartesImage[id].setIcon(new ImageIcon(img)); + } catch (IOException e) { + + } + if (id == 2) + cJPanel.setVisible(!cartes[id].isVisible()); + cartes[id].setVisible(!cartes[id].isVisible()); + } + + public void reset() { + mid.setVisible(false); + cartes[0].setVisible(false); + cartes[1].setVisible(false); + cartes[2].setVisible(false); + cJPanel.setVisible(false); + qaJPanel.setVisible(false); + } + + public void afficherCaracteristiques() { + listeCaracteristique.clearSelection(); + mid.setVisible(true); + } + public int[] getCaracteristiques() { + return listeCaracteristique.getSelectedIndices(); + } + + public void afficherQuestion() { + qaJPanel.setVisible(!qaJPanel.isVisible()); + } + + public JButton getAccepter() { + return accepter; + } + public JButton getOui() { + return oui; + } + public JButton getNon() { + return non; + } + + public void resetCaracteristiques() { + dlm.clear(); + } + + public void addCaracteristiques(String[] caracteristiques) { + for (int i = 0;i cartesReactifSubstrat = new ArrayList<>(); + private List cartesReactifSubstratNom = new ArrayList<>(); + private List cartesReactifSubstratImageLabel = new ArrayList<>(); + private List cartesReactifSubstratImage = new ArrayList<>(); + private JLabel labelReactifSubstrat; + + private JPanel produit; + private List cartesProduit = new ArrayList<>(); + private List cartesProduitNom = new ArrayList<>(); + private List cartesProduitImageLabel = new ArrayList<>(); + private List cartesProduitImage = new ArrayList<>(); + private JLabel labelProduit; + + private JPanel reaction; + private List cartesReaction = new ArrayList<>(); + private List cartesReactionNom = new ArrayList<>(); + private List cartesReactionImageLabel = new ArrayList<>(); + private List cartesReactionImage = new ArrayList<>(); + private JLabel labelReaction; + + private int nbCartesReactifSubstrat = 10; + private int nbCartesProduit = 10; + private int nbCartesReaction = 10; + + private CentreJeuPanel center; + private ClassementJeuPanel classement; + private AssociationTrouveePanel found; + + public ChimoryPanel(JeuPanel jP) { + + this.jP = jP; + StylingUI.panelStyle(this); + initComponents(); + } + + private void initComponents() { + + this.setBackground(StylingUI.gray); + + this.setLayout(new FlowLayout()); + ((FlowLayout) this.getLayout()).setVgap(0); + ((FlowLayout) this.getLayout()).setHgap(0); + pauseButton = new JButton(); + + try { + Image img = ImageIO.read(new FileInputStream("ico/pause.png")); + img = img.getScaledInstance(ICONESIZE, ICONESIZE, Image.SCALE_DEFAULT); + pauseButton.setIcon(new ImageIcon(img)); + } catch (IOException e) { + e.printStackTrace(); + } + + pauseButton.setLayout(null); + pauseButton.setBorder(null); + pauseButton.setContentAreaFilled(false); + pauseButton.setBounds(0, 0, ICONESIZE, ICONESIZE); + + top = new JPanel(); + top.setBackground(StylingUI.gray); + top.setLayout(new BorderLayout()); + + pauseButton.setHorizontalAlignment(JButton.LEFT); + + time = new JLabel("00:00:00"); + time.setFont(new Font("Haettenschweiler", Font.PLAIN, 35)); + time.setHorizontalAlignment(JLabel.CENTER); + + top.add(pauseButton, BorderLayout.WEST); + top.add(time, BorderLayout.CENTER); + top.add(Box.createRigidArea(new Dimension(ICONESIZE, ICONESIZE)), BorderLayout.EAST); + top.setPreferredSize(new Dimension(this.getWidth(), top.getPreferredSize().height)); + + reactifSubstrat = new JPanel(); + produit = new JPanel(); + reaction = new JPanel(); + reactifSubstrat.setBackground(StylingUI.gray); + produit.setBackground(StylingUI.gray); + reaction.setBackground(StylingUI.gray); + labelReactifSubstrat = new JLabel("Réactif + Substrat"); + labelProduit = new JLabel("Produit"); + labelReaction = new JLabel("Réaction complète"); + + //initCartes(); + //initPaquets(reactifSubstrat, cartesReactifSubstrat, nbCartesReactifSubstrat, labelReactifSubstrat, new Color(228, 196, 196)); + //initPaquets(produit, cartesProduit, nbCartesProduit, labelProduit, new Color(196, 225, 228)); + //initPaquets(reaction, cartesReaction, nbCartesReaction, labelReaction, new Color(196, 228, 197)); + + Dimension panelDimension = new Dimension(this.getWidth() / 3, (this.getHeight() - top.getPreferredSize().height) / 2); + + center = new CentreJeuPanel(panelDimension); + classement = new ClassementJeuPanel(panelDimension); + found = new AssociationTrouveePanel(panelDimension); + + this.add(top); + this.add(reactifSubstrat); + this.add(center); + this.add(produit); + this.add(classement); + this.add(reaction); + this.add(found); + + /* + pauseButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent arg0) { + pause.setVisible(true); + } + }); + */ + + } + + public void initCartesReactifSubstrat(String nom, String image) { + JLabel jlb = new JLabel(nom); + StylingUI.carteStyle(jlb); + cartesReactifSubstratNom.add(jlb); + cartesReactifSubstratImage.add(image); + } + public void initCartesProduit(String nom, String image) { + JLabel jlb = new JLabel(nom); + StylingUI.carteStyle(jlb); + cartesProduitNom.add(jlb); + cartesProduitImage.add(image); + } + public void initCartesReaction(String nom, String image) { + JLabel jlb = new JLabel(nom); + StylingUI.carteStyle(jlb); + cartesReactionNom.add(jlb); + cartesReactionImage.add(image); + } + + public void initCartes() { + initPaquets(reactifSubstrat, cartesReactifSubstrat, nbCartesReactifSubstrat, labelReactifSubstrat, StylingUI.reactifSubstratCouleur); + initPaquets(produit, cartesProduit, nbCartesProduit, labelProduit, StylingUI.produitCouleur); + initPaquets(reaction, cartesReaction, nbCartesReaction, labelReaction, StylingUI.reactionCouleur); + } + public void resetCartes() { + cartesReactifSubstratNom.clear(); + cartesReactifSubstratImage.clear(); + cartesReactifSubstratImageLabel.clear(); + + cartesProduitNom.clear(); + cartesProduitImage.clear(); + cartesProduitImageLabel.clear(); + + cartesReactionNom.clear(); + cartesReactionImage.clear(); + cartesReactionImageLabel.clear(); + } + + private void initPaquets(JPanel panel, List cartes, int nbCartes, JLabel label, Color color) { + + panel.removeAll(); + cartes.clear(); + + JPanel panelLabel = new JPanel(); + JPanel panelCartes = new JPanel(); + panelLabel.setBackground(StylingUI.gray); + panelCartes.setBackground(StylingUI.gray); + + panelLabel.setLayout(new BorderLayout()); + + label.setFont(new Font("Haettenschweiler", Font.PLAIN, 30)); + panelLabel.add(label); + + panel.setPreferredSize( + new Dimension(this.getWidth() / 3, (this.getHeight() - top.getPreferredSize().height) / 2)); + panelCartes.setPreferredSize(new Dimension((int) panel.getPreferredSize().getWidth(), + (int) (panel.getPreferredSize().getHeight() - panelLabel.getPreferredSize().getHeight()))); + + int diff = (int) (panel.getPreferredSize().getWidth() - panel.getPreferredSize().getHeight()); + //double cardsPS = Math.sqrt( + // (panel.getPreferredSize().getHeight() - diff) * (panel.getPreferredSize().getWidth()) / nbCartes); + double cardsPS = Math.sqrt( + (panelCartes.getPreferredSize().getHeight() - diff) * (panelCartes.getPreferredSize().getWidth()) / nbCartes); + double cardsHeight = cardsPS - 10; + double cardsWidth = cardsPS * 0.75 - 10; + + panel.setLayout(new FlowLayout()); + + ((FlowLayout) panel.getLayout()).setVgap(0); + ((FlowLayout) panel.getLayout()).setHgap(0); + + panelCartes.setLayout(new FlowLayout()); + + ((FlowLayout) panelCartes.getLayout()).setVgap(10); + ((FlowLayout) panelCartes.getLayout()).setHgap(10); + + for (int a = 0; a < nbCartes; a++) { + cartes.add(new JPanel()); + cartes.get(a).setPreferredSize(new Dimension((int) cardsWidth, (int) cardsHeight)); + //cartes.get(a).setBackground(new Color((int) (Math.random() * 256), (int) (Math.random() * 256), (int) (Math.random() * 256))); + cartes.get(a).setBackground(color); + if (cartes.equals(cartesReactifSubstrat)) { + cartes.get(a).add(cartesReactifSubstratNom.get(a)); + try { + Image img = ImageIO.read(new FileInputStream(cartesReactifSubstratImage.get(a))); + img = img.getScaledInstance(cartes.get(a).getPreferredSize().width, + cartes.get(a).getPreferredSize().width*img.getHeight(null)/img.getWidth(null), + Image.SCALE_DEFAULT); + JLabel nlbl = new JLabel(new ImageIcon(img)); + cartesReactifSubstratImageLabel.add(nlbl); + } catch (IOException e) { + JLabel nlbl = new JLabel(); + cartesReactifSubstratImageLabel.add(nlbl); + } + cartes.get(a).add(cartesReactifSubstratImageLabel.get(a)); + } else if (cartes.equals(cartesProduit)) { + cartes.get(a).add(cartesProduitNom.get(a)); + try { + Image img = ImageIO.read(new FileInputStream(cartesProduitImage.get(a))); + img = img.getScaledInstance(cartes.get(a).getPreferredSize().width, + cartes.get(a).getPreferredSize().width*img.getHeight(null)/img.getWidth(null), + Image.SCALE_DEFAULT); + JLabel nlbl = new JLabel(new ImageIcon(img)); + cartesProduitImageLabel.add(nlbl); + } catch (IOException e) { + JLabel nlbl = new JLabel(); + cartesProduitImageLabel.add(nlbl); + } + cartes.get(a).add(cartesProduitImageLabel.get(a)); + } else if (cartes.equals(cartesReaction)) { + cartes.get(a).add(cartesReactionNom.get(a)); + try { + Image img = ImageIO.read(new FileInputStream(cartesReactionImage.get(a))); + img = img.getScaledInstance(cartes.get(a).getPreferredSize().width, + cartes.get(a).getPreferredSize().width*img.getHeight(null)/img.getWidth(null), + Image.SCALE_DEFAULT); + JLabel nlbl = new JLabel(new ImageIcon(img)); + cartesReactionImageLabel.add(nlbl); + } catch (IOException e) { + JLabel nlbl = new JLabel(); + cartesReactionImageLabel.add(nlbl); + } + cartes.get(a).add(cartesReactionImageLabel.get(a)); + } + panel.add(cartes.get(a)); + panelCartes.add(cartes.get(a)); + final int b = a; + } + panel.add(panelLabel); + panel.add(panelCartes); + } + + + public void retourne(List cartes, int idCartes) { + + if (cartes.equals(cartesReactifSubstrat)) { + cartesReactifSubstratNom.get(idCartes).setVisible(!cartesReactifSubstratNom.get(idCartes).isVisible()); + cartesReactifSubstratImageLabel.get(idCartes).setVisible(!cartesReactifSubstratImageLabel.get(idCartes).isVisible()); + } else if (cartes.equals(cartesProduit)) { + cartesProduitNom.get(idCartes).setVisible(!cartesProduitNom.get(idCartes).isVisible()); + cartesProduitImageLabel.get(idCartes).setVisible(!cartesProduitImageLabel.get(idCartes).isVisible()); + } else if (cartes.equals(cartesReaction)) { + cartesReactionNom.get(idCartes).setVisible(!cartesReactionNom.get(idCartes).isVisible()); + cartesReactionImageLabel.get(idCartes).setVisible(!cartesReactionImageLabel.get(idCartes).isVisible()); + } + + if (!cartes.get(idCartes).getBackground().equals(StylingUI.gray)) + cartes.get(idCartes).setBackground(StylingUI.gray); + else + if (cartes.equals(cartesReactifSubstrat)) + cartes.get(idCartes).setBackground(StylingUI.reactifSubstratCouleur); + else if (cartes.equals(cartesProduit)) + cartes.get(idCartes).setBackground(StylingUI.produitCouleur); + else if (cartes.equals(cartesReaction)) + cartes.get(idCartes).setBackground(StylingUI.reactionCouleur); + } + + public void addButtonListener(ActionListener listener) { + pauseButton.addActionListener(listener); + center.addButtonListener(listener); + } + + public void addCarteListener(MouseListener listener) { + for (int i = 0;i getCartesReactifSubstrat() { + return cartesReactifSubstrat; + } + public List getCartesProduit() { + return cartesProduit; + } + public List getCartesReaction() { + return cartesReaction; + } + public CentreJeuPanel getCenter() { + return center; + } + public ClassementJeuPanel getClassement() { + return classement; + } + public AssociationTrouveePanel getFound() { + return found; + } + + public void setNbCartesReactifSubstrat(int nbCartesReactifSubstrat) { + this.nbCartesReactifSubstrat = nbCartesReactifSubstrat; + } + public void setNbCartesProduit(int nbCartesProduit) { + this.nbCartesProduit = nbCartesProduit; + } + public void setNbCartesReaction(int nbCartesReaction) { + this.nbCartesReaction = nbCartesReaction; + } + +} diff --git a/src/view/jeuPanel/ClassementJeuPanel.java b/src/view/jeuPanel/ClassementJeuPanel.java new file mode 100644 index 0000000..2aa1b30 --- /dev/null +++ b/src/view/jeuPanel/ClassementJeuPanel.java @@ -0,0 +1,136 @@ +package view.jeuPanel; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Font; + +import javax.swing.BorderFactory; +import javax.swing.BoxLayout; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import ui.StylingUI; + +public class ClassementJeuPanel extends JPanel { + + private JPanel joueursPanel[]; + private JLabel joueursLabelNom[]; + private JLabel joueursLabelScoreTemps[]; + private JLabel joueursLabelPosition[]; + private String joueursPoints[]; + private String joueursTemps[]; + private int indexJoueurActuel = 0; + + public ClassementJeuPanel(Dimension dimension) { + this.setPreferredSize(dimension); + this.setLayout(new FlowLayout()); + + this.setBackground(StylingUI.gray); + + ((FlowLayout) this.getLayout()).setVgap(0); + + //joueursLabelNom[0].setForeground(StylingUI.blue); + //joueursLabelPosition[0].setForeground(StylingUI.blue); + } + + public void initPlayers(String[] joueursNoms) { + + this.removeAll(); + + joueursPanel = new JPanel[joueursNoms.length]; + joueursLabelNom = new JLabel[joueursNoms.length]; + joueursLabelScoreTemps = new JLabel[joueursNoms.length]; + joueursLabelPosition = new JLabel[joueursNoms.length]; + joueursPoints = new String[joueursNoms.length]; + joueursTemps = new String[joueursNoms.length]; + + for (int a = 0; a < joueursNoms.length; a++) { + initPlayer(a, joueursNoms[a]); + } + + this.repaint(); + } + + public void setJoueurActuel(int indexJoueurActuel) { + joueursLabelNom[this.indexJoueurActuel].setForeground(Color.DARK_GRAY); + joueursLabelPosition[this.indexJoueurActuel].setForeground(Color.DARK_GRAY); + this.indexJoueurActuel = indexJoueurActuel; + joueursLabelNom[indexJoueurActuel].setForeground(StylingUI.blue); + joueursLabelPosition[indexJoueurActuel].setForeground(StylingUI.blue); + } + + public void setTemps(int player, long temps) { + String tempsJoueur = ""; + + int minutes = (int)temps/60000; + int secondes = (int)temps/1000 - minutes*60; + if (minutes < 10) + tempsJoueur = "0" + minutes+":"; + else tempsJoueur = minutes+":"; + if (secondes <10) + tempsJoueur+="0"+secondes; + else tempsJoueur+= secondes; + joueursTemps[player] = tempsJoueur; + setScore(player); + } + public void setPoints(int player, int points) { + joueursPoints[player] = Integer.toString(points); + setScore(player); + } + public void setScore(int player) { + joueursLabelScoreTemps[player].setText("POINTS : "+joueursPoints[player]+" | TEMPS : "+joueursTemps[player]); + } + + public void initPlayer(int index, String joueurNom) { + + joueursPanel[index] = new JPanel(); + joueursPanel[index].setBackground(StylingUI.gray); + joueursPanel[index].setLayout(new FlowLayout(FlowLayout.LEFT)); + + ((FlowLayout) joueursPanel[index].getLayout()).setVgap(0); + + JPanel leftPanel = new JPanel(); + JPanel rightPanel = new JPanel(); + leftPanel.setBackground(StylingUI.gray); + rightPanel.setBackground(StylingUI.gray); + + leftPanel.setLayout(new FlowLayout(FlowLayout.CENTER)); + rightPanel.setLayout(new BorderLayout()); + + joueursLabelNom[index] = new JLabel(joueurNom); + joueursPoints[index] = "0"; + joueursTemps[index] = "00:00"; + joueursLabelScoreTemps[index] = new JLabel(); + setScore(index); + joueursLabelPosition[index] = new JLabel("4"); + joueursLabelNom[index].setFont(new Font("Haettenschweiler", Font.PLAIN, 40)); + joueursLabelScoreTemps[index].setFont(new Font("Haettenschweiler", Font.PLAIN, 15)); + joueursLabelPosition[index].setFont(new Font("Haettenschweiler", Font.PLAIN, 50)); + + joueursLabelNom[index].setForeground(Color.DARK_GRAY); + joueursLabelPosition[index].setForeground(Color.DARK_GRAY); + joueursLabelScoreTemps[index].setForeground(Color.DARK_GRAY); + + leftPanel.setPreferredSize(new Dimension(50, leftPanel.getPreferredSize().height)); + + rightPanel.add(joueursLabelNom[index], BorderLayout.NORTH); + rightPanel.add(joueursLabelScoreTemps[index], BorderLayout.SOUTH); + + leftPanel.setPreferredSize(new Dimension((int) rightPanel.getPreferredSize().getHeight(), (int) rightPanel.getPreferredSize().getHeight())); + + leftPanel.add(joueursLabelPosition[index]); + + joueursPanel[index].add(leftPanel); + joueursPanel[index].add(rightPanel); + + joueursPanel[index].setPreferredSize(new Dimension((int) this.getPreferredSize().getWidth(), + (int) joueursPanel[index].getPreferredSize().getHeight())); + + this.add(joueursPanel[index]); + + } + +} diff --git a/src/view/jeuPanel/PausePanel.java b/src/view/jeuPanel/PausePanel.java new file mode 100644 index 0000000..6963b74 --- /dev/null +++ b/src/view/jeuPanel/PausePanel.java @@ -0,0 +1,107 @@ +package view.jeuPanel; + +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; + +import ui.StylingUI; +import view.JeuPanel; + +public class PausePanel extends JPanel { + + private JeuPanel jP; + + private JButton reprendreButton; + private JButton optionsButton; + private JButton quitterButton; + private JLabel pauseLabel; + + public PausePanel(JeuPanel jP) { + + this.jP = jP; + StylingUI.panelStyle(this); + initComponents(); + + } + + private void initComponents() { + + this.setLayout(new FlowLayout(FlowLayout.CENTER)); + this.setBorder(BorderFactory.createMatteBorder(10, 10, 10, 10, StylingUI.blue)); + this.setVisible(false); + + ((FlowLayout) this.getLayout()).setVgap(20); + + StylingUI.buttonStyle(reprendreButton = new JButton("Reprendre")); + StylingUI.buttonStyle(optionsButton = new JButton("Options")); + StylingUI.buttonStyle(quitterButton = new JButton("Quitter")); + + this.setSize(new Dimension(this.getSize().width / 2, this.getSize().height / 2)); + this.setLocation(this.getSize().width / 2, this.getSize().height / 2); + ; + reprendreButton.setPreferredSize(new Dimension((int) (this.getSize().getWidth()*0.9), (int) reprendreButton.getPreferredSize().getHeight())); + optionsButton.setPreferredSize(new Dimension((int) (this.getSize().getWidth()*0.9), (int) reprendreButton.getPreferredSize().getHeight())); + quitterButton.setPreferredSize(new Dimension((int) (this.getSize().getWidth()*0.9), (int) reprendreButton.getPreferredSize().getHeight())); + + pauseLabel = new JLabel("PAUSE"); + pauseLabel.setFont(new Font("Haettenschweiler", Font.PLAIN, 35)); + + this.add(pauseLabel); + this.add(reprendreButton); + this.add(optionsButton); + this.add(quitterButton); + + //this.setSize(new Dimension(this.getSize().width / 2, this.getSize().height / 2)); + //this.setLocation(this.getSize().width / 2, this.getSize().height / 2); + + /* + reprendreButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + pause.setVisible(false); + } + }); + */ + + /* + optionsButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + panelController.changeView(Panels.OPTIONS); + } + }); + quitterButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + panelController.changeView(Panels.ACCUEIL); + } + }); + */ + + } + + public void addButtonListener(ActionListener listener) { + reprendreButton.addActionListener(listener); + optionsButton.addActionListener(listener); + quitterButton.addActionListener(listener); + } + + public JButton getReprendreButton() { + return reprendreButton; + } + public JButton getOptionsButton() { + return optionsButton; + } + public JButton getQuitterButton() { + return quitterButton; + } + + +} diff --git a/thematiques/chimie/chimie.xml b/thematiques/chimie/chimie.xml new file mode 100644 index 0000000..ea197ef --- /dev/null +++ b/thematiques/chimie/chimie.xml @@ -0,0 +1,168 @@ + + + + halogénoalcane + halogénoalcane + alcool tertiaire + alcools secondaires + dihalogénoalcane + alcane + diol vicinal + cétone et/ou acide carboxylique + cétone et/ou aldéhyde + alcène + étheroxyde + aldéhyde + acide carboxylique + cétone + alcool tertiaire + pont disulfure + cétal + acétal + P20 + P21 + ester + H2O + carboxylate + alcool + alcène + H-Br + alcène + H-Cl + alcène + H2O + alcène + H2O + alcène + Cl-Cl + alcène + H2 + alcène + KMnO4 dilué + alcène + KMnO4 conc. + alcène + O3 / Zn, H2O + alcool + alcool primaire + alcool primaire + alcool secondaire + alcool tertiaire + RS16 + cétone + alcool + aldéhyde + alcool + aldéhyde + RS20 + RS21 + acide carboxylique + alcool + ester + HO- + hydrohalogénation + hydratation + dihalogénation + hydrogénation catalytique + oxydation douce + coupure oxydante + ozonolyse réductrice + deshydratation intramoléculaire + oxydation des alcools + oxydation des thiols + cétalisation + acétalisation + oxydation + réduction + estérification de Fisher + saponification + + + + Régiosélective + Règle de Markovnikov + Catalyse acide + Stéréosélective + addition anti + addition syn + Catalyse hétérogène + pH neutre ou basique + Chauffage modéré + pH acide + chauffage intense + règle de Zaitsev + oxydation ménagée + oxydation forte + reversible + sélective de CO + lente + + + + + 0 + 1 + + + + + 0 + 1 + 2 + + + + + 3 + 4 + + + 3 + 5 + 6 + + + 3 + 5 + 7 + 8 + + + 9 + 10 + + + + + 0 + 11 + 2 + 10 + + + 2 + 8 + + + 12 + + + 13 + + + + + + + 14 + + + 2 + 14 + + + 2 + 14 + + + + + + + 15 + + + 14 + 2 + 16 + + + + + + \ No newline at end of file diff --git a/thematiques/chimie/desktop.ini b/thematiques/chimie/desktop.ini new file mode 100644 index 0000000..2e164ce --- /dev/null +++ b/thematiques/chimie/desktop.ini @@ -0,0 +1,5 @@ +[.ShellClassInfo] +InfoTip=Ce dossier est partagé en ligne. +IconFile=C:\Program Files (x86)\Google\Drive\googledrivesync.exe +IconIndex=16 + \ No newline at end of file diff --git a/thematiques/chimie/images/P1.png b/thematiques/chimie/images/P1.png new file mode 100644 index 0000000000000000000000000000000000000000..9068deb5cdd397227098cb67648d447839e34c8d GIT binary patch literal 1567 zcmcIk`!^E`9ACH8s3ozyQ>1wfGkN5CG|yQ^%+b3b(q2t1v7| ziV8y=NhV|%vR!3fi|*=A=$w1L=kxh|ALsl1<@-I~Y!|dWNJ2pZ004lH4mPeLC5dns z_?w6kQVBefh{rg1;Q@ey&wgMRSi><@l-wKVigp8h|6#_SilQE|2&B!K^NAmpD;kqN z=*wijU}hZLOiW)Dr)av3V&imBjDoTDp~fhTS+L{Hs>|ug@{S)f1EQi()FA)9)0BAD zkfc79wM}euJ&ZX*?mpwv)tnl0QAhu4Pxa7>O18>(bMysEE9s{iN(3l3YJoiUalf(k zRxzHSH|qu77PnR|e6e|A=LFmSQ(szVDDP;|KzXMzPuicRO|oR)@jX1x;1uLTJS|u{ zD`Y%5^#*ABID5LQ8kb-_T$cd>NlSct`JiK zs_6W6AAb;Mrvs}2;h=fIA~QQqfmB;RS zQpLj61W;D7HJyUl?}MZFhpCJ;4MAo`#3B*gxB82~>+FsTk26BFxY9959x$a8fA%-h z=OeEwzi8rmv)C}&RiSY3S|5W?zQ~|@7&4-KU-vFS`V=QZEG69+LYUu$g4Zcke}ea| z&+Fxy#a<;nYf(t+G%Gc{B9oIwBs;FmSd;S}^$|GZ8^+y#o zgm_Pf&o^3ai>`S<4!xYE#;RaGqEU*=p0abdn>O+%efP+w6SZHJ@z1!+e&t@d2zLBt zuK!Exk8hJSQ=1p)$8U!6#ho2zgoji)77v$>{WG4HQ%D3%PbjoTGaAYlvu=HfHLeK! zZ1X0Gj&rbUe~7tc)F2S7z3O>~nVoX}RNwAgXNAVgPdN5!mKe+PPtjl*Q#~Yzz}_$v zKYnEvWw8EMF4WrGIU_-LA$!1e@Lv*^*-+}`_hdAvM=4#ApuXF~=~x}>fPlhr(;5;K zA}--g#bVv;x7yu#TI42AgTeUOPc86pc+RpfT*VEDWoOo=zEnXtVdIHeiyrND%FQDr zvK72wj1pY$y^nz+CqPg&Ic1?J;7ltcXLKt(WxHyCFc35{68*i&BZ6l(JiO(~ivTsY zV-y%@bWucWIYO=*BmU-mX!5KOfLd;&9>h9r^5nv!JImw62?O96g*nej@5pPx(V?3_ z+WZG*>!~VS{`t#EU2AbMoqa?pzOal%iS)sp?Pj)>K+GrAz&4RJw9^kj{s##67Qx-5 z4S&Q;>m6VES{Gu+YP1p=@Bi6*5rj8wAK^__s<{uyA-MBL|Ja}_!6f=Hn7w*l*>km1 zo4V00PbXQa((Npc*3UCnCFH$SR>SpjEwkkZO_aneGDLqE8E5Mmhs0WkApt+x9OkBH z4TCwrOc6M}Ko}GT(|{Rh8bghsrcgtu0Td2B1%>Hrm};7cN_t_YqQF7N0BYi3paXM& TZ@9WAh=u}?wrHDrgkSo9Zb|cc literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/P10.png b/thematiques/chimie/images/P10.png new file mode 100644 index 0000000000000000000000000000000000000000..ba3703367a3cd7f7e41d5ec346a2a8302defbf14 GIT binary patch literal 1126 zcmV-s1eyDZP)dekr!M&-Q#MZT;L|z%8d2!y=P?0cC6xj zJ{tl}LC5f*IW7vch?awv5jySym=S9B089rRdtj!6nr$$1LB}?*xuE9%ASZ&Fn>+w# zfsUIzU}u4v4IOI$KLyl`A3q(dh+ny86~WW7ir_VCRus8f&5FXNV-@JstSe?ZR)Ipz z`U2MJ_!9Q&?Mlw0HqBc_D<_ZMp2*p;bQz#ycs2}JLN+Pb(6I)#jX7^lDYyxoj^Wun z>|B|p;5POIk*Ck^-UL5=ef{$G`u_awjs5Mf55>)&FOR=Jz6jMTOPs2|4g=-rSOT*g z+nWcACJH`fmiH#u%yL{-`SGsZSQa*Z3rz;-SOD>kJ2m>7s56i&^=W$9gJ3h)u|153 z1~Qc6ZWnuU{Lr^0G?(i75C0;PreN!g?{g5FIpbKTa2v zr=>mjz096o(@wsY)7}^kv7+%YE^6PK@6&tBc6G6l=8c+_2j{s{u8!n`^ZYn_cVaB|!A)QKtj`6{t0Z}s@-N+L=@HzsLcP44zbPSKKXM6&8DMi$D3=jS~dwbcj4MV15c$$D$ z|2J4|d6bO0AGJd07#}*uhmP@~V|?fsA3DZ|j`5*me3m#KST3kj?$j(sL(-GNv6=r0 zJXwK6j!8x)IksP7w+^|!V`ueNtDOD4^jvKrIr@xMSO7m3Q-;aK~|X zQ@wnc^S$%Ic^luYZo;)lG^38)#e$p#;cUmD#r!(ox0QO93cL=r#?!(AV$R3UhwNk5 zacI@muKKp5=gs;!R4aGFcF4G6XD!ahtGnKD9GW)=)~7p;I}X*#ov)onFzQd~7rH!$GXglpwa z*ba$0AD3Bv^*JPI()F>mVaRc~7Kw(>B=DhQeCQY-I>v{N@u6dU=olY5#)ppa`3Lve zkAlW0PJI9X06%m^SaeBlLug3=Np3@ENj))BFGD##sB~S07*qoM6N<$g7k+I`v3p{ literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/P11.png b/thematiques/chimie/images/P11.png new file mode 100644 index 0000000000000000000000000000000000000000..783e3ef25b595fd2b045083889f523cf77b1d67b GIT binary patch literal 1137 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 V>%`2J?1&G5NVbkPoO3>D{{TbdnFs&? literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/P14.png b/thematiques/chimie/images/P14.png new file mode 100644 index 0000000000000000000000000000000000000000..18237c78873ef91d770f5f7eccab15b9ced3396e GIT binary patch literal 874 zcmeAS@N?(olHy`uVBq!ia0vp^ML-N3g(Iu2HQg% zdu}jSInVmsjhdJ5A&oH(cH*QNm>3=Lqk%7(?o57oL9cH zL#L!%P8a0`$((5nb(^lLy=<3HL~6{bd0Tn@{e+37xAtD0e@V4cQt|bdQ}3^~9a%Qna0XXopsdeJ z<5ZPpPGKSMP1MU5<}Yzi(vtl5CuzY1i&t`z1Z| zy?nNg?AK`~onMmH?o!_tuvg~h&G$Jw(pPVuck|wgjc=zvj_BSZZrAuF(Khnh-EH?1 zZmm&QUT=9$cj2bp+rC6|&3CBUV72${6|?hOc>MUk+pSf+9=c;&q(#_wt9*fL%l+g3 zoXq;MEAlqibu;ecx8CQJ%5&Fj^V4!Zer?*tck;=r=a)t~zl>bd`+9@rO{we8U-epl zj_I~aXVP7BDGq3kM%YX9{H^jg`g`|2TU&Rn@6coZ{aKAz!{Z6NSO4*fC#yqW0F%05 ziEBiOXP$G0Cj*$YH4N5wHuEqv^4Cu`)HT*M(KXdI(=gIB*UvE4HT5vkG1N8kFczGq RzXYh6!PC{xWt~$(698Gwigo}1 literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/P15.png b/thematiques/chimie/images/P15.png new file mode 100644 index 0000000000000000000000000000000000000000..9686e0c5d739ff2a265a97bcb9f7930fec8ad315 GIT binary patch literal 1024 zcmeAS@N?(olHy`uVBq!ia0vp^g+QFj!2~3~M$ZOGa29w(7BevL9RguSQ4OyKpdedG zkY6yve-Jc}kgjE5V2<;2aSW-r^>)_T!rKM{ttaCa$=Iwqu=0SOf@;L^6%8`Ar(G?h zRF^dDXj;PLtLLZhBkBkjTK%-t*^^wPFouK zHYMwU&$5biqodZ7HSf*z`FJj+t6VL3kMYb$b5DxACqrubp)dALJA*w=9^JvSOsx3T zwda~M7X@$8oab}0L~!clmy_lcr)7n2TUoi!$G36TugNPLi|6^QZJgDn5X}6XXQm&+ z6%($RQWnpTl}IgE)_CH|0ZZ*=lNn8WrwU%y1gcU7s`8oP$8*Kx(OVo_wC zi+%pr{oiuy-#Ynub#n1?F4yO;e<_w~>D;~Xhi`?_g7vdM72a>Mv6U;!-@mVBh1~O` zT~GQ=99~@c^0?S{st>z1$B9-e?#ryqx~ug6{(Sdmq4nDSqrbBhrrp~7WY%gH*JXT{ zGoQcQ)F@`?z?W$xyY9@l6;GMhPB|a>%B$hpsvXzr&zC>jueU6CMZ0)opTNvVQ=Qxv zJa$=D;kr`rMaD$UxWodMs!pai9ABJ(oY)$cs+}i9^c^QSC@KZ-iRxhK60&^cx~u{y zm(nFZ6U5|AeHC-ZK`Zn3uA3tI$x7Rpr)DOvIz9j8iw?Jy-@1K1b{X}?=m~VX<;z+( zzc2svD13)@(0=I!mDX3nu9(j+d;PYo-s|bxcaeL(e4PCyJVc#$@9O%yyQ*gHx;HiO zqQw^5y6W0Mx0r|Kz%e7=9r%4JseVM<%_=AG*Lc8>j$#o9X|RvxLpcczNIuexCP zb>~u z?O@s8=kqM{!&Z}E-_lu?QsEt$>bCjGGs|s5<##GEhhA;f)bLN+`+3W}FW=97le+bN zt|8m+e~vAg-=ov>`HXEVGPPHK4(@8dW+1BVSGa)@t7%NEO3}b%ff7akKG1O@%D=_bwmAFQfc;-20crt)VTf<;|XLAojGk^VL zLtPVHQ(ZG%a}6UMV@(VF3=0n(6J0Y8BOOCsV-Mq{EA~wSn!w=c>gTe~DWM4f2Qk-q literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/P16.png b/thematiques/chimie/images/P16.png new file mode 100644 index 0000000000000000000000000000000000000000..fc4d32752aeadd592eef623df800e44d34196739 GIT binary patch literal 2045 zcmZ`)3pmql8(%4h=rp2GeT267$2QC{H5RiqqL}TK^^($`C5#+4Z<2K2Eh~zAbdU}k z%WG3&Bjs31H2E`%MZFFqmBYNeyM|zU#T}`*&UU{rf%7bw7vuIqyw&U%g6y z6$}PjP4IB@QR0x&GSrtVecj9~Q3)E69s$uX*qY~ywrm5!^EYKsHO7bR3tLzmSc(A) z22;Zj-1Zze1&!vvW)9fu?EQME|Fxli;epFYy63pX!1A(~Wvx-aJlCQ7uk-)Nd3{%} z!5FD;0)v+$`V(uaHMbJcE7hN*jW?WoR8di(TBGAn(HyLy^3^1|FD9oRmHu9Lr@Odf zYjWeDOe{_oi@+`Hzb1!HXnLvEK)5eXGvmRt6kt0=leftimE!eKwgLpV`*l5l%NjK# z5_0)|X|-VA8x4scxvFG}5$-R$%j!4%Zl=cNEqf+;C-KvAUcpzpgW{`Wg6LNmF`OsO zkxb@~`AOWtf^2Q>+03>lN%08wp17Ro6hWk_e2mdw<0t1_^-~3zw(+}LZe)z%6$YPl z;)H%jIclWo)Fg!hDt-oLIk*O(2Hk;-M;1ge8rd7fXf^=GBgI_yy6vG95 zX<1E2cy9y#fos2jHV6u74!M4e(R=Zpeb~uOU=Yr-@|scXSk_y3=Bs+W4D`ut_g>^@H1qNaysEstLYg`_{;jM>eJ|uGue!^8 zq?KEI_Vb95dU(?MZR0N8Q&Vd}-e%yBAM?U8UQpY6N5CRZ92-AC+_yp;HkbT)1$c%R zt4Qsz8|27@x4;mR$3l48VKHSWE8<^hL(#GQa`A=lp%yz4xFB$S`il0g8evFa72W6AAK!%Wg?~A*0i!IfcANh z;WJ6AJGK_eLV=^W7;P@F>ED6y(eR}}yQI|(Yj0kzksjOw9gES1psdG?2#ZP$N%kcc zSl70XFAVYI+v-S7q}1x^HGH@A64l#z+*OU*>5MD|=DFcn%CK~OPH2Qvr3SPkxD6uu zFzwth^ilQG>R0$$5{Hg0YudCZiMVYKk#~O+0Oe)(YM@55=ymsEL35YcIs}u}0x#Y7 zP#9}gsiAM~D-h6ilr_+S4=VrrLYK<>zp3htZ~DYomn??6LjBa_$X=HPQdV)xxo+zV zRVWqE@`e6_t!BHm3H8*+?cC~hGd$-zul>|OTIKE;uRb<=RL<7Qubuip3i?xaO4&_H zrR-Fxixj_UCM|YeHa;F19jEuF(It7klXQL;>K*ID{QUTM0`?bXqJ!wy!7PPkgO*cC z6FZbIJQ6kDYvLjOa!XMd-L*Q|vFF~dPH09R_pa{garo8m1G%Q4-n?1lc?0Ir@5lr4 zss<>V9@0H;g&FG1ocI_9Ke%AlV@z(33YIza+xg@B=!sy^R^wu!&2WOlv(o~AUHlJjBh>Q1KJ#tY1 z1WpdTiXkUPMNbMor8PT}n!O^!M6n$$P9%{A8S|o{tG{RquGzG<$|ivYZKHG>+xw(# zq;#hUlvhKSYqL`FuZH~J$GxD^V5j!Y&501H{7?_Y;3+W#hU+l`Y{@&Ld@WsVJy2*e z+RNG(Z5fOOFbErjJrZSwL;)xafU*YAfHlGnX^TLikSMg}F$`esVSxhB7FfW}18sru fu&}pKvXzKJS)kC!u>Cn*%9UUQJlU-TM^E`1DBI(m literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/P17.png b/thematiques/chimie/images/P17.png new file mode 100644 index 0000000000000000000000000000000000000000..bddc6cefaf90cf14d92fbccbf41ededefd18d156 GIT binary patch literal 1212 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 P00000NkvXXu0mjfc1$zN literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/P19.png b/thematiques/chimie/images/P19.png new file mode 100644 index 0000000000000000000000000000000000000000..acf81e77f223e8eaeaa6dfd45a5712fd023753f2 GIT binary patch literal 1400 zcma)6eK->c7#}UsNjk+b=c7{Fnc1+-XRa7q$9ycu?4hx2zVdNt7x`$UXp=|2hQdWn zh(kVNm}23XxiTL!qoGz|m#;^iPB-`0{dv#(`@Qe){XOsV{`Ed@wm07Wz3GInEZ0EwF;?oP_6dZi#!1jfLg0TF%ZN8vl+>E|f=a zZN~3tJNt75{08ZClfbC=LUC(y24e17gRg=T2Y47j=@-Ao!` z6I`Ja7ZqTtQS&6!>TuneF+l?D@exI9t{`Ug*o_vb!+=g>#3AVvGFH-*s2fJF<*>%0 ze+IWiYQhedips=rOX|jo!}>*#pK420_jX;8U&^9O*>}fIMmNh%zVD6%o?A(t+_A~F za1-!A_$5FdQoy;f^48|Ry1{PCbV`|^B6NRHPbm|nhmv?>$^f$KnaraHDs z!Q>OZf~F=^dlAp0+Lp4g6n(jAfG^VB$0)(B_VZur7%K&$pD)x#GxTj3Jdg5SKt1!e zhI6i(&uOT(00-ufD%3BcExaC_!kOI~X6QR?_Ebf`BYno}vNs{w`fIGhq&f3_)GycV zvRp$NED5sRA(1&eUwH@r2OJz5gLWo`$sc9X*N~u|8DYk{TucgSyUSY^wZ(_%iYs#h zI~0Lvp?I0DC%O1Sz;*1Qc!y^u^GL1Qwe@x2-c-9@Co9QHdE4~Opkkk4{xr-dL!m%& z68Xan@?1FPwd^lNbMWdy!QpHY)D~#na-25lzFieF&LpPcwq;WdgBnDBc?~^xB z?_K^&seX51+#jGm0qk^IRX9`HDvWg7J{%Ti-?uC|-}vbqHKNayZRdk_#+TDf&E8f_ zqVajO@wm%*dYNOE^nwMRFz~v0nx^5vJIH-`@55&p_f~!C zi&Zzcgyd|`Y#&Ob)IYCbK3RFS?v|!DWsgXUNF5yNz+~tcj}Ax8rnSS$KYoVpcm*!5 z6Q@AqXoFFj=+ok<3QRK(H*Raq`NDk?;)!JPUuAS^D&6#q-a{v&Hr~$2Amg?SVlDqq zjuzEC%V1b7Sc@7@GZf~AWM*4E3) vl7g_Xvaq(W0V5$O%W$Q{T0s$5YbY2CMM6;!y1Zgrxd4E};9VQekkkJG1euV2 literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/P2.png b/thematiques/chimie/images/P2.png new file mode 100644 index 0000000000000000000000000000000000000000..516c650e3d4bcb4ff21afaaf9988761b857ae0a2 GIT binary patch literal 1941 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 F1OV>%2VejI literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/P21.png b/thematiques/chimie/images/P21.png new file mode 100644 index 0000000000000000000000000000000000000000..b85c779bec8814e17c877a9be085af9604773057 GIT binary patch literal 709 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 literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/P4.png b/thematiques/chimie/images/P4.png new file mode 100644 index 0000000000000000000000000000000000000000..31c62bbfe146941e1abed60a6754a69471742f9b GIT binary patch literal 1982 zcmV;v2SNCWP)P( zniWWqBd5+Zp|yYsl}$1Zt<0$-NAe1+73fSN?L}7q2!I4YfK34P3hzehCYvl&U6CNV z30}OvzYm0{H+p2>0g0c}FtgB!*&OwYHj`$9v$y;BcYoj1~23XC~yRYEv$`2-6$qhV;3kPlW$kz&ng6;usSz{)C8tQoC>ssRu{iG>L? zqe(c~hXW|LFo9+?2`BrAprjWg%8d4am}x zNwdjHXm;^*wB1pkluPecTc+7$4K%w_Iwb6_A4(^7lkIC(jb@jiPFBy~OTF4R@r-hB z4$W?m4mtbPO3i$pxi95rx81cqXm+!7$P7RS_0xFH9%(j70)vB7;;w`3=k6Xwju_aO%{-lH(6#&$cX%qgd-=%$`%dB8}RJ-*!@5dI*o(yUpsYtUMMAh9f zyA(UI??2hTns@NbmR!EX*l6}f%*{3i)9ePZ^))t9kfz6M$+IK0f@W{ULOxV6)Nhc7t?+``dpvH)o9U~aM}tpF_?%_hqr){YbHktE=1N3%&1 zaJ564^@p?tt9G0pm1F=^JDN>00ID6>lvboUD7B;6BoCC@aawDV4Mgo|Hd%xG@=1@6 z$b@DSwFsA6bZ|s6G@FnH&}^a;noX)<-PwP@o}0ofbnp5rH`4R2-B4p`#MuH1f7jgNvnyj(v&KObIRI};tcXKBwtYq0)EI$()2 zyK?(UE%sMP?juefuJ*6o2|Z8ip5B>UK_wrsq?uj2{iGSr^y1;lI*dKcaU>x)^`|tm zYqy^?W9&^{M$X1Arvp|*iV^W<7j8dkMqof|2+lC>9I%e{49~I;VRpgxlS<61(lV(fXaxJv~w3lW}+j1>vHUxp6bWi=We%>9LRBiUVZ~r1|%g#o_ zzXT7jW-poSJu~1#R8Pb0aaruw?cYD$-y5?N61cw!WcR7Zag|`?i8(2W2D9z-?^8OQ zlI)m0Uu4}&_IPLNXI_LCowj`G-rnYZ+VB=!&56nlF+bpgpGU{sk9$5e+L)HW>4X`< z$lua(QWynhJ2#ZMX`L3vclMpl&|_ANEIMs@Nb8jZJ1?`S%$h3#c0XdLVs?Y6<>|Tv zh9j5JQ&V8J#p#@SH!n=!PIu4y&O8u-Med9bkIU!Vz-n`QBYR&Ac^GLnqVi``I_~XcmKxtiQ6K?Kj&$lkIT&?@CRef8%)-ssz5-vtx|8=8uhy zSRXrQY-CuttU40D`tprncn3F90*=Y&Y|YNokeER45UMZo*R-4z2H))2BqTq7v#AH9PH1BG94YH{X}9 z8R?d3lColn3ph!g*InIgQYi3`x#jzU{syaVe$mbmE{LIoKoBX;#K{&YrrE4BKKu`y<6qz%8Mr0m8wLfR+g5lKDep0wC0i`lr)c&Cg~v(P`Ic}4zdRs8keRij`} zmfvvl`DBK)$S}E5%||)F`g4d&f2+svjO*EKZyB9~P@Jv+v1J$FR%uKn&=i1LE}|eV%iSwTpbC6Qo!mzvS4v`*cU8aN5sdi6WZGFD^@=ir)D%3lhC= zchcN3p?%jz+bWshytKy9KGZ1saV~-*@zcFMWx5%Ec#Es4e)B6^4eriQx-8uL(MH%l zee~qxZ_I(Hbg3%C-dduw3a2z@V+m&DuCC0WZ_bt$W(aQiKiypCwkgmq!LVq(vYaL$ zB^Md*Uyo3)1|_6^nUSI|^RV#w+{O8&lNG<3UAWT!19F(QF@l>dE^a!!B`MMaHS3kq z4Kb2kglg?voKnYB*1}O9%Yri*yJynKK*JYmzWuQfR{a^;!D@*9{9vsrNbXvyBhrI~ zo2&JnxYrZwL)~!-7Lr24f9LU5>8x~iGNZbJ*S?s+yaPSLv0bPz0znHj5teiYZ$9{!-DY5C#sqbraG zH&SR@0T3}%?^AcVJ}hifE&Op-jwV$`1CxSHn0T)+w{a~zdQlBav`(PncAjA8U)ogq zVU<#Ob&c%oZ^zS>OC%x6=JD^nR`zC&cqYR?oUN=l)dCn@zn{L31gQ{?6jCl@Fe%h_ zzx$?ZQ1~DR!&)$5C&DK!{hMIV-NMU9)XFqGCtFQu-Ly-hOjUl6-AE0G4Wky7m+Q_a ze@frtY3K>Heuq*yKTK;jrgZvZ-vy+v%xvIuoF7NKyrc{j^nu?W`dG1Cp8zXi#mmGb zNZU?Uj&;c>q+)mEb8L!EkujZa(Gurtvq;4pqNXhT%73vfeTmkcyEQ}s#E;i1#DX4T z#U@;_0{zQalmn7rLPi-90`-wzC;+WxiZB8U07JkSFwsKm>LXBk$SVebFNJ;9F43$F`!ywLE?dr2o044Pv9_XL+OR_Ppe^U18#&o< zLKZqg$YrRNTWKAaGM9dfb=+p|>@f1^`RDoXd0yYw=ktEO-hX`m`2O=vI_~KX*WRuT zgTdfLf(v<__3Me(R9SD{!vK?YXk8-sFkmoU;rDDXusnKWU8*z5o)p;H_W@2L;?_kh z(Z$(|)hExY&&ry0v+`sg)AOO-Sk-{d`+{~Rof7_+pYyQxaIdMY zVo2PqzPdxFT$D3kZ=kL^a%-zr=^cRc`jKjo8NwLEa!I}Ls)Cpqm5E7fye^oE+bY@A zg#CCVZNiaz6HuphAZk?yZaL)Bsh}Z5bSmUZ+4BxD6)gxXD@>fNohl-KUp#7p0{N(VS0;frLH!#YH@W<`5gIF6d?U^q>{K zL&Q-7y?){PH}#eb7+^O{Qw@L;Fo4}(oRmq# zUY^|d=UTJH6{kq-V_6gKm{W9JC$!~Ojx~&>k6vAA_ATw7s%sI-y~_UfQ8~O89BJ3n zcp58r$iGWcgTw_*3cgEc32}QN^K1QCkpM$?xksM4wx7{A&AuMJZOsjZOuhd4K~xho z{ZIZy0g_!Id%(7EPJ!-F1M2N`=vGF@((J-nyQ(9KGj^m9@R?7?XF8KQ*+4nBY3-Hx z_l~uM8r!4e@c7D0ep{o}TDFb1s(=-FbL_O08b9|aX8#HIofRL{m$k^?Xw_!wj;E?h zE%tKqRaAV%!hwXCu2w00A@wlq4qjujf9!qWwUj@ZHm_kI5Ko;GSkNBuHvT$QyFg&-xNV=ihvE69$@I4fCYO@ zF4c>AI8zmmBTrp8ubD^qv3yF5(z=nKrKf1lMQ{IyQc^Aw)~HNsNPoLwh~@O4rd~)6 z)$D?0vG320sQEQ>9q{PU?yP)a-NPRLn6P4ESMpm(D&&z6;EeYUuLUW>Vw+o!A>Kbs|z z$$W-zdiB6ty{e5s!1-Wecgrb4hd080K$zF<&8?huD1N-Qf{3IMF^h6v-rrkGm_2p7P8i_StUj)MUU;x?wz;NT zEDw~#Wj_TwRd?<_m7^Hmqnj5WP=dUo&yy8KS)DZ7?Hx#wbRY46em0cwKhMgzU&rZS zQ4KGN*2aAje`PzEd~T9oQoOnt7`)I^0SqF&{;n1HoS8MhDj!x#IC<5hOQhh1W0EQ& zC?tKn6wb&+f`|9~uj72vkkUL_yLwp>>z~P!>3W(;yojd}VgG4IGzEph0|c}!J`5Ft zu|gxUNIN73X^XT+0+!f4`%yHE6&48)_F|Cs1k7GE!4}2*ZuSD!sBrW?6ayX8;hwO* O8Af#VbSXI!6#s9|nvDej literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/P7.png b/thematiques/chimie/images/P7.png new file mode 100644 index 0000000000000000000000000000000000000000..9ce29dcef2f439a650f619d61ee36fba6f37849c GIT binary patch literal 2209 zcmZ`)c{tPy7ap>2m8{K0u6=9F7)$ou454f@WU|Fomc&eUvW#4j$i9U{HT*Cr{p?Fb z+el0jaWMwf*w=9R{`tOtzUMsWocFxvdEVza=lpU0zGP#;%XO9u0)g^Ae3_m1j5&S>`a34mUoUwHoTpUJ>>A%G_lZV2!wqaZEEBY_Vs76 z-t8F;0rQ2nUIp4at|GzS5r^SQ`@v>(ZZL?n5hYx&DzJ1m@?q6i@MM^Yq6Ih~oHM&D zy)xM!skBc)NQlEY?m)s{erIq)mOI5j<}f2`YKu-&GDPt+Um%{t5OowN^QDza47745eNMdu4+uJa46``w;2}Y$+geGlAM)9q4^U+} zhQp#&t~7TJ&+uF>n(LD<_{4^>=ezd<7(%nYE;G6n;L7zn~G0*1BFtPYKm#Mz6 zt(Nx_RiTb=x89W*xfZPo&5{4KQB=Nfi17s)NMkQ7g8Kpfusom$_Z~h3-^r<0N(2%P zq@xN0c_i?9R;hqf{#4z?%HU@JCDl$8=~Nm+ydn|?aVR8?=hi0NxZqv}oC5C~(~UoH zS)A{lSW*jV1^7M!M7USgWd39FoL?o{G;eUPQw;jtPdl5NK%@v(_WNH>Z(f`X#@>2* z9nW-~(HEhLonpq7$qXVRX=Fwx7aU7__{*;3NV(fJPw}?Bj+%aox91xy_H6iS^0Q3M zCbgNzhM2sQQpB6rG-Wxi)vJ;P@-LSB&eUTa3w0mFQUrZuBDs!~vg(yZ2fA6SvgD`~ z!2;z!JYsw8=7jOZ%06^r@hp|N!`5+2E$Px9dT55!45pL?7Y^w71w@oUqt=egANl@Sj*RVty?|k^w(A`oiTscu>Or`SDWGa&MY~l*?U!^Kfx)lCBNS zxzEJv(@IJx)0NpEMX68-LjGbW_^VB*H?6V)`ydf4NiUo@kUv*}Z?4*Qq zQV32C1t#a~o{%VSh)+C=i>LJC1KFXpI~m-tF}G}>&N9*bJVkJJNc5E<2Fs)2|EhM17Za^+t%Hpnk6aqLcewNSk zSPb_q&hy5O)84XQ+b|D}w)UQ|mc@Ovw{#(XTW_9J-Ik5nv0uShM%G=#95=1RaXO^l zm-50x>}VV&M@8(@hI;k}>nc4W53;$syy17D0SugIRGKjDOPP8Nl4VT5_DXWQsSqx` z?O`dq-N&x`UkyfHOtWN_Zjsyl2Oa>m&#GY_GsZUA*)ce&=Si2;kskP=GmZ48wH=4W zgP;TybV@7PE7?`271f9jckxy!|4Ok?T)O&$ULdlm#6OY0IHP^VTVKbbuuHcJX<*Qy zd)av_!-V=Ge&BRxpQa?igaap|^(1<0WlbuZATeg1)I(0o*$cfIPD)NvnNy0i>kFo|Mp+5B`wrXvu*7D3TQ@elm6xe>5DvgG0XK+ z4Xewsz7Zpn@?}n_Vd`vV-HiF`vHcqlsY$^2a*4&p=Fnl_p#Z4OjJrFe&CB)@`kZff zw5E%V$D&RBW+AjjVhQ)hsBTNUsb*Gn3^FDxY)uKj!2VVSgec0E$Fg&O)u zs|94m-G$GLHSMmPbjuu^2)iBd8Hr5NO8|OM-`(4r+ZZkZ7=MlNfFZh=+eoPOQo**5 zmDd*qx^|ZDMFKfvI&*ca{4ES8)#Ld7vTN+^v`r{(A`ZZ)?h~jfZ`R89<$8dYt3O)A zH|asOzkl{jEj)DR_84zx(Y%;OCGMOpdqiOZ~^9vP}ER?tD=;VD(WbNGF(Lsr3S+vlge5u aumHF!ECk*kWaNIN4?&yRm;%P`@&5wQ4I_yF literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/P8.png b/thematiques/chimie/images/P8.png new file mode 100644 index 0000000000000000000000000000000000000000..830fd694260b018037094bbe1f3131b66dc3c5d1 GIT binary patch literal 1961 zcmbtVc|6pM7XMibkq8meWEjkkHw#mikfj;RSdyhFYu1}F8dx|Vmp8;K6^rpl5jRW@jr5nC3&z`5=#cBNIgb=?>&{>BUoqU; zg3o%_kH0aH?%k6}EG;{^UMZa#R3h=u>1i)9K%SmX0OUm(fR+SNBzI$Tf{8ioQgnbh zI6c-=?TNnIIqQDeRB1zyLQYx^oH4&S*K>1kvuKi~@+-5IAG9u?GfZ1D{F zfES;NoOmPw>4f$(JQ+tz@u2#F6-rd5mB|anP(nB1F+tk7R#{rsNI)G4K_xkNUh@ev zeP$&$>okrE>}uvMTiIplp=l8?vXA#)wGapH^~=u=@R3eApFCdb^%w0Gt;c!}5W`_0 z&EIY6bNBZ{VrfU)CE&TV4Q@-hRq{+euZ+H$M$nlqHH?5ljbt38`D zu5RrO1xai!L|G=#`}$`owp@EK@yJgd(685c2f0tv?no@&PPY>yu|-X(ak)=DXg!x& zz#luIBsS7LM7H{Sx&(3Pu-%G^Y<0JJAGlrNxO=^aQ)T2ra!i4__qf8wS=|NM4jXlml{tPpq!eCcL&dyja98#ksJ|3)#;r=9#sEX)*7R#-q68~ zSaRCo1M*cb=&yi^joB@G#7o)^HvsS5GG&B}d2Gqx!uep{7uK;e)fVQN*=PGBx;>|t zsI3=Odh5Ub_@-)B*bYrdbvD#G?^%B83+=rm!vmsa^lJk&(Is3soI_&0g6emia@`!c zmIifZXM{fQ1FZ}ojH4E9bt{$i{XqHLg&B5iE^F?Qt3tc`SAD;LX%CoGj0ZEbq0O&e zNfN(a+xi0JS9%^Bmwe|IvbU|Yh0Ql>Zxr1ptCciYbbs}L9!UmppH~K|dO-jyWOM$1 z+5CSN1Q!rSdz^mS(-AOsk~R|_`IT!xI7RyxV#%=#zf;A)t5uY@rT|GA_(8E*c$`}P z`}Ht!moEI0}QeSPw3ov{q}-l*JBtPmBn7XV&tpn&`Km*By$}RQ_dh_;zrqh%lqwmyd5&qI;zF@xRjg0 zr(Lg)T#qN|75@l4LT|No*E&3^CQe+aX$z?7^y&l;I?nrsV=O#>z*M_^vK$xN@m{e` zmUO?+S0bGFQ~3`T?Aun>TT8kpTaixMww`^=2S;juz4F+ND0OOlcjSX_vvL)It6_wZ z)ilc?yv=D)QEB?a4Y``|_B76LYIVC4h_4!Kd?4NQV+zd3I`6Ld+P-}Ntmq1aoLqsp zR97bCMB8H^ZMNc7#JduqN;-L90B1>qfR!8yQvoLim7j?3EUX5}WRo~jA%WyPur_#T zZb_RNIIFHLw>`;9b>v|8x4(g=?A=g2ToeNrR~hzH-Xc z+(hidhi4eDNH1DH{h*9(6P4)-o^jnQAryBZN6IqAen?14Uob1!|Ry`6V#sQKp7?af=Sf&VeME;{I=xMi%%0QU_)CT4oaf*#ErYe_Os3k>?*WMcfj8 zLbn(@?-(4>CJYDsWi1dFjBGGi1lq;W28l(xAdP|$AR5HLj6tNH2@Iuo+6)0Ag&u7b rhQY$opfMH+M}R0S$_#-;!C_c93Xaxm6ti0tHV1Hac-y9P{uzG)F{^|S literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/P9.png b/thematiques/chimie/images/P9.png new file mode 100644 index 0000000000000000000000000000000000000000..30e96f266b826b5fd377cb1d5fabaa405dc0a099 GIT binary patch literal 1610 zcmZ`(Yc!h)8vf|0T?VDm#+|BG8Yz)4LN#3?Y*PJ%MC(#@S+h1lm2DiV?xmSw&??RN zP;r^BQW2%0Lj|K#cAIJ=NR^gW)6Uj)+FB`UOlJ4*?s?DiJmp94a@68 z#jf}o`xXtJw&lM6VIb$wH84*mvj+-j@txC4UjV6h@)1F{022*>I@I3mZfVb^2ToL% z7PZ}ky=MWj4j6yEQg>>_n!&N!bGMprlha?1=`(_MA8fyP+3n?1>4#C9Q{*hc!xSU< z0OKz!p(ZD4<_tlo?x&e&>HwpseusI-{CAazkI2C+lZyw-kd}#}qaTVEd5ExmEu^$} z`06d-(CnqB-N~!M@2))j(M~otn~A8g3a)L8iFdpL4z3dB zV&$kS^|eWZcj_V<^N~59a?xV zJEf9+?yxS~Jj&Q|#7`eq3|U3$fFnD>5|MW4+a_a(<70%egx@wPrpoel1oqq@h}A$-8|B>Y0TY_gZ@?gQ6ci$W|4R{H9B6-M=0}h_QftG2%Y&v zIieV!cc>ICW$IV9esTi-gqa+!oreXhPz35q$-ZdusQ zs-HX{;;?#PiM`suq&6Yk2k3P?ugeI7ut81bF7r1-8!Dm}YN}=y3?OeSR3g+;-gqlI zHvj`Aj5Tzn=W2tk9{XK_sAKVk&2G16@(?HO9o7LxZSw2-rhpwg9N6*SM17fyid z%$e+%m_5<@w#HN;QkF}B7X7d*5In+5bAh%!M)_P#2e^>cp<6D3wm=lu4o7sM;^@R^;4}$(7!&p?st+( zPl3*C@!BKFo*&GDhazuojhh&nWn%w26_if>au{Oqa}G4QK8s>vK-SNz`S!3{{r7t1ZPeh#AhZ*BKHLw^=fz=ia|(C7;*zqO9+~&vEeQ^Hi@U)osM8 zf_Am#FaGJOhjYDx%<;bAlT;zy0KOH{FyB2IS~sy;5!{c62l>M;RzvNwGW~zT-(6V! z^!Kf3$%VS@yGp|JZgjUtK7363eC)Ej;ErifJo6F~(<~4zd8>Cj)xp4HPbb20Y!#*@&RgFtEQPFowoe93(U;uznvx>cl!+08p~Hwm z=R~rqYhm+X%10JW_ZRaJV}}RC39%sqGb%Q(y}#Bhi%)xXW3mSSF9P!Tis}OrnU&Q? zJn7u}{f_pCA3fvTB>y1eHqh6v7dIC4(%<7|c7k%}ExUyGm z+mD>-OLiCwCC}qUZu`5y0h{efvVP5DE~9KJPMH{@FT*x8Y0k{|s~$p(nH=R9%)x*< z1Z51z>VHSLUn_@FAO~E}hiG0lo$DLQr6>8Y>A-)OjAuFfkZ5?2aoER|1~Qyu@i-7i zawOthF>a0ojJqcu=ZYgZvq>~35J#lBI^l5y8o|?*=7gsaL_Dd9#uT9Y22jP6==|RR DV)fvz literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/RS1.png b/thematiques/chimie/images/RS1.png new file mode 100644 index 0000000000000000000000000000000000000000..450d4e9e1d8476f25573ee39d2cc75c3125b47e5 GIT binary patch literal 1497 zcmeAS@N?(olHy`uVBq!ia0vp^Yk+tj2NRG~cvz+hq&N#aB8wRq_zrh@1U8SFeSOMK!cLw8Qi68ZO=2Fy+-H zjno@UOP_j0HtubbG5-`N(!k)!^HI4$;!L&ko#+=67}8Cu-ak6ap>p8t>({Fj?&c(U zZn)|4noCGnvDo!j_k36TGbbk9ZYgO{?cuJzQtIN`EMdFrGGEe=eR z*DPqV+{*H7rh)u{SvNzT|LOcU>!WJp{E2J0R2V=|k&%Pb!GpnxNkFJ!0z(Un0&zm^ z;!9@rr?gt^HIWq!dh|<8bj5@=p1knKMGHT?e?Pn2+SX=o&F>Q7_1EXu|E>D{xc~b8 zdg&WRI}e|~-|Q=!eD3kF(0^V|ZbB_*PdC1{d}FXY`bK4tVl?NeiT3we51)IVHq9>N zL|9YOgZTT?rMqI~>+fW5|Gn?**KOObY3ZmRyeSg5!8YvutMziuvNPB5y>@(Ge)s+E zbHCZHYhLdOz12Qry-Sl z`|C*$Ryi<%APM1B!YZ_7y_Hkb$`l>P`>yF822*EzG}-2QsL~C|1)(Y_C>fqFZi|iPuJAVKMYOO{g>GDc5=PE(q%g*`Bi<)CD-C78-J($ zI$pvw+2F_Xx*uiX;_q9#4LMfNpRMTBdUK;_YFUGZgm}cO{p@cRzj>b4vHECSQf6qH2uME{3g8TS;Lzl~ym`~hbu|u!Gdj1j$co8qyTj)du;j9=ZsdoFR32HaJE<||P*z65pdp2PsivTxD{@64j;lbI**It+H@two8Uueb0 zLg#ZVx?S0v3cTE27k>ULh;DkYxTW{H>2`BJp768tzpi`tJ7?dEOjc(dRY&8i50AUu znl8z*`=52)f+ss{D}q*rJ~z)<_b<%gh?7vueEHm%Kq0S!Q&p=gcl^Dgap&r*oy$de zHvXCQz(70awh)V^O}5ak!m6i{Nz(r9QIYL8&AmM@%$U9XyncEA+^Gxlzuu4WHMy}* z*D+rEw7~ClNzQY82lu^9s8Qwk-n*8?pf6SB#fd9<)`h+ojAwrLJ|OfUNGPOfmyf;4 zwC}e6W#`PAtNZqQY=|t6$AW)h*Al<^HkmrkY>WT*=JcZ#pILfkorS(^Z&Iva=A6KQ zUPNg8kiWe3@$`V?m`lKNGq}VxqQo=LIm43yOxhX->pL47dKg;hITd;6CmZTo>YC}A z>lzy9n&=wo8tagTe~DWM4f^$d8} literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/RS10.png b/thematiques/chimie/images/RS10.png new file mode 100644 index 0000000000000000000000000000000000000000..2066b299b9c9252a05d2a1b7ecb572be29a6578c GIT binary patch literal 949 zcmeAS@N?(olHy`uVBq!ia0vp^RY080!2~4DH!}7DDb50q$YKTtzC$3)D5~Mr02E{^ z3GxeO_z!~S5z@5`49wh~E{-7;x8BZm3_E1N;Bt9)gqV&00`&&w3YM5xj1ilXo4qZY z*bfN5;H=2`py#nN_wuxB>`NwBo;=f~ws!7MUPWG0mG;92Jv3Ag^@arOnA~E^w|oET zLmcK-{N{yO#n+z*=9Q=(W$W)B zy>>Y3|JS1Fdw>Ny7|@m`;x0ljd_^c zjK10DRiq0Uy_2>UzL&6O+PQ7{=jEp|K30?E2ofyMd)Bh!M#7G>4-fi2N+}T5vGmMg z@Tus3b=Tpk%Z`P926i@V&k}Q+j{6?HrLcU(9u@Jt1T&*+Y&MMDXZ%mx;xLa$+;`A2 zQdaStHS1BFKb+>0UWt}E9rR=KN{S~?zG4ZiGHfzP*`RZElAMjq+;aJt)*wS^* zaZ|&szl9v_z8&=O*!-=9*Y%p0mQ_YhDhu}o8u9hS=CgHsEN<`mEp{_MrtQ&+ExUmx z@W#c??Tp$kZQ8Wm?#`8R>(JGf>sJd#pFeTL%13$f>Bi@^<;NXR}+{~>`GiCN<8zNGdvlVu92p>hOwrF rhKZ)3fqsU$uAza4j;XGhhmnqpqyz7aP*Y?~`Qc3Q7Q(z$>>NfMx(M*FKk<t2O_5<+{eN zH_euD9#Zw+w^l*YX_kKPUf!SCUn0)F`Egpf+&^gY>B4Vz>6=e*wWQ8#n1 z-H!Nm&t9C}d}wc6-L~bA{dd<)DmXjw{ngU!_*5=~eK&nWHyC!WPgis=;{TG|roG^E z!SY+htV=Q(wes)J{nenRKDVne^lw*q_9K45Opk|5OA8u#lcs)^3`$_POiFOIz;7sH``W+{$ftD(ZXw@(AXMZF4@gb$mSGLewO<}bF6XnU^FJIdYg@3kWz(ISb7A*>OGc|b*&_16C$Gxn z`L4aeJnvlnYzuB)+I!%UEt`4SeD;?+4R-uY^*jIV&IXAX^)$0Kp4r873pb0$Tt2w6 z_+IPgV-@Gu?q@z5AURVv;_8!h?y}!;|NmC!9a&k!vjsDcT{#FMN* z*-O2|HKN2b&pE@B0ZiH&2J1T;d6@a@CmZS-=^E>27<=d#c^K&!dKjnn_C5t_VeoYI Kb6Mw<&;$UirntHQ literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/RS12.png b/thematiques/chimie/images/RS12.png new file mode 100644 index 0000000000000000000000000000000000000000..2b39c60171a1e01ef29071f973e00f2e9571a3fb GIT binary patch literal 1105 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 literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/RS16.png b/thematiques/chimie/images/RS16.png new file mode 100644 index 0000000000000000000000000000000000000000..55a8c78ae9dd7c5c1888ea2086a297598ca999af GIT binary patch literal 1254 zcmeAS@N?(olHy`uVBq!ia0vp^cY!#Lg9%7#G__d+Db50q$YKTtzC$3)D5~Mr02E{^ z3GxeO_z!~S5z@5`3@i?wE{-7;x8BaRExYU>;`Vg!1hsb28KMrZuHNEa5e}zx7`!fB zT((F_`+)WdPvLJ#A~!dFHI_O*`Ptseuy?veIdhwJYImLSSbXtv*6zDu4Cf*qs#>t< zA5^Z$JoI<^)%M$mx39LpJ^#IT{-pd5L38I$b{GGBUy&hB>vF`6=>|Ilq8=>O`d_za z_m8mJ`d`1l`d%u!(L8-sk6F)_8HFE$CVxzu$Y#tJm(?^q_@H;_i{t7|(^nPTH5S|x z(pI?0^TARp-`hJ9V`5q2W^E`g{-5gmzgB1uOaBAa3a}G6VE$O%Ge?oOn>Pf^_xe( z_V1kRZxJCf!nfp>K09@O+8oVeacr;c*u=~3S47b`q}+onu;T8Kf_I>-4<`9u1S()t68IseQ$tZ(Y32evVeR{inY_p10@Bogg)K z^Rl^9Kbw>*weEScYx!nv>DE4D)g1+&CzM7cC>?z#X5<(0vTSDX`s1Ne`G&0Tla}vg zc@eWGCw6{sg_zv_klop)KkZTq)n{)wb#9$St@JyaJvH|h9DnV0{MvE7zYE;mq+&7x zWzzndJduf8SNl8WuhhDZ1*{KJ^RkZC*YlJl zjX9)jnx;Px+|wg4Z=3y$%C|dyox0gHT`*2gQr#JOeIO5d3kE&DBK@2^v@ne>&n%#XD9 z+puh}34^|JNw(&l_tu}e^uHcF&GA=Ce)qXQzdkbQZw2xWN^LE_TD5s*kf_Ics~=22 zk;Yjbzte-S1?h*bZq^q7I&aNYQ=O?MOFibc8zsy;c-qNAWA+QlJvz?UUOnJu(f59^ zIA>A%hf8z*TsmdKI;Vst0IWm0uL(?-?o!&@dVYKN?BjlWzkT@ne82sDyA_-Hj!w9BXq(iZ-*;F2 zy%oHF|06{ikDP}MEg2lOLeW3&{ks=$xo_**BIoY{-x3sG1a3JYXTC5>Vs3+6T9$+V zymEDE;qv)2x3<~sImm1awACnbM?^{ei9b9S5)`K}h&9RSuz-X&2z&wRKIn9zxpe_M zw;@UF$=^M}6Ak7nI2f8}Bm3(LRnG1(6nlCJeX4cU92?|;de^zhNk7uEM3i#=P# z?O!RDxnOyq*LmwbUJ3KWDyQWHYs#I@IKTU(xc}D|DfhB^ybRka4u3itY#KcIMdsol zp5iqTFCV>J@+MN%U}CGJ%R$%a!AVB>Ht9aOi&`zEeWhMF%gnO$`un9MZM|%tUV`Ue zm!%fJ7hC8qS!tE0BvRFGGn|VR4(X&`qzx>wij{Tj*TK}9Rwr*%x`rQ5N zDMJPeYwpuKCl|Wu=wwLqy}e>CwoD}_v2r%csyODPM6Y{J>pyhgou^yhve7{G;jRrK z+@G6UHD_K>3g79eAa-nXt$Atf5s7a#Zt77R4CdX`)k#{mj0MPI5i2{Hx3XligHF%$ z3T{O{ogQ}X;Ko+PGslV~=FDN%;c0BGJaDKYVEq7I2SEqL@{Df2 z$=|y7;`OtQrT44~j5eSAY-jhZacg1k-*&0`Ut1H7UDR!TD;oduN3vazOlnj{icZbG z(@y%ve#bZdUN!fG+M@YAFDfprZ~4x1KVFvU0ZY0tcl=A1B%or|mKz%{oZ2J1DDKksu6zXCrjjpuaxc6&zcpG4c|rDw&NQrK{1=jZks(>j}j zEjs#vWuAM9Yeb1>o^ysL1DLcm4Ayrx^Ds2<*K;=VF!MLkPd3*z(>2jG(lyjI)-}~N qvo;2@jC4)(GYoZ2J&b@{6AvArh=&n>GWTtukqn-$elF{r5}E++iF?xk literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/RS18.png b/thematiques/chimie/images/RS18.png new file mode 100644 index 0000000000000000000000000000000000000000..4ec8a5d51dcf1bcea605b7c2d7726c8da2859983 GIT binary patch literal 1370 zcmeAS@N?(olHy`uVBq!ia0vp^hk-bYg9%9X@fF<$Qk(@Ik;M!Qe1|}oQB=dL0Vv2; z666=m@E-)tBcy8?7+BVMx;TbZ+JKQSqlH`4GDOPG} z&+aX92WB3acVNDBs<^BD77h-E)Jg6S`l{A{Nbj2F@JNndAxA!a_St1j5@&cOJFxgL zNtVp`^8WhspPzQ#i?GS7yFbNF=|vaQ$THPyQjsQXYnW7!tZ zGdq?8bw;qx;NbGPwQ>8(fAgk#PS!BwJk#u{(5y5$ZS%8)JMRy&bTPGgE(;Vf@GJYaCr1e?;JoNDJk#z%LD1663MKeAl| z)Hy}ihsiL-IuaygJcA{PCvv$@MXTHfN zGvA+6KR)LHt1Hi&hj$)IPD;>GUv4gP{k%c)q$%vnYOPkDUev2-^wc1;=f-TAH{aw| z&MgT)?ZTMm7LLewfSO!o8ig>A#NKz z?|C(F2KDD;yiIv&U#?{;doAmdqQ3&SUK5cL$~Me#jAKy7k^{g zB%VBJ*Bp`S(eKy$oU`4u@X(UP9Zy3ZYm_biymFh!t@+zk>wK*E)hyK}PCoKtD_276 zH+M6GU7bdmlV=pBr`%H8$TgvVgQo(sS|iU479)~5N90m~ zDS~mb0~;{08F0cmm(D~#RQf43_0#+w&shgmCM0fB+iE6XyX|ylVoj%Tz#oB`j?YCj zjf-!^u5`Nj?zjKy6-UY?jaRN@`?k*iMS;jD1z7d2)8Xt5#n< zz3JZbSewvIRT1CYaz0&qIg!ubHrb%&?~hY9dta+f_w1~BZ7Q#JE?Hx*&70f`){9NH zaZ2`GS5_-}TZkWiR9IUoe%AA$&%w&g`7^@ptoLb8_gqqqXgz06LiBuzGoHM0`$}i=_dk)iR%)<7-Cx0@=r`~CPp@wVu(7sul$`vVWb}E7 z%f8%M{!gwXHz=!q6@Ttyl^5#g_2%{ki$M8i1y0lE^4oi7e>U6uJ?~`AZFBX|d;F@t ztK6^NzP{6V+qaw(Lihe2`StR#fBuhcd*)3!vpx54Syocrx5fVNZpf{A{ruF)6SmS# zcjlb+%-a{MJ~{WaZm5B~-)xb3o8t7}l^H4TIj=ofcud8B4?S`GXIykLbt&(ecW%J4%%Q|J zqQo=LIm43yOxhX->pL5JnEC5D8v#lEWJ6seU1MDnYcQ>!VeFw}_2EWFY_m literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/RS19.png b/thematiques/chimie/images/RS19.png new file mode 100644 index 0000000000000000000000000000000000000000..cc3324667ebd29a3452d45e6be5e8c86b8010267 GIT binary patch literal 1049 zcmeAS@N?(olHy`uVBq!ia0vp^*+3k}!2~2%XVtm_Db50q$YKTtzC$3)D5~Mr02E{^ z3GxeO_z!~S5z@5`49pFlE{-7;x8BaNEW2$W;%fh0Xz7QKTvJ3ub;eM(IhKPZ0f-=ZEOGW$Gd&x*aN_sl_4cludcywC0JVv&z+Pq6v9sl!^}$*$;Ix3__G8SGfG_v~Y3fiDjVE!#C8EPl$N z*3|ECq4~0E&9Y_?Bl3ONH$99$p2edR--!i1ZPAF_PBSoM6xv#ie`qR|>Z( z6s}*q%fQ<5rtlQAFCjYlliM=910G$E(|P0X=|7Fdv?0KE!|eliGZ$1EzrW%g_05u_ zY11;!GV4XBwy0c53Jqq_|0DN)RsYxJyWK?-U->@%6Ln|9ovDw-v&_x+dAoaNi5;wB z(S0u@Rn=!?()1YMXDzjyzR7bj9y$i%q?)+4EiP+Wlc_r{6NOs%p%dc)!iVY-xQ*&IEI@ zCA*h2|FXKAdTY`oz6HSxCa^peKYZzv#KEQ8a+YlhlfJwvvVML|)|-d9zh6pds5nZd zh0f&P<+*pw+_{^t`F$0ca(l~?b$mib|sX% zIO!JficDA#^kiXI+Egi(SQC#8nGWynmpK_flF(3aY(9QD(al<8%VXuW7cCC1`gQ4F zYm4EMvx;TbZ+<1L5@L=erA69U8)LanAsE$|2a_p{#3)gGZlJ=dj#f$%k>{;Qqe5b=YCguaIfBu z>#W~*J&2n=<=yE`G20x@Jznkc>|f-cN1^Q+#fO37CUZsognlh=u8tM@65@XTk7)e! z_>M*YkGFrSi@#G>`RnJ$&af^ShY2+wI3sor>3auI2K@Mtm{h&))U^T(;%?`_?grJ~($)_pOd?t!vG%>GN;@DtMgR)AT!4oA-U)#lrdhzeD18H(xz%T5rUe zzq4hfRsMJ8PjhVz@2c;=F1CPi=I-^^_+2mW`6u=+-tXPJ+h$=ZJGW1cshN>h;Qu}8 zWo5_tRjNN1JhIzrbx;cH3*me%SFvYJ&9l z5At_jFWP#JUHr~#rIL7ls|Ru7Q}2IV(0}CpcLR=hr8ob5u6n@yeOJz(pEVMUK>Ay) z%?_Y=U|v zzqwamt4uuIyW;y?#^<}A`OAO*cH>GRzwM#j@&a4#$6DU6R?FI7z3e-ui`@6GTYp@O zTv2`PXKqCL#5%o2S_wyLANG6QeR@-%a-aRzf3w}^@A16gY})wJPeKWoO3+%lMQuEbWL^5G>kNj qt@SfZbj>_;40Vk?jI9kl^pi}1lGewgYBm7PVeoYIb6Mw<&;$S>($5(H literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/RS20.png b/thematiques/chimie/images/RS20.png new file mode 100644 index 0000000000000000000000000000000000000000..149d14fb0b1f93ae30f8d7c832e62183ca43cac8 GIT binary patch literal 861 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 literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/RS4.png b/thematiques/chimie/images/RS4.png new file mode 100644 index 0000000000000000000000000000000000000000..ca268f8a024e62c1476c205e4df52d7de6b889fa GIT binary patch literal 986 zcmeAS@N?(olHy`uVBq!ia0vp^3xPP6g9%7FB~NSyQk(@Ik;M!Qe1|}oQB=dL0Vv2; z666=m@E-)tBcy8?7?`a+T^vIyZoQprTXoq%pe?+dvCC$T!kmVXkS!(4RM;2zxHGH1 z%UHSM5a$Wbii}CSEjEcf{(JGnq(^rnYd`Ou`t<9XC6#+Gy(*u5H}5%z39sy7=i@&v z7}}Ne@XJ01GBd35W<7gT`bmHGqGvlq=Oka7xhmGQq^IA{ZPTm;&p51(xhu*}Y<~WI z&!x~4>wkVf{w(XY-u`?4e|||SROP>aZ_l2(+TFkZnXUWver4D03%d_rQCp{crft{b z(sNFi3*Uc#VLH!mQ{auljl7x9Bwt$IWB*$tFW%28S{hT~KeM!= zUj=_&w1ySxZ5BExs&^(PYPtNK{?vL6t2ox&+yB1ity$Z*ZpX^(8d1GVEKvu|#n0c+ zyijon!#Uj&Ls|f{@~hAoGRQG-*kGnwTex_ z9I>y97qi@F7e07EHgU(~#b*K!6#iKCCqYN#{zen0z)yb-HFUhP#DIFr>T7PKvi6Eq#mDEzMr%8_Q%U+UoO3t;Qsq6IpT`uyHzi=B?{j> z(Re#WeEEle74x5l$E$cw?(5&%WOzL9-i($LA7-(@Q!{D^_1nza-5lJ-69LRv#wD&1 zC7yZC8J-Ma($+9o-`UK=&`3YoP}fA)RM$+yNYhw9!$jB2L&s3p*uz*q$rLEzpe*wZ PsGY&n)z4*}Q$iB}$Pd^s literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/RS5.png b/thematiques/chimie/images/RS5.png new file mode 100644 index 0000000000000000000000000000000000000000..b39f7474171d2ee9ca17e4e9dac8a46fc07a4a3f GIT binary patch literal 1273 zcmeAS@N?(olHy`uVBq!ia0vp^OM$qYg9%8!-7mfpNO2Z;L>4nJ@ErnSMo|r~2B08Y zNswPK!+#JokC3iqU|Zzv}%*C`O&WdN4%B}gtkE51b^GNxz^RZ%`$x{qpe9=`*?b+mR^PBNT`@W4H zVhYL|{c0ul+l89p1*v3yQs?fv-DaM53KHM`2MUz&F- zM(KW9>T>5|8}Z+E+s%&u({;URe*ANY&VlmwMOEihyME5v-~PE+a@YOi-|o+hiQT!~ z^yTk}EoScbgTB1q{^RrE&+oUFTzfX@SJ|;Cv#lhuKm4;4Tl&+iNFwdw`}+~Vkg2KT z<+hvO<*K+(Gn(W2^n`<7lR?5U|9g*astx`YF>P*q>%QYg+2S_#rx(?4nPS_>%D?lA zZR1kEl^WGjUwTcP*UMU)eDJ5G823JTr~ASY8{SL4((ga|-Cj!`C=qxlrR&tw z50z>L#_P7hjlNVrjo<&V?_!eNOe0&b>KN)N!f2c58M= z%(UN=KcuBwxNq38wAE-|z5Z?U-`^*^zuq%vci)39+4Ie5Qn_(VZ8iCaKa@nXr~H2P zZKe9lqBB<-`}|7jpwc$22Z~i_oiJcx4oFjwkzUNsxr^hmcFf9 z?w%2nEVSSH!B~FrOy!z<|Ns5(+GkFT?%p)p^2u%M+un8`9cO92yuUvDaM8a^tpekp z)f!^JV5&`a1cx^f%%f-aE$tTO^B14`H={tT=U3S^F{$ZIvG-k=b?;9!mCL<5O z`#*p0F)wa^bpGA5i1O?M{Zo{9wf5Dnekio=a*p)D==yKc2md8JE)bIq-F9u=QSXUt zy!Rh!y-{fIdcRw+CdlT_eG#tvRx2%ox=b|U_rFf8Eq!G@?bY)yCK>-WJ-u-IjrLUQ zW77gYzKwMcKmU65?{oiTXV?D@uj{|M;eEu)Gm2)dP4B~wclAF1^iOu5`rG?UxLNPZ z2FZmhufMN1OHbp`?CIH(xBmXNI2Ttf{N}`;J(|~M#k^l_5pv=2?W5jL`!=d>S$}_b z$NryE!fL<%z1@59xpiEZ$%pSk!06}xb*yRMMsP}iGygH$6#bn1XKH{Qu(Yu)ag8YP z%yZ80WB`-4hQa#I79NHsdd@jU`pJg6=DMc3#=0iDX1W#{=9)&K2z z;(>toos$?mg7!XLyzKVmNw~il&0KOrHBiN~Z{dyBi%OnT7T$36Qp^1R`0>^K`AAn%J6aLP}jmUbBJ?awi>;>TG`mEhQFP8S<#DY^3L7XGQV@`K6N^)xp`XExWv6boo=^V`1HXGkH2nY&7Q2X zM51_Q)YbL=zVfHvPkwUo^>+t~!cylA(*wojw9P1`VKhbsfiisau_Jd$2b4ZBMi4@_fWP-Q%@+M1yu z-%L|8=v~btfu*xv%>QCqu}Fo%r03Nu+mEk{88kQtQS!|>7F?Ci=!t)fDnW0&T6UsubaQNrJ47iuC7Qq8ouXXm1pX%C0UBIGFR30 z9B22O$8(W6?{CP>YM2~WsAk( zN$0e$tv;4|<8Eq#$ED2j*|(pq|9w4A!i6{Z@1Y3yD_%vf;$N;Z`&DIdc3o)o^QjEq z8Xvu!7II&9+jXID^JJOw(`t`0Pc!+oG2r&+iK#OcR^C(a_c^{zsZAyFY`dTh>`giW$122;z1+-3jL}_t`70ntB-N70|R#e literal 0 HcmV?d00001 diff --git a/thematiques/chimie/images/RS7.png b/thematiques/chimie/images/RS7.png new file mode 100644 index 0000000000000000000000000000000000000000..8362a92b579cff679c98b93e5b07b8772680c03a GIT binary patch literal 1599 zcmb7E_gm6y6erUjSC*@7fR<^Bi11ZR(-2h1nTQPwM*<3prRFvav@&N;%g_eiA~df# zGRlQd*RreP#EGNno|&5C+Qt5W`#kqK&pGFPKcCMzKfKR*Pl~&%<5uN8${-MED*=!5 zkmW&{hbhX*Vwv>kC0SCsfIl4$0;#>-@J-qV#}j4XmIx15BIwtKS)AIN00Jr8Cg3oh z(S1`7tRkgotz*3EG>_3}g=XbE`eEVps2QCfK4y~6Pdg&a_b@cVdp-W*|Ft@>?vY|* zBEDhGI&sNsheBf3;6fZ|!8_OWkOCxAfzEc;^$ah$K8q1&DgJStdvQBWs{|?cSrtlm zIQ9}+*W8+7ep#^l2%>(Q6-WR3M?czY+b;+O*B)HaVD-2o-Kpy4ld3mQ*Qo;7 z029Pt%^$O!YTc1&s+Q@bYHEzViq&R+GS5z&n0-!AjMSp;JS0&~wtTN-#qrI+*oh$q z?1&7n8LX3q@&i~aHET=rVe^gy-CV7ZeNoZTEslrr_3Q18RUINv1b02E5ff?QtN_&4@~AtC z&B#yP0fqVESDr}l)3Dl_fyOG5BhW!uiw<0U^c3kJ;A`X^f>-LBv}}*PJ|(@6iz1X- z6$Z0d1pz{bzCA6J##$~71$5?`JNsukSL~za`@d7ltEIs= zhTmw8cm?T`sMU+h?EoXlh`kzeiAloHTCrP-r}e8kc4q7Xea7jeF?cS57g79cj}8r6GKRT8r>dZSW$>%6 zeFX{LZ``yN8*e75%6seBS(w>Yj9qGZ_OL+e_C=!{F)@jbyxiZ|e!y18zOy~Ew1MiN zEnI3Bw>u{&wH|cZJ;Efl>U@vKyVN6l#^{(}dY2p2-X-o@O~?DzLW6$mdy9?>bkZDy zQMvyWhC>zawX>X>4j7$VMGt^>W=^JGd01>_0e*GOh14SzjOAw!hMa`fT$1d=2o%;kHnwI!2jK^D_D`Ff@n7S3P^K3#l5E|X) zSvP^gru7aP#<~;LVhmZN%nY`PswDV;F3-=)pWeb1e;x5#AO3eHFwPW=c@L|-@L+w z+!hSR$RpG{R{^O01}~*?AbWlbM_QqB8;7Z={g_eN*dH98=}vl_vgVxvJ-dPbg8LqO zEW?wxaX9WWz@xWgb%Z&mVI!BaHHpoIXi4OGGJ4~e2$bwFF58vq>0nGJN>4jgG zq)y{al{1|cyLt+KJ|vqG`|0Cq)b|2sZLG^wblaD#0n?1V7GYAAiKgj>Ar@DULTVLJa*^DkfZ)!oz0%?CfK`Icubf?4@= zOQv7*`J$aoT7!d|{_9DX!3FB=SA8z3q{ue5ZG`=)2m%uuNC5qgM-fCg7L7-k!_OmN zD3}EdZ2-W`49#Ikcp%DHcEuY5Fmt?_F#?9fBjNrQGEtisszKHYM6h?o71{Z+{{``I Bn5liv--6bQ_uM?L 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 literal 0 HcmV?d00001 diff --git a/thematiques/chimieFacile/chimieFacile.xml b/thematiques/chimieFacile/chimieFacile.xml new file mode 100644 index 0000000..fd763f9 --- /dev/null +++ b/thematiques/chimieFacile/chimieFacile.xml @@ -0,0 +1,57 @@ + + + + P1 + P2 + P3 + P4 + P5 + P6 + RS1 + RS2 + RS3 + RS4 + RS5 + RS6 + Hydrohalogénation + Hydratation + Dihalogénation + Hydrogénation catalytique + + + + Régiosélective + Règle de Markovnikov + Catalyse acide + Stéréosélective + addition anti + addition syn + Catalyse hétérogène + + + + + 0 + 1 + + + + + 0 + 2 + 1 + + + + + 3 + 4 + + + 3 + 5 + 6 + + + + \ No newline at end of file diff --git a/thematiques/espace/espace.xml b/thematiques/espace/espace.xml new file mode 100644 index 0000000..c87d067 --- /dev/null +++ b/thematiques/espace/espace.xml @@ -0,0 +1,37 @@ + + + + Mars + Terre + Planètes Rocheuses + Bételgeuse + Proxyma Du Centaure + Etoile + Lune + Titan + Satellite + Uranus + Neptune + Planètes Gazeuses + Enterprise + Galactica + Vaisseaux Spatiaux + + + + + + + + + + + + + + + + + + + \ No newline at end of file