Programmation Orientée Objet avec Java – Coda 1 ère année – 2026 ## Rendu Vous devez rendre votre projet sous la forme: - d'un **dépôt github** auquel vous me donnerez accès - d'un **artefact Maven déployé** sur le nexus https://nexus.baldir.fr/#browse/browse:coda_lab > [!info] Date de rendu > Vous avez jusqu’au **Samedi 14 Mars 2026 23h59** pour rendre votre projet. > [!danger] Pénalité de retard > > **2 points** seront retirés à votre note **par jour de retard**. > > ![[combien.png|287x160]] ### Si vous choisissez le déploiement maven Si vous choisissez le déploiement maven, votre artefact maven doit avoir **un `groupId` unique** spécifique à votre binôme pour vous différencier des autres binômes. Vous pouvez le constituer de vos prenoms respectifs : Ex. Pour Sarah et Marc : `school.coda.sarah_marc` Ce qui donnera dans votre `pom.xml` ```xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>school.coda.sarah_marc</groupId> <artifactId>bataille-javale</artifactId> <version>1.0-SNAPSHOT</version> <!-- etc. --> </project> ``` ## Repartition de la note Le projet consiste en - Une interface graphique JavaFx - Des mécaniques de jeu Je m'attends à un programme bien découpé en **plusieurs fichiers** organisés dans des **packages**. Je m'attends à **une séparation suffisante** entre l'**interface graphique**, la **mécanique de jeu** et la **persistance en base de données**. Je m'attends à ce que la **duplication de code** soit réduite. > [!success] Repartition de la note > - 50% : fonctionnalités > - 25% : interface graphique > - 25% : qualité de la conception ## Critère d’évaluation > [!info] > Vous serez tout d’abord évalué sur votre capacité à **utiliser correctement les concepts de POO** dans un projet composé de **nombreuses classes**.** Prenez le temps de faire les bons **choix de modélisation**. Respectez les bonnes pratiques de programmation orientée objet : - DRY (Don’t Repeat Yourself) - YAGNI (You ain't gonna need it) - Single responsability principle > [!success] Architecture > Vous devez essayer de créer une architecture **flexible** et **évolutive.** Des points vous seront retirés si vous faites de très mauvais choix de conception ou si vous ne respectez pas les pratiques de code recommandées. Le jeu est composé de nombreuses règles indépendantes et il est possible de réaliser beaucoup de taches en parallèle. > [!success] Répartition de votre travail > Un bon développeur sait travailler en équipe, organisez-vous bien avec votre binôme et **découpez astucieusement le travail**. Vous serez également évalué sur votre capacité à réaliser **une interface dynamique**. L’architecture de vos classes doit correspondre aux besoins de l’UI. Vous pouvez développer l’UI **en code Java pur** ou en utilisant des fichiers **FXML**. Enfin, le projet est composé de nombreuses fonctionnalités, vous devez essayer d’aller au bout des choses et de rendre un projet abouti. > [!warning] > Il n’y a **pas une solution unique** à ce projet et des **architectures très différentes** peuvent être tout à fait **valides**. > > Vous obtiendrez une bonne note si vous **faites preuve de jugement** ## Évaluation du projet Votre note dépendra des points suivants - Le nombre de fonctionnalités implémentées - Les interactions et le contenu de votre interface graphique - La qualité de votre architecture **50 % de la note** sera au prorata du nombre de fonctionnalités implémentées. > [!success] > - Si vous implémentez **toutes les fonctionnalités** de base du projet **+ 2 fonctionnalités additionnelles**, vous obtiendrez **la moitié des points** > - Si vous implémentez **toutes les fonctionnalités de l’interface graphique** vous obtiendrez **1/4 des points**. > - Votre architecture sera étudié et **1/4 des points** dépendent de **vos choix de conception** Votre architecture doit avoir du sens et **utiliser les concepts de POO** au **bon moment**: Héritage, Encapsulation, Polymorphisme etc... Vous devez essayer d’avoir un programme **extensible et évolutif**. Une **utilisation trop partielle** ou des **utilisations manquées** des concepts en POO vous feront perdre des points. Une conception **trop rigide, mal pensée ou un programme peu évolutif** influencera **négativement** votre note. Des **points bonus** vous seront accordés si vous implémentez **une fonctionnalité additionnelle** en plus mais aussi en fonction de la **qualité de votre interface** (design travaillé, responsive). Vous serez encore et toujours évalué sur la **qualité de votre code** et devrez mettre en place les bonnes pratiques vues lors de votre formation. A savoir : - Des noms de variables, de fonctions et de classes claires - Utiliser la convention camelCase et PascalCase dans les cas appropriés - Des fonctions de moins de 50 lignes - Une indentation correcte - Un code correctement organisé - Mise en forme du code uniforme dans le projet (accolades, saut de ligne, conventions de codage) - Des commentaires si besoin > [!warning] > Des **petits écarts** peuvent être **tolérés**, cependant si aucun effort n’est réalisé ou si certaines pratiques ne sont pas mises en place, _vous pourrez **perdre jusqu’à 5 points** sur votre note finale_ **même si votre projet fonctionne** **parfaitement**. ## Code extérieur > [!info] A propos des bibliothèques externes > Vous pouvez utiliser des bibliothèques externes comme **fxgl**. > > Si vous souhaitez en utiliser, **confirmez avec l'enseignant** pour qu'il vous autorise ou non leur utilisation ## Fonctionnement de la semaine ### Je suis votre collègue Considérez moi **comme un collègue** et pas comme un prof. > [!tip] Mes clients me payent cher pour ce type de prestation > Profitez et abusez de m'avoir **gratuitement** à votre disposition Plus vous me demandez d'aide souvent meilleure sera votre note. Car vous aurez mon feed-back au plus tôt. Je vous donnerai pas de solution. Mais je vous donnerai des pistes et directions. Je challengerai vos propositions pour vous aider à améliorer votre conception. ### Revues de code Nous pourrons faire des revues de code pour nous assurer ensemble que vous allez dans la bonne direction. ## Description du projet L’objectif du projet est de coder la **mécanique de jeu** et **l’interface graphique** d’un simulateur de bataille navale en JavaFX Vous devrez modéliser les différentes mécaniques de jeu **en suivant les principes** de **programmation orientée objet**. ## Bataille navale : mécaniques de jeu > [!tip] Modularité > > Si vous le désirez, **vous pouvez** coder une partie des mécaniques de jeu sans forcément l'intégrer tout de suite à une interface graghique. > > Cela peut vous permettre de répartir le travail de mécanique de jeu d'un côté et celui de l'interface graphique de l'autre. > > Vous pouvez demander du feed-back à votre collègue enseignant pour vous assurer que vous avez bien compris les règles. ### Règles générales But du jeu : être le premier joueur à couler la flotte de cinq vaisseaux de son adversaire. La bataille navale utilise un système de combat au tour par tour ou 2 joueurs s’affrontent en envoyant des tirs aux coordonnées de leur adversaire. Chaque joueur possède **une flotte de 5 vaisseaux**. La partie se déroule en **2 phases** : - Placement des vaisseaux - Bataille Pour référence, les règles du jeu de société en version physique. > [!danger] Ces règles ne sont qu'à titre indicatif > Ce sont **les règles énoncées dans la suite de cet énoncé** qui font foi. ![[image-42.png]] ### Phase de placement En début de partie, les joueurs placent leurs vaisseaux sur une grille de 10 x 10. Cette grille est la **grille océan**. La grille est numérotée horizontalement de 1 à 10 La grille est libellée verticalement de A à J ![[placement_correct.png]] #### Vaisseaux - Porte-avions (5 cases) - Cuirassé (4 cases) - Destroyer (3 cases) - Sous-marin (3 cases) - Patrouilleur (2 cases) #### Placement des vaisseaux - Horizontalement - Verticalement Placements incorrects - Les vaisseaux ne peuvent pas être placés en diagonale - Les vaisseaux ne peuvent pas se chevaucher - Les vaisseaux ne doivent pas dépasser la grille océan - On ne peut placer qu'un vaisseau de chaque type par joueur Une fois les vaisseaux placés pour les 2 joueurs, la phase de bataille peut commencer. ### Phase de bataille Lors la bataille les joueurs jouent l'un après l'autre. #### Tour de bataille Au début d'un tour de bataille, chaque joueur choisit les coordonnées vers lesquelles envoyer un tir. Un tour de bataille se termine quand les 2 joueurs ont fait leur action. Ex. Tour 1 : - Joueur 1 tire en A-1 - Joueur 2 tire en E-8 Tour 2 : - Joueur 1 tire en A-2 - Joueur 2 tire en D-4 ### Grille radar Lors de la phase de bataille, les tir envoyés à l'adversaire sont enregistrés sur une grille aux dimensions similaires de la grille océan. C'est la **grille radar**. ![[grille_radar_rate.png]] #### Raté Si la position annoncée n’est pas occupée par un vaisseau sur la grille océan de l’adversaire, **le tir est raté**. Pour éviter d’annoncer de nouveau cette position, **le joueur attaquant** insère **une torpille blanche** dans le trou correspondant sur **sa grille-radar**. ![[grille_radar_rate-1.png]] Il n’est pas obligé d’enregistrer les tirs ratés de l’adversaire sur sa propre grille océanique. Exemple : C’est au tour de J1. - J1 annonce : « F-4 ». - J2 réponds : « Manqué. » - J1 place une torpille verte à la position F-4 de sa grille-radar. #### Touché Si la position annoncée est occupée par un vaisseau sur la grille océan de l’adversaire, le tir est réussi : **ce vaisseau est touché**. L’adversaire **révèle la nature du vaisseau touché** (destroyer, patrouilleur, etc.). Le joueur attaquant enregistre sa frappe en insérant **une torpille rouge** dans le trou correspondant sur **sa grille-radar**. L’adversaire enregistre la frappe en insérant **une torpille rouge** dans le trou correspondant de son vaisseau touché sur **sa grille océan**. ![[grille_ocean_touche.png]] Exemple: C'est au tour de J1. - J1 Annonce : "D-4" - J2 répond : " Touché. Destroyer" - J1 place la torpille rouge à la position D-4 de sa grille radar - De son côté, J2 place une torpille rouge sur D-4 de sa grille océanique. #### Couler Dès que **tous les trous d’un vaisseau** sont occupés par une torpille rouge, **ce vaisseau est coulé**. Le propriétaire du vaisseau annonce alors **quel vaisseau** a été coulé. ### Extensibilité > [!tip] Extensibilité > Vous devrez **penser le système flexible** afin de pouvoir facilement ajouter de **nouvelles actions possibles** et de **nouvelles règles** sans avoir à répéter trop de code. ## Interface graphique > [!tip] Concevez sur papier ou outils de design > N'hésitez pas à dessiner et concevoir vos interfaces en dehors de l'écosystème java pour vous assurez qu'elles sont cohérentes. > > Je vous invite à consulter votre collègue enseignant pour feed-back de votre conception d'interface. Le projet devra contenir les interfaces graphiques suivantes: - Un menu d’accueil - Une interface de jeu permettant de faire un combat contre l'ordinateur (CPU) - la phase de placement - la phase de bataille - résultat de la partie quand elle est terminée > [!success] Le design est libre. Il faudra juste que les interfaces possèdent les fonctionnalités demandées. > [!danger] **L'esthétique** de l'interface ne sera pas un critère de la note. ### Menu d’accueil Le menu d’accueil est **un écran de présentation** avec **un bouton** permettant de **lancer une nouvelle partie**. Vous devez aussi afficher dans un texte ou dans un écran à part les crédits du projet avec le **nom et prenom** des membres du projet ### Partie #### Placer ses vaisseaux Avant de démarrer un combat, vous devez afficher **une interface pour placer les 5 vaisseaux**. Vous devez pouvoir placer les 5 vaisseaux en respectant les règles de placement. L’interface doit permettre : - d'afficher la grille océan (mes vaisseaux) - de placer ses vaisseaux - d'empêcher les placements incorrects - de voir ses vaisseaux placés sur la grille océan - de démarrer le combat si la flotte est au complet Il ne vous est pas demandé de faire une interface très élaborée graphiquement. ### Déroulement d’un combat Une fois la phase de placement terminée, l’interface doit permettre d’affronter un autre joueur au tour par tour. L’écran doit afficher les éléments suivants: - la grille océan (mes vaisseaux) - la grille radar (mes tirs) - Le numéro du tour courant - Un historique du combat Dans la version de base du projet, le joueur devra affronter l’ordinateur (CPU). Le placement des vaisseaux du CPU peut être aléatoire. Il doit être possible d’effectuer les actions suivantes sur l’interface - choisir l’attaque au prochain tour L’historique des combats doit afficher les choses suivantes : - Le numéro du tour courant - Quand un vaisseau adverse est coulé et son bom L’affichage du combat doit se mettre à jour en temps réel lors des tours. L’ordinateur choisit ses attaques aléatoirement ## Fonctionnalités additionnelles Il vous est demandé d’implémenter **au moins 2 fonctionnalités** de la liste suivante. Si vous implémentez une 3ème fonctionnalité, des **points supplémentaires** vous seront accordés - Multijoueur en réseau via base de données - Interface supplémentaire en ligne de commandes (TUI) - Mode salve - Ravitaillement - Taille de carte personnalisable - Système de récompenses - Événements aléatoires - Musique et effets sonores - Personnalisation des préférences ### Multijoueur en réseau via base de données > [!success] Bonus de points > Cette fonctionnalité est difficile et peut vous permettre d'obtenir des **points bonus**. Stocker l'état des parties en cours en base de données. > [!warning] Serveur de base de données > Vous devez utiliser une base de données **en mode serveur**. > Cela **ne fonctionnera pas avec SQLite** > > Quelques exemples de bases de données en serveur: > - PostgreSql > - MySql > - Mariadb Le menu sera modifié pour permettre les choix suivants - Créer une partie - Rejoindre une partie - Sortir d'une partie en cours - Reprendre une partie en cours Utilisez la base de données comme un mécanisme pour persister l'état d'une partie en cours. Cela devrait vous permettre de lancer L'application sur 2 ordinateurs différents en les connectant à la même base de données. ### Interface supplémentaire en ligne de commandes (TUI) Permettre de jouer au jeu depuis un terminal en ligne de commande. > Si vous avec choisi de développer la fonctionnalité "Multijoueur en réseau", > votre client en ligne de commande doit vous permettre de jouer aussi bien > contre un adversaire dans un autre terminal que contre un adversaire > utilisant votre interface graphique JavaFX. ### Mode salve Les joueurs expérimentés apprécieront cette variante du jeu dans laquelle, à leur tour, ils tirent un nombre de missiles correspondant au nombre de vaisseaux actifs de leur flotte. Les règles suivantes s’ajoutent à celles du jeu de base : - Chaque joueur commence avec une salve de cinq tirs (un par vaisseau de sa flotte). Après chaque tir, l’adversaire signale si le tir a touché ou raté une cible. Les tirs sont marqués avec des torpilles comme pour une partie régulière. - Chaque fois qu’un de ses vaisseaux coule, le joueur déduit un tir de sa prochaine salve. Les joueurs continuent ainsi de lancer des salves jusqu’à ce qu’il y ait un gagnant. Pour ajouter un défi à la partie, les joueurs **peuvent jouer sans révéler** quel vaisseau a été touché. **Pensez votre architecture flexible qui permet d’ajouter et d’activer facilement de nouvelles règles de jeu.** ### Ravitaillement Lors de son tour de jeu, un joueur peut choisir de passer 2 tours sans tirer pour obtenir une nouvelle capacité spéciale au hasard (voir "drop rate") parmi les suivantes : > 📋 Développer au moins 4 types de ravitaillement parmi ceux proposés | Ravitaillement | Probabilité | Munitions | | ------------------------- | ----------- | --------- | | Torpille à fragmentation | 50 | 2 | | Tir fumigène | 50 | 2 | | Tir d'interception | 40 | 2 | | Raid aérien | 15 | 1 | | Bombe banane | 10 | 1 | | Ravitaillement intercepté | 5 | `_` | | Carapace bleue`*` | `*` | 1 | `*` : Voir conditions dans la section sur la carapace bleuue$ ... (à vous d'en inventer si vous le souhaitez) Les capacités additionnelles peuvent nécessiter des munitions et être sujettes à **un temps de cooldown**. **Cooldown** : Le temps minimum que le joueur doit attendre après avoir utilisé **une capacité spécifique** avant de pouvoir **l'utiliser à nouveau**. **Cooldown global** : le cooldown s'applique à **toutes les capacités**. #### Drop rate Chaque capacité à une probabilité plus ou moins forte d'être celle présente dans le ravitaillement. Ex. 1 - Torpille à fragmentation : 50 - Tir fumigène : 50 - Tir d'interception : 40 Total : 140 Probabilités de drop sont calculées en fonction des différents ravitaillements possibles : - Torpille à fragmentation : `50 / 140 = 35.7 %` - Tir fumigène : `50 / 140 = 35.7 %` - Tir d'interception : `40 / 140 = 28.6 %` --- Ex. 2 - Torpille à fragmentation : 70 - Tir fumigène : 70 - Tir d'interception : 50 - Ravitaillement intercepté : 5 Total : 195 Probabilités de drop sont calculées en fonction des différents ravitaillements possibles : - Torpille à fragmentation : `70 / 195 = 35,9 %` - Tir fumigène : `70 / 195 = 35,9 %` - Tir d'interception : `50 / 195 = 25,6 %` - Ravitaillement intercepté : `5 / 195 = 2,6 %` #### Torpille à fragmentation Une **attaque de zone** qui touche **une case** ainsi que ses **cases adjacentes horizontalement et verticalement**. Après l'utilisation de la torpille à fragmentation, on ne peut pas attaquer (tous types d'attaques) **pendant 2 tours** (**cooldown global**). Exemple. - avec un cuirassé qui occupe verticalement les cases B-3 -> E-3 - avec un patrouilleur qui occupe horizontalement les cases D-1 -> D-2 Grille océan de l'adversaire ```text 1 2 3 4 5 A ~ ~ ~ ~ ~ B ~ ~ O ~ ~ C ~ ~ O ~ ~ D O O O ~ ~ E ~ ~ 0 ~ ~ ``` Tirer la torpille à fragmentation en D-3 provoquera les effets suivants: - Patrouilleur touché - Cuirassé touché Grille radar de l'attaquant ```text 1 2 3 4 5 A ~ ~ ~ ~ ~ B ~ ~ ~ ~ ~ C ~ ~ X ~ ~ D ~ X X M ~ E ~ ~ X ~ ~ ``` Grille océan de l'adversaire ```text 1 2 3 4 5 A ~ ~ ~ ~ ~ B ~ ~ O ~ ~ C ~ ~ X ~ ~ D O X X M ~ E ~ ~ X ~ ~ ``` #### Tir fumigène La recherche débloque 2 munitions de fumigène. Consomme 1 munition de fumigène pour lancer un tir qui révèle les entités présentes sur la grille radar dans une zone carrée de 3 x 3. Il faut attendre 3 tours (cooldown) avant de pouvoir lancer de nouveau un fumigène. Lancer un fumigène n'empêche pas de faire un tir d'un autre type au tour suivant. En contrepartie, il y a 50 % de chances que l'origine du tir soit révélée à l'adversaire. Quand la recherche est débloquée, 2 tirs fumigènes sont disponibles. Lancer un tir fumigène consomme 1 munition de fumigène. Quand 0 munitions de fumigène sont disponible, le tir fumigène ne peut plus être lancé. #### Tir d'interception Le ravitaillement débloque 2 munitions de tir d'interception. Consomme 1 munition de tir d'interception pour lancer un tir de défense qui empêche le prochain tir adverse d'atteindre sa cible. Le tir est simplement annulé. #### Raid aérien Le ravitaillement permet d'obtenir 1 munition de raid aérien. Même après son obtention, le tir de raid aérien ne peut pas être utilisé avant le tour 10. Un tir de raid aérien permet de lancer rangée de bombes sur 5 cases horizontalement ou verticalement. #### Bombe banane Le ravitaillement permet d'obtenir 1 munition de bombe banane. Même après son obtention, le tir de raid aérien ne peut pas être utilisé avant le tour 5. Un tir de bombe banane permet de lancer une bombe qui touche la case visée et 3 autres cases aléatoirement dans une zone de 4 x 4 autour de l'explosion initiale. #### Ravitaillement intercepté Pas de chance ! le ravitaillement est intercepté par l'adversaire. Votre adversaire reçoit un ravitaillement à votre place (hors "Ravitaillement intercepté"). #### Carapace bleue Le ravitaillement permet d'obtenir 1 munition de carapace bleue. La carapace bleue doit être utilisée immédiatement. La carapace bleue fonctionne de la même façon que la torpille à fragmentation à l'exception des caractéristiques suivantes : - Pas de cooldown (0) : au tour qui suit un lancer de carapace bleue - La carapace est à tête chercheuse : elle touche automatiquement un vaisseau adverse à une coordonnée où il n'a pas été touché Seul le joueur ayant **le plus de retard** dans le jeu peut obtenir ce ravitaillement. C'est à dire qu'il doit avoir plus de tirs reçus qui ont touché ses vaisseaux que son adversaire. La probabilité de survenue de la carapace bleue est le nombre de tirs reçus qui ont touché des vaisseaux. Ex. Grille océan joueur 1 (4 tirs reçus ayant touché) ```text 1 2 3 4 5 A ~ ~ ~ ~ ~ B ~ ~ O ~ ~ C ~ ~ X ~ ~ D X O X ~ ~ E ~ ~ X ~ ~ ``` Taux de drop de carapace bleue pour le joueur 1 : `4` Grille océan joueur 2 (2 tirs reçus ayant touché) ```text 1 2 3 4 5 A X X ~ ~ ~ B ~ ~ ~ ~ O C ~ ~ ~ ~ O D ~ ~ ~ ~ O E ~ ~ ~ ~ O ``` Taux de drop de carapace bleue pour le joueur 2 : `0` ### Système de récompenses (achievements) Permettre de rajouter du piquant au jeu en tentant des performances de jeu. > 📋 Développer au moins 4 récompenses parmi celles proposés Récompenses disponibles selon les autres fonctionnalités additionnelles disponibles. La fonctionnalité "Core" correspond au jeu de base. | Fonctionnalité présente | Récompense | | ----------------------- | -------------------------------------- | | Core | Gagner une partie | | Core | Gagner une partie en moins de 36 tours | | Core | Avoir joué 10 parties | | Core | Avoir joué 50 parties | | Core | Avoir joué 100 parties | | Core | Konami code | | Evénements aléatoires | Une journée ensoleillée | | Mode salve | Gagner une partie en mode salve | Vous pouvez ajouter d'autres récompenses si vous le souhaitez. #### Notification Lorsqu'un achievement est déclenché, une notification apparait quelques secondes. > 🚨 Si vous avez choisi la fonctionnalité **Musique et effets sonores**, > la notification est accompagnée d'un effet sonore. #### Persistance L'avancée des récompenses du joueur est stockée dans un fichier. > 🚨 Si vous avez choisi la fonctionnalité de stockage des parties en cours **en base de données**, > l'avancée des récompenses se fait **par utilisateur** et est stockée en base de données. #### Tableau des récompenses Un écran permet de voir les récompenses déjà obtenues. On peut voir les récompenses pas encore obtenues en grisé. #### Gagner une partie La récompense est obtenue lorsque le joueur gagne une partie pour la première fois. #### Gagner une partie en moins de 36 tours La récompense est obtenue lorsque le joueur gagne une partie en moins de 36 tours. #### Gagner 10 parties La récompense est obtenue lorsque le joueur gagne sa 10ème partie. #### Gagner 50 parties La récompense est obtenue lorsque le joueur gagne sa 50ème partie. #### Gagner 100 parties La récompense est obtenue lorsque le joueur gagne sa 100ème partie. #### Konami code La récompense est obtenue quand le joueur déclenche [la combinaison de touches du code Konami](https://fr.wikipedia.org/wiki/Code_Konami) pour la première fois. #### Une journée ensoleillée > 🚨 Cet événement n'est à développer que si la fonctionnalité additionnelle **"Evénements aléatoires"** est présente. La récompense est obtenue quand l'événement **"Une journée ensoleillée"** survient pour la première fois. #### Gagner une partie (Mode salve) > 🚨 Si vous avez choisi la fonctionnalité **"Mode salve"** La récompense est obtenue lorsque le joueur gagne une partie en mode salve pour la première fois. ### Événements aléatoires Mécanique : A la fin d'un tour de bataille, un événement aléatoire survient. > 📋 Développer au moins 4 types d'événements aléatoires parmi ceux proposés Les événements affectent les 2 joueurs. Événements disponibles selon les autres fonctionnalités additionnelles disponibles. La fonctionnalité "Core" correspond au jeu de base. | Fonctionnalité présente | Evénément | Probabilité | | ----------------------- | ----------------------------- | ----------- | | Core | Rien ne se passe | 80 | | Core | Brouillage radar | 20 | | Core | Apocalypse | `*` | | Core | Pluie de météores | 5 / `**` | | Ravitaillement | Capacités bloquées | 10 | | Ravitaillement | Ravitaillement gratuit | 5 | | Système de récompenses | Juste une journée ensoleillée | | | Mode salve | Salve boostée | 10 | `*` se déclenche automatiquement au tour 30. `**` Probabilité de 5. A lieu 100% du temps à chaque tour au-delà du tour 30. > 🚨 Si la fonctionnalité "Musique et effets sonores" est présente, > Les événements sont accompagnés d'un effet sonore. #### Probabilité de survenue des événements Chaque capacité à une probabilité plus ou moins forte d'être celle présente dans le ravitaillement. Ex. 1 - Rien ne se passe : 80 - Brouillage radar : 20 - Pluie de météores : 5 Total : 105 Probabilités de survenue d'événement sont calculées en fonction des différents événements possibles : - Rien ne se passe : 80 / 105 = 76,0 % - Brouillage radar : 20 / 105 = 19,0 % - Pluie de météores : 5 / 105 = 5,0 % --- Ex. 2 - Torpille à fragmentation : 70 - Tir fumigène : 70 - Tir d'interception : 50 - Ravitaillement intercepté : 5 Total : 195 Probabilités de drop sont calculées en fonction des différents ravitaillements possibles : - Torpille à fragmentation : 70 / 195 = 35,9 % - Tir fumigène : 70 / 195 = 35,9 % - Tir d'interception : 50 / 195 = 25,6 % - Ravitaillement intercepté : 5 / 195 = 2,6 % #### Rien ne se passe C'est l'événement qui a lieu le plus souvent. Il ne se passe rien. #### Brouillage radar La grille radar et l'historique ne sont pas disponibles pendant 2 tours. C'est-à-dire qu'on ne peut pas voir les tirs qu'on a faits. Il faudra faire appel à sa mémoire. #### Pluie de météores Une pluie de météorite s'abat sur les 2 joueurs. 2 météorites tombent sur une case aléatoire de la grille océan de chaque joueur. Quand un météore tombe sur un vaisseau, l'adversaire n'en sera pas informé sur sa grille radar Ex. Grille océan du joueur 1 - 1 météore tombe aléatoirement en C-2 : à l'eau - 1 météore tombe aléatoirement en E-5 : touché ```text 1 2 3 4 5 1 2 3 4 5 A O O ~ ~ ~ A O O ~ ~ ~ B ~ ~ ~ ~ O B ~ ~ ~ ~ O C ~ ~ ~ ~ O --> C ~ M ~ ~ O D ~ ~ ~ ~ O D ~ ~ ~ ~ O E ~ ~ ~ ~ O E ~ ~ ~ ~ X ``` Grille radar du joueur 2 (il ne voit pas où les météores ont touché le joueur 1) ```text 1 2 3 4 5 1 2 3 4 5 A ~ ~ ~ ~ ~ A ~ ~ ~ ~ ~ B ~ ~ ~ ~ ~ B ~ ~ ~ ~ ~ C ~ ~ ~ ~ ~ --> C ~ ~ ~ ~ ~ D ~ ~ ~ ~ ~ D ~ ~ ~ ~ ~ E ~ ~ ~ ~ ~ E ~ ~ ~ ~ ~ ``` #### Apocalypse Si la partie n'est pas encore terminée au bout de 30 tours, l'apocalypse se déclenche. Au début de chaque prochain tour, l'événement "Pluie de météores" a lieu 100% du temps. Les autres événements que "Pluie de météore" **ne peuvent plus avoir lieu**. #### Ravitaillement gratuit (Ravitaillement) > 🚨 Cet événement n'est à développer que si la fonctionnalité additionnelle "Ravitaillement" est présente. Chaque joueur dispose d'un ravitaillement gratuit immédiat. #### Capacités bloquées (Ravitaillement) > 🚨 Cet événement n'est à développer que si la fonctionnalité additionnelle **"Ravitaillement"** est présente. Pendant 2 tours, seuls les tirs standard (jeu de base) sont possibles. Les autres capacités spéciales sont bloquées. #### Juste une journée ensoleillée > 🚨 Cet événement n'est à développer que si la fonctionnalité additionnelle **"Système de récompenses"** est présente. Les joueurs obtiennent la récompense "Une journée ensoleillée". #### Salve boostée (Mode salve) > 🚨 Cet événement n'est à développer que si la fonctionnalité additionnelle **"Mode salve"** est présente. La **prochaine salve** correspond au **nombre de vaisseaux initial** (quel que soit le nombre de vaisseaux coulés). ### Musique et effets sonores Ajouter une musique de fond et des effets sonores. - Lorsqu'un tir est lancé - Lorsqu'un tir rate (tombe à l'eau) - Lorsqu'un tir touche un vaisseau - Lorsqu'un tir coule un vaisseau - Lorsqu'un tir coule le dernier vaisseau de la flotte de l'adversaire. Effets applicables à d'autres modules additionnels - Lors de la survenue d'un événement (🚨 si la fonctionnalité "Evénements aléatoires" est présente) - Lors de la survenue d'un ravitaillement (🚨 si la fonctionnalité "Ravitaillement" est présente) - Lors de la survenue d'une récompense (🚨 si la fonctionnalité "Système de récompenses" est présente) - Lorsqu'une salve est lancée (🚨 si la fonctionnalité "Mode salve" est présente) ### Personnalisation des options - Options au lancement d'une partie - Options Générales #### Persistance A stocker dans des fichiers. > 🚨 A stocker en base de données par utilisateur > si la fonctionnalité additionnelle > "Multijoueur en réseau via base de données" est présente. #### Au démarrage d'une partie Au démarrage d'une nouvelle partie, ajouter la possibilité d'en configurer les paramètres. - Types de vaisseaux disponibles - Taille de la grille #### Options générales Accessibles depuis le menu principal - Modules actifs - Musique et effets sonores - Ravitaillement - Evénements aléatoires - Système de récompenses ##### Core - Enregistrement automatique des tirs ratés dans la grille océan ##### Module multijoueur en réseau via base de données - Chaine de connexion de la base de données ##### Module musique et effets sonores - Volume général - Volume des effets - Volume de la musique ##### Module ravitaillement - Types de ravitaillement activés - Probabilité pour chaque type de ravitaillement ##### Module événements aléatoires - Types d'événements activés - Probabilité pour chaque type d'événement - Apocalypse : nombre de tours seuil de déclenchement de l'apocalypse ##### Module système de récompenses - Rémise à zéro des récompenses