From b852da12331d18b075ba49bc0bdf5a4f79d1531d Mon Sep 17 00:00:00 2001 From: Nico Date: Sun, 7 May 2017 16:26:09 +0200 Subject: [PATCH] Added antijeu mechanic; improved moving pieces --- README.md | 2 +- nomsDisponibles.txt | 1 + src/diaballik/Diaballik.java | 4 +- src/diaballik/DiaballikJeu.css | 30 +++++-- .../controller/ActionsController.java | 2 +- .../controller/TerrainController.java | 5 ++ src/diaballik/model/Jeu.java | 85 ++++++++++++++++++- src/diaballik/model/Joueur.java | 4 - src/diaballik/model/Terrain.java | 4 + src/diaballik/view/Dialogs.java | 17 +++- 10 files changed, 135 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index fb36343..3607e5a 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ la sauvegarde) * Améliorer visuel et IHM de la partie jeu (couleurs, effets, anims, images pions) * (Jeu en réseau) ? -Voir README.md +Voir TODO.md ## Images IHM réalisées par Loïc Houdebine (voir lien dans la dernière section) ### Menu diff --git a/nomsDisponibles.txt b/nomsDisponibles.txt index 2ce105b..9b76b93 100644 --- a/nomsDisponibles.txt +++ b/nomsDisponibles.txt @@ -7,6 +7,7 @@ L'accent qui fait crasher é_è Blanchon testing Wack attack Elen Book +Elen Library One dollar Emenems Marion Babtou diff --git a/src/diaballik/Diaballik.java b/src/diaballik/Diaballik.java index 11bf586..22c1238 100644 --- a/src/diaballik/Diaballik.java +++ b/src/diaballik/Diaballik.java @@ -64,8 +64,8 @@ public void newGame(String path, boolean isSave) { showSceneJeu(); } - public void endGame(Joueur gagnant) { - Dialogs.showEndGame(gagnant); + public void endGame(Joueur gagnant, int victoireType) { + Dialogs.showEndGame(gagnant, victoireType); showSceneMenu(); } diff --git a/src/diaballik/DiaballikJeu.css b/src/diaballik/DiaballikJeu.css index 84af624..028c2cd 100644 --- a/src/diaballik/DiaballikJeu.css +++ b/src/diaballik/DiaballikJeu.css @@ -17,7 +17,7 @@ -fx-font-size: 175%; } -#actionsView > VBox > .button { +/*#actionsView > VBox > .button { -fx-background-color: linear-gradient(#f2f2f2, #d6d6d6), linear-gradient(#fcfcfc 0%, #d9d9d9 20%, #d6d6d6 100%), @@ -31,17 +31,35 @@ -fx-padding: 10px; } -#actionsView > VBox > #passerTour { - -fx-font-weight: bold; - -fx-font-size: 150%; -} - #actionsView > VBox > .button:hover { -fx-background-color: linear-gradient(#d2d2d2, #b4b4b4), linear-gradient(#e6e6e6 0%, #c0c0c0 20%, #a1a1a1 100%), linear-gradient(#bebebe 0%, #d6d6d6 50%); -fx-cursor: hand; +}*/ + +#actionsView > VBox > .button { + -fx-background-color: linear-gradient(to bottom, #3498db, #2980b9); + -fx-background-radius: 4px; + -fx-background-insets: 2px; + -fx-font-family: "Arial"; + -fx-text-fill: white; + -fx-font-size: 140%; + -fx-padding: 10px; + -fx-border-radius: 4px; + -fx-border-color: black; + -fx-border-width: 2px; +} + +#actionsView > VBox > .button:hover { + -fx-background-color: linear-gradient(to bottom, #3cb0fd, #3498db); + -fx-cursor: hand; +} + +#actionsView > VBox > #passerTour { + -fx-font-weight: bold; + -fx-font-size: 175%; } /* AFFICHAGE VIEW */ diff --git a/src/diaballik/controller/ActionsController.java b/src/diaballik/controller/ActionsController.java index 52fe46b..437a5e9 100644 --- a/src/diaballik/controller/ActionsController.java +++ b/src/diaballik/controller/ActionsController.java @@ -51,7 +51,7 @@ public void saveGame(String directory) { } public void antijeu() { - System.out.println("Antijeu"); + System.out.println("Antijeu : " + jeu.antijeu()); } public void rollback() { diff --git a/src/diaballik/controller/TerrainController.java b/src/diaballik/controller/TerrainController.java index 003ebe3..f48a954 100644 --- a/src/diaballik/controller/TerrainController.java +++ b/src/diaballik/controller/TerrainController.java @@ -67,6 +67,11 @@ public void mouseClicked(Point point) { this.caseSelectionne.getPion().setSelectionne(false); this.jeu.deplacement(this.caseSelectionne.getPion(), caseCliquee); finSelection(); + if (jeu.getJoueurActuel().getDeplacementsRestants() > 0) { + this.caseSelectionne = caseCliquee; + this.caseSelectionne.getPion().setSelectionne(true); + marquerAll(caseCliquee); + } } } } diff --git a/src/diaballik/model/Jeu.java b/src/diaballik/model/Jeu.java index 365d4ed..f60842d 100644 --- a/src/diaballik/model/Jeu.java +++ b/src/diaballik/model/Jeu.java @@ -79,6 +79,9 @@ public String toString() { public final static int CHANGED_TOUR = 2; public final static int CHANGED_ALL = 3; + public final static int VICTOIRE_NORMALE = 1; + public final static int VICTOIRE_ANTIJEU = 2; + public Jeu(ConfigurationPartie cp, Diaballik diaballik) { this.diaballik = diaballik; @@ -198,6 +201,77 @@ public void save(String path) { } } + public boolean antijeu() { + // 1: On vérifie si ils sont tous sur une colonne différente + Pion[] tab = new Pion[7]; // on se souvient de la ligne des pions + for (Pion p : getTerrain().getPions()[getJoueurAdverse().getCouleur()]) { // pour chaque pion du joueur adversaire + if (tab[p.getPosition().getPoint().getX()] != null) { + System.out.println("Antijeu: etape 1 non valide"); + return false; + } else { + tab[p.getPosition().getPoint().getX()] = p; + } + } + + // 2: On vérifie qu'ils bloquent le passage (qu'ils sont côte à côte, direct ou en diagonal) + int i = 1; + Pion p1 = tab[0], p2 = tab[i]; + while (++i < 7) { + if (Math.abs(p1.getPosition().getPoint().getY() - p2.getPosition().getPoint().getY()) > 1) { + System.out.println("Antijeu: etape 2 non valide"); + return false; + } + + p1 = p2; + p2 = tab[i]; + } + + // 3: on vérifie que le joueur qui a appelé antijeu a bien 3 pions collés au mur + int n = 0; + Point po; + Case c; + for (Pion p : getTerrain().getPions()[getJoueurActuel().getCouleur()]) { // pour chaque pion du joueur actuel + po = p.getPosition().getPoint(); + + if (n >= 3) break; + + // vérif case de gauche + c = getTerrain().getCaseAt(new Point(po.getX() - 1, po.getY())); + if (c != null && c.getPion() != null && c.getPion().getCouleur() == getJoueurAdverse().getCouleur()) { + n++; + continue; + } + + // vérif case du haut + c = getTerrain().getCaseAt(new Point(po.getX(), po.getY() + 1)); + if (c != null && c.getPion() != null && c.getPion().getCouleur() == getJoueurAdverse().getCouleur()) { + n++; + continue; + } + + // vérif case de droite + c = getTerrain().getCaseAt(new Point(po.getX() + 1, po.getY())); + if (c != null && c.getPion() != null && c.getPion().getCouleur() == getJoueurAdverse().getCouleur()) { + n++; + continue; + } + + // vérif case du bas + c = getTerrain().getCaseAt(new Point(po.getX(), po.getY() - 1)); + if (c != null && c.getPion() != null && c.getPion().getCouleur() == getJoueurAdverse().getCouleur()) { + n++; + } + } + + if (n >= 3) { + diaballik.endGame(getJoueurActuel(), VICTOIRE_ANTIJEU); + return true; + } else { + System.out.println("Antijeu: etape 3 non valide (n = " + n + ")"); + return false; + } + } + // Effectue un déplacement (le pion p se déplace sur la case c) public void deplacement(Pion p, Case c) { if (!p.aLaBalle() && deplacementPossible(p.getPosition(), c) && this.getJoueurActuel().actionPossible(Joueur.ACTION_DEPLACEMENT)) { @@ -376,7 +450,7 @@ public void passe(Pion p, Case c) { if (partieTerminee(c.getPion())) { // la partie est terminée (le vainqueur est joueurActuel()) - diaballik.endGame(getJoueurActuel()); + diaballik.endGame(getJoueurActuel(), VICTOIRE_NORMALE); } if (!this.getJoueurActuel().moinsAction(Joueur.ACTION_PASSE)) { @@ -413,13 +487,18 @@ public void changerTour() { historique.clear(); getJoueurActuel().reset_actions(); this.tour++; - joueurActuel = (joueurActuel + 1 >= Jeu.NOMBRE_JOUEURS ? 0 : joueurActuel + 1); + joueurActuel = ++joueurActuel % Jeu.NOMBRE_JOUEURS; + //joueurActuel = (joueurActuel + 1 >= Jeu.NOMBRE_JOUEURS ? 0 : joueurActuel + 1); updateListeners(CHANGED_TOUR); } public Joueur getJoueurActuel() { - return this.joueurs[(tour-1) % NOMBRE_JOUEURS]; + return this.joueurs[joueurActuel % NOMBRE_JOUEURS]; + } + + public Joueur getJoueurAdverse() { + return this.joueurs[(joueurActuel + 1) % NOMBRE_JOUEURS]; } public ArrayList getHistorique() { diff --git a/src/diaballik/model/Joueur.java b/src/diaballik/model/Joueur.java index ca7bf01..d5a6f7c 100644 --- a/src/diaballik/model/Joueur.java +++ b/src/diaballik/model/Joueur.java @@ -1,7 +1,5 @@ package diaballik.model; -import javafx.scene.paint.Color; - public class Joueur { private Terrain terrain; private Jeu jeu; @@ -21,8 +19,6 @@ public class Joueur { // Joueurs et couleurs public final static int JOUEUR_VERT = 0; // J vert public final static int JOUEUR_ROUGE = 1; // J rouge - public final static Color COULEUR_VERT = Color.GREEN; // Couleur du J vert - public final static Color COULEUR_ROUGE = Color.RED; // Couleur du J rouge public Joueur(Jeu jeu, int couleur) { this.jeu = jeu; diff --git a/src/diaballik/model/Terrain.java b/src/diaballik/model/Terrain.java index 004d810..053b8b5 100644 --- a/src/diaballik/model/Terrain.java +++ b/src/diaballik/model/Terrain.java @@ -129,4 +129,8 @@ public String getSaveString() { return sb.toString(); } + + public Pion[][] getPions() { + return pions; + } } diff --git a/src/diaballik/view/Dialogs.java b/src/diaballik/view/Dialogs.java index 8fb0aaf..f3a43ad 100644 --- a/src/diaballik/view/Dialogs.java +++ b/src/diaballik/view/Dialogs.java @@ -3,6 +3,7 @@ import diaballik.Diaballik; import diaballik.model.ConfigurationPartie; import diaballik.model.IA; +import diaballik.model.Jeu; import diaballik.model.Joueur; import javafx.application.Platform; import javafx.collections.FXCollections; @@ -233,11 +234,23 @@ private List getFilesInDir(String directory) { return results; } - public static void showEndGame(Joueur gagnant) { + public static void showEndGame(Joueur gagnant, int victoireType) { + String victoireMessage = "Type de victoire: "; + switch (victoireType) { + case Jeu.VICTOIRE_NORMALE: + victoireMessage += "normale."; + break; + case Jeu.VICTOIRE_ANTIJEU: + victoireMessage += "par antijeu."; + break; + default: + victoireMessage += "inconnue."; + } + Alert alert = new Alert(Alert.AlertType.INFORMATION); alert.setTitle("Partie terminée"); alert.setHeaderText("Fin de la partie"); - alert.setContentText("Partie terminée!\nJoueur " + gagnant.getNom() + " l'emporte!"); + alert.setContentText("Partie terminée!\nJoueur " + gagnant.getNom() + " l'emporte!\n" + victoireMessage); alert.showAndWait(); }