nc0fr / conception-application Goto Github PK
View Code? Open in Web Editor NEWProjet de "Conception et Développement d’une Application SLA4IF03", UFR ST Orléans
Home Page: https://nc0.fr
License: Other
Projet de "Conception et Développement d’une Application SLA4IF03", UFR ST Orléans
Home Page: https://nc0.fr
License: Other
CONCEPTION ET DÉVELOPPEMENT D'UNE APPLICATION Projet de "Conception et développement d'une application" pour le semestre 4 de la licence informatique à l'UFR Sciences et Techniques de l'Université d'Orléans. LEGAL Le contenu du projet est distribué sous les termes du contrat de licence BSD-3-Clause dont une copie est disponible dans le fichier COPYRIGHT. Copyright (c) 2024, Lucas Paulo, Younes Ouaammou, Nicolas Paul.
Voir le sujet dans //docs/sujets/iteration4.pdf
.
Voir le sujet dans //docs/sujets/iteration4.pdf
.
Remplacer le choix des stratégies par ihm par un choix selon les conditions du jeu
Le sens de rotation attendue par la professeur est l'exact opposé de celui encodé dans le jeu (ils partent du haut de la grille). Il suffit alors de changer le mapping "gauche" -> Rotation.HORAIRE
et "droite" -> Rotation.ANTI_HORAIRE
en "gauche" -> Rotation.ANTI_HORAIRE
et "droite" -> Rotation.HORAIRE
dans la méthode demanderRotation()
de ControleurPuissance4
!
L'erreur provient de notre utilisation d'un Java moderne qui n'est pas supporté par le parser de `google-java-format`.
Originally posted by @nc0fr in #8 (comment)
Simplifier la logique de l'IHM pour accepter des I/O communes entre les jeux et donc ne pas devoir les séparer.
En étant plus précis sur les états de parties de Nim, nous pourrions plus facilement déterminer le vainqueur et le perdant de la partie.
Ainsi les états pourraient être similaires à ceux du puissance 4 :
public enum EtatPartieNim {
EN_COURS,
VICTOIRE_JOUEUR_1,
VICTOIRE_JOUEUR_2
}
En adoptant cette méthode, nous pourrions aussi très facilement partager ce bout de code avec le Puissance 4, et n'importe quel autre jeu à deux joueurs à ajouter (tel que demandé dans l'itération trois).
Pour forcer le compilateur de la JVM de rapporter le manque d'erreur handling dans nos méthodes du modèle Puissance4
, il serait préférable de modifier l'utilisation des erreurs IllegalArgumentException
et IllegalStateException
au profit d'erreurs uniques au système, comme PartieTermineeException
.
En simplifiant la logique du contrôleur de Nim, nous pourrons trouver des moyens de mettre en relation la classe ControleurJeuNim
avec ControleurPuissance4
, et donc espérer mettre en place une architecture des contrôleurs abstraites : Template method (en français, patron de méthode).
Design pattern Patron de méthode
Fusion et unification
Principe de responsabilité unique pour simplifier la fusion
Usage de l'AI intégrée (Copilot, via OpenAI GPT 3.5) pour écrire de la documentation
Erreurs customisées, comme fait remarqué par professeur Khalem
Faire les diagrammes de modélisation, &c.
Changer l'affichages des coups pour le rendre plus acceptable quand une ia joue
Avec la fusion des deux jeux en une seule codebase, il faudrait unifier les classes Ihm (respectivement IhmNim
et IhmPuissance4
) en une seule, puisqu'une bonne partie de la logique est similaire.
Faire un petit script Python qui va automatiquement prendre le code et nos documentations et créer le dossier .zip à rendre sur Célène lors des TPs.
Voir le sujet dans //docs/sujets/iteration4.pdf
.
On verra pour le "BONUS" plus tard.
Trop lent
Les codes couleurs ANSI avec des caractères ASCII sont plus sûrs à utiliser que des émojis dans l'affichage (en effet, les émojis ont une taille variable qui peut casser l'affichage). Cette technique fonctionne déjà dans le puissance 4, avec un rond ASCII.
Pour avoir un contrôleur bien plus unifié, nous pourrions mettre en commun plus de logique de code dans le ControleurTemplate
.
Par exemple dans nos deux jouer()
, nous avons la même logique pour la partie "Post-game" : déterminer le vainqueur à partir de EtatPartie
, afficher le score, demander à rejouer, et afficher la fin de la partie si on ne rejoue pas.
Tout ce code en commun peut exister au sein d'une fonction postGame(joueur1, joueur2)
du ControleurTemplate
, et cette fonction peut être appelée dans nos jouer()
respectif.
De même, la création et enregistrement des joueurs, qui se fait habituellement lors de la création des parties (dans les constructeurs de Nim
et Puissance4
), pourrait se faire plus tôt au sein d'une fonction enregistrerJoueurs()
de ControleurTemplate
.
Lorsqu'un joueur effectue une rotation, la grille ne tourne pas dans le bon sens, et la gravité réécrit les cases remplies, faisant disparaître des données.
Au lieu d'utiliser des erreurs comme IllegalArgumentException
, il est préférable d'avoir des erreurs customisées (e.g. CoupInvalideException
) pour qu'elles soient vues par le compilateur Java.
Soit le plateau suivant :
⚪ ⚪ ⚪ ⚪ ⚪ ⚪ ⚪
⚪ ⚪ ⚪ ⚪ ⚪ ⚪ ⚪
⚪ ⚪ ⚪ ⚪ ⚪ ⚪ ⚪
⚪ ⚪ ⚪ ⚪ ⚪ ⚪ ⚪
⚪ ⚪ ⚪ ⚪ ⚪ ⚪ ⚪
🟡 ⚪ 🟡 ⚪ 🟡 🟡 ⚪
🔴 ⚪ 🔴 ⚪ 🔴 🔴 ⚪
En effectuant une rotation (peu importe le sens), nous obtenons une situation de double victoire :
(rotation à droite)
⚪ ⚪ ⚪ ⚪ ⚪ ⚪ ⚪
⚪ ⚪ ⚪ ⚪ ⚪ ⚪ ⚪
⚪ ⚪ ⚪ ⚪ ⚪ ⚪ ⚪
🔴 🟡 ⚪ ⚪ ⚪ ⚪ ⚪
🔴 🟡 ⚪ ⚪ ⚪ ⚪ ⚪
🔴 🟡 ⚪ ⚪ ⚪ ⚪ ⚪
🔴 🟡 ⚪ ⚪ ⚪ ⚪ ⚪
ou
(rotation à gauche)
⚪ ⚪ ⚪ ⚪ ⚪ ⚪ ⚪
⚪ ⚪ ⚪ ⚪ ⚪ ⚪ ⚪
⚪ ⚪ ⚪ ⚪ ⚪ ⚪ ⚪
⚪ ⚪ ⚪ ⚪ ⚪ 🟡 🔴
⚪ ⚪ ⚪ ⚪ ⚪ 🟡 🔴
⚪ ⚪ ⚪ ⚪ ⚪ 🟡 🔴
⚪ ⚪ ⚪ ⚪ ⚪ 🟡 🔴
Il nous faut donc décider d'un vainqueur.
Pour le moment, le vainqueur est celui ayant le paterne gagnant le plus à la gauche (puisque nous itérons de (0, 0)
à (n, m)
.
Il serait plus juste ici de déclarer une égalité, pour rajouter un aspect stratégique au jeu.
Maintenant que les deux jeux sont ensembles, nous devons programmer un seul point d'entré Main
de l'application dans lequel les joueurs choisiront le jeu à jouer.
Utiliser des erreurs customisées dans nos modèles au lieu d'utiliser les runtimes Exception
s permet d'assurer que le compilateur Java détectera les problèmes d'error handling au compile time.
Il s'agit aussi d'une demande de professeur Khalem.
Actuellement, le jeu de Nim prend pour choix un int[]
formé de la façon suivante :
[tas, nombre]
avec tas
étant le numéro du tas dans lequel choisir les allumettes, et nombre
le nombre d'allumettes à retirer dans le tas fourni. Cependant, cela reste un type assez générique (une liste non fixée).
Ainsi je propose de créer un meilleur type pour cela, ce qui serait aussi pratique pour la définition des stratégies du jeu de Nim :
-public class StrategieConcrete implements Strategic<ListeTas, int[]> {
+public class StrategieConcrete implements Strategic<ListeTas, ChoixNim> {
En faisant une structure de donnée spécifique pour les tas dans le jeu de Nim, nous pouvons contrôler leur comportement, et notamment ajouter une méthode toString()
qui s'occupera d'afficher le tas sous la forme d'un string joli pour l'affichage dans l'IHM.
Il faut créer l'interface requise et le corps du paterne stratégie sur Joueur
et Strategie
(des classes du package fr.nc0.cda.modele.joueur
). Cela permettra de développer les algorithmes demandés et de pouvoir les tester directement.
Voir le sujet dans //docs/sujets/iteration4.pdf
.
Les fichiers à rendre (rapports, compte-rendus, &c.) sont mal triés. Je dois m'occuper de les ranger proprement pour simplifier la navigation dans le codebase.
Ça vient de la formule dans la rotation Rotation.ANTI_HORAIRE
, j'étudierais demain.
Ce bug est critique car il s'agit d'une régression par rapport au code précédent, mais ce comportement est logique puisqu'il intervient sur le fix du système de rotation et simplification de l'algorithme, faisant passer la logique du Puissance4 de 400LOC à 160LOC
La vérification du plateau de Nim et de l'état de la partie est de la responsabilité de Nim
. De ce fait, la fonction Nim.checkEtatPartie()
doit rester private
et se faire appeler automatiquement dans Nim
lui-même.
Pour le moment, l'ensemble des modèles de l'application des deux jeux existent dans un même package fr.nc0.cda.modele
. Cependant, il serait préférable de réorganiser certains modèles dans des subpackages afin de simplifier la maintenance de l'application.
Ainsi, je propose la création des packages fr.nc0.cda.modele.nim
et fr.nc0.cda.modele.puissance4
afin de ranger à l'intérieur les modèles respectifs à ces jeux.
Similaire à #19 mais pour la grille du Puissance 4
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.