From 159a0a23f290432189f6279e1111c4b0624eca16 Mon Sep 17 00:00:00 2001 From: Amaury Date: Wed, 25 Nov 2020 12:33:20 +0100 Subject: [PATCH] setup project --- Images/Colonne.png | Bin 0 -> 197 bytes Images/Fantome.png | Bin 0 -> 289 bytes Images/Mur.png | Bin 0 -> 147 bytes Images/Pacman.png | Bin 0 -> 446 bytes Images/Vide.png | Bin 0 -> 183 bytes src/Main.java | 21 +++ src/VueControleur/VueControleurGyromite.java | 140 ++++++++++++++ src/modele/deplacements/Colonne.java | 9 + .../deplacements/Controle4Directions.java | 55 ++++++ src/modele/deplacements/Direction.java | 14 ++ src/modele/deplacements/Gravite.java | 21 +++ src/modele/deplacements/IA.java | 5 + src/modele/deplacements/Ordonnanceur.java | 53 ++++++ .../RealisateurDeDeplacement.java | 15 ++ src/modele/plateau/Bot.java | 23 +++ src/modele/plateau/Colonne.java | 9 + src/modele/plateau/Entite.java | 20 ++ src/modele/plateau/EntiteDynamique.java | 15 ++ src/modele/plateau/EntiteStatique.java | 14 ++ src/modele/plateau/Heros.java | 19 ++ src/modele/plateau/Jeu.java | 175 ++++++++++++++++++ src/modele/plateau/Mur.java | 5 + 22 files changed, 613 insertions(+) create mode 100644 Images/Colonne.png create mode 100644 Images/Fantome.png create mode 100644 Images/Mur.png create mode 100644 Images/Pacman.png create mode 100644 Images/Vide.png create mode 100644 src/Main.java create mode 100644 src/VueControleur/VueControleurGyromite.java create mode 100644 src/modele/deplacements/Colonne.java create mode 100644 src/modele/deplacements/Controle4Directions.java create mode 100644 src/modele/deplacements/Direction.java create mode 100644 src/modele/deplacements/Gravite.java create mode 100644 src/modele/deplacements/IA.java create mode 100644 src/modele/deplacements/Ordonnanceur.java create mode 100644 src/modele/deplacements/RealisateurDeDeplacement.java create mode 100644 src/modele/plateau/Bot.java create mode 100644 src/modele/plateau/Colonne.java create mode 100644 src/modele/plateau/Entite.java create mode 100644 src/modele/plateau/EntiteDynamique.java create mode 100644 src/modele/plateau/EntiteStatique.java create mode 100644 src/modele/plateau/Heros.java create mode 100644 src/modele/plateau/Jeu.java create mode 100644 src/modele/plateau/Mur.java diff --git a/Images/Colonne.png b/Images/Colonne.png new file mode 100644 index 0000000000000000000000000000000000000000..848061f8627839dce25d83268f6003eb0d64b039 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9c!3HGfPKx~mq}Y|gW!U_%O?XxI14-? ziy0XBj({-ZRBb+KpdfpRr>`sf6K-LC9qx;V&iey}f;?RuLo7}w`xvMFn4gw&CgF|Z z$pZ@NM-Ln*nAX^Ma7H5tJiKVk#-_-}@%vdV8(Z=U3m-o}u2p4X%)-o54-^=3$k`n} kpS_r^SIQ(yU?l^?`h&d6G2t&S0!?S|boFyt=akR{0At%eK>z>% literal 0 HcmV?d00001 diff --git a/Images/Fantome.png b/Images/Fantome.png new file mode 100644 index 0000000000000000000000000000000000000000..e7d192fe787697d2871532e3859b62ddac05b3f3 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9c!3HGfPKx~mq}YaY1$N*>hYnfI{m$T^vI!POqJEnzz|Nz$IPj zx`V2RoPAO)4EUUhL-|-vUmK!{?;QXq=xKYVuW&i4Rhc{=gkZWL2yUOTd zmYf{4s7;4=op7~@#q!6$rO&0$GTD98-821ozH3BD-;7t-MaU#+mUzGw~&fw|l=d#Wzp$PzfZ)WQN literal 0 HcmV?d00001 diff --git a/Images/Mur.png b/Images/Mur.png new file mode 100644 index 0000000000000000000000000000000000000000..0cc89bf1cc1c18e5eb9ad9d4e0b4961831c6371a GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9c!3HGfPKx~mq}Y|gW!U_%O?XxI14-? ziy0XBj({-ZRBb+KpdfpRr>`sf6K-LCJxKxIJFP$=1y2{p5R22vDG3Qb&O5LkIO3pc mkab~&<6^d6DU&xmObq877*&6B-cSLmW$<+Mb6Mw<&;$S)hbN~1 literal 0 HcmV?d00001 diff --git a/Images/Pacman.png b/Images/Pacman.png new file mode 100644 index 0000000000000000000000000000000000000000..d60a327ae6a23921ba7f7d9c60b36a32e0e57a89 GIT binary patch literal 446 zcmV;v0YUzWP)2z;_$e;9kaM_G opOu@qT3^TmY-2Z)@1xHC3;4xnooa(8(EtDd07*qoM6N<$f)3oeNB{r; literal 0 HcmV?d00001 diff --git a/Images/Vide.png b/Images/Vide.png new file mode 100644 index 0000000000000000000000000000000000000000..60c9d689f9d1147129cc630a35a0cb6979478725 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9c!3HGfPKx~mq!^2X+?^QKos)S9a~60+7BevL9RXp+soH$fKtZ-7Z+91l{~)+v@AAn&5%v;KUsv`=+%i0p ztPX|B^hK1BqC!6)n*9^hM!+ql lstDeplacements = new ArrayList(); + private long pause; + public void add(RealisateurDeDeplacement deplacement) { + lstDeplacements.add(deplacement); + } + + public Ordonnanceur(Jeu _jeu) { + jeu = _jeu; + } + + public void start(long _pause) { + pause = _pause; + new Thread(this).start(); + } + + @Override + public void run() { + boolean update = false; + + while(true) { + jeu.resetCmptDepl(); + for (RealisateurDeDeplacement d : lstDeplacements) { + if (d.realiserDeplacement()) + update = true; + } + + Controle4Directions.getInstance().resetDirection(); + + if (update) { + setChanged(); + notifyObservers(); + } + + try { + sleep(pause); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + } +} diff --git a/src/modele/deplacements/RealisateurDeDeplacement.java b/src/modele/deplacements/RealisateurDeDeplacement.java new file mode 100644 index 0000000..242c3bf --- /dev/null +++ b/src/modele/deplacements/RealisateurDeDeplacement.java @@ -0,0 +1,15 @@ +package modele.deplacements; + +import modele.plateau.EntiteDynamique; + +import java.util.ArrayList; + +/** +Tous les déplacement sont déclenchés par cette classe (gravité, controle clavier, IA, etc.) + */ +public abstract class RealisateurDeDeplacement { + protected ArrayList lstEntitesDynamiques = new ArrayList(); + protected abstract boolean realiserDeplacement(); + + public void addEntiteDynamique(EntiteDynamique ed) {lstEntitesDynamiques.add(ed);}; +} diff --git a/src/modele/plateau/Bot.java b/src/modele/plateau/Bot.java new file mode 100644 index 0000000..b13b738 --- /dev/null +++ b/src/modele/plateau/Bot.java @@ -0,0 +1,23 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package modele.plateau; + +import java.util.Random; + +/** + * Ennemis (Smicks) + */ +public class Bot extends EntiteDynamique { + private Random r = new Random(); + + public Bot(Jeu _jeu) { + super(_jeu); + } + + public boolean peutEtreEcrase() { return true; } + public boolean peutServirDeSupport() { return true; } + public boolean peutPermettreDeMonterDescendre() { return false; }; +} diff --git a/src/modele/plateau/Colonne.java b/src/modele/plateau/Colonne.java new file mode 100644 index 0000000..a9415a5 --- /dev/null +++ b/src/modele/plateau/Colonne.java @@ -0,0 +1,9 @@ +package modele.plateau; + +public class Colonne extends EntiteDynamique { + public Colonne(Jeu _jeu) { super(_jeu); } + + public boolean peutEtreEcrase() { return false; } + public boolean peutServirDeSupport() { return true; } + public boolean peutPermettreDeMonterDescendre() { return false; }; +} diff --git a/src/modele/plateau/Entite.java b/src/modele/plateau/Entite.java new file mode 100644 index 0000000..a56b695 --- /dev/null +++ b/src/modele/plateau/Entite.java @@ -0,0 +1,20 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package modele.plateau; + +import modele.deplacements.Direction; + +public abstract class Entite { + protected Jeu jeu; + + public Entite(Jeu _jeu) { + jeu = _jeu; + } + + public abstract boolean peutEtreEcrase(); // l'entité peut être écrasée (par exemple par une colonne ...) + public abstract boolean peutServirDeSupport(); // permet de stopper la gravité, prendre appui pour sauter + public abstract boolean peutPermettreDeMonterDescendre(); // si utilisation de corde (attention, l'environnement ne peut pour l'instant sotker qu'une entité par case (si corde : 2 nécessaires), améliorations à prévoir) +} diff --git a/src/modele/plateau/EntiteDynamique.java b/src/modele/plateau/EntiteDynamique.java new file mode 100644 index 0000000..dfe7910 --- /dev/null +++ b/src/modele/plateau/EntiteDynamique.java @@ -0,0 +1,15 @@ +package modele.plateau; + +import modele.deplacements.Direction; + +/** + * Entités amenées à bouger (colonnes, ennemis) + */ +public abstract class EntiteDynamique extends Entite { + public EntiteDynamique(Jeu _jeu) { super(_jeu); } + + public boolean avancerDirectionChoisie(Direction d) { + return jeu.deplacerEntite(this, d); + } + public Entite regarderDansLaDirection(Direction d) {return jeu.regarderDansLaDirection(this, d);} +} diff --git a/src/modele/plateau/EntiteStatique.java b/src/modele/plateau/EntiteStatique.java new file mode 100644 index 0000000..0909109 --- /dev/null +++ b/src/modele/plateau/EntiteStatique.java @@ -0,0 +1,14 @@ +package modele.plateau; + +/** + * Ne bouge pas (murs...) + */ +public abstract class EntiteStatique extends Entite { + public EntiteStatique(Jeu _jeu) { + super(_jeu); + } + + public boolean peutEtreEcrase() { return false; } + public boolean peutServirDeSupport() { return true; } + public boolean peutPermettreDeMonterDescendre() { return false; }; +} \ No newline at end of file diff --git a/src/modele/plateau/Heros.java b/src/modele/plateau/Heros.java new file mode 100644 index 0000000..992d257 --- /dev/null +++ b/src/modele/plateau/Heros.java @@ -0,0 +1,19 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package modele.plateau; + +/** + * Héros du jeu + */ +public class Heros extends EntiteDynamique { + public Heros(Jeu _jeu) { + super(_jeu); + } + + public boolean peutEtreEcrase() { return true; } + public boolean peutServirDeSupport() { return true; } + public boolean peutPermettreDeMonterDescendre() { return false; }; +} diff --git a/src/modele/plateau/Jeu.java b/src/modele/plateau/Jeu.java new file mode 100644 index 0000000..6c7e371 --- /dev/null +++ b/src/modele/plateau/Jeu.java @@ -0,0 +1,175 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package modele.plateau; + +import modele.deplacements.Controle4Directions; +import modele.deplacements.Direction; +import modele.deplacements.Gravite; +import modele.deplacements.Ordonnanceur; + +import java.awt.Point; +import java.util.HashMap; + +/** Actuellement, cette classe gère les postions + * (ajouter conditions de victoire, chargement du plateau, etc.) + */ +public class Jeu { + + public static final int SIZE_X = 20; + public static final int SIZE_Y = 10; + + // compteur de déplacements horizontal et vertical (1 max par défaut, à chaque pas de temps) + private HashMap cmptDeplH = new HashMap(); + private HashMap cmptDeplV = new HashMap(); + + private Heros hector; + + private HashMap map = new HashMap(); // permet de récupérer la position d'une entité à partir de sa référence + private Entite[][] grilleEntites = new Entite[SIZE_X][SIZE_Y]; // permet de récupérer une entité à partir de ses coordonnées + + private Ordonnanceur ordonnanceur = new Ordonnanceur(this); + + public Jeu() { + initialisationDesEntites(); + } + + public void resetCmptDepl() { + cmptDeplH.clear(); + cmptDeplV.clear(); + } + + public void start(long _pause) { + ordonnanceur.start(_pause); + } + + public Entite[][] getGrille() { + return grilleEntites; + } + + public Heros getHector() { + return hector; + } + + private void initialisationDesEntites() { + hector = new Heros(this); + addEntite(hector, 2, 1); + + Gravite g = new Gravite(); + g.addEntiteDynamique(hector); + ordonnanceur.add(g); + + Controle4Directions.getInstance().addEntiteDynamique(hector); + ordonnanceur.add(Controle4Directions.getInstance()); + + // murs extérieurs horizontaux + for (int x = 0; x < 20; x++) { + addEntite(new Mur(this), x, 0); + addEntite(new Mur(this), x, 9); + } + + // murs extérieurs verticaux + for (int y = 1; y < 9; y++) { + addEntite(new Mur(this), 0, y); + addEntite(new Mur(this), 19, y); + } + + addEntite(new Mur(this), 2, 6); + addEntite(new Mur(this), 3, 6); + } + + private void addEntite(Entite e, int x, int y) { + grilleEntites[x][y] = e; + map.put(e, new Point(x, y)); + } + + /** Permet par exemple a une entité de percevoir sont environnement proche et de définir sa stratégie de déplacement + * + */ + public Entite regarderDansLaDirection(Entite e, Direction d) { + Point positionEntite = map.get(e); + return objetALaPosition(calculerPointCible(positionEntite, d)); + } + + /** Si le déplacement de l'entité est autorisé (pas de mur ou autre entité), il est réalisé + * Sinon, rien n'est fait. + */ + public boolean deplacerEntite(Entite e, Direction d) { + boolean retour = false; + + Point pCourant = map.get(e); + + Point pCible = calculerPointCible(pCourant, d); + + if (contenuDansGrille(pCible) && objetALaPosition(pCible) == null) { // a adapter (collisions murs, etc.) + // compter le déplacement : 1 deplacement horizontal et vertical max par pas de temps par entité + switch (d) { + case bas: + case haut: + if (cmptDeplV.get(e) == null) { + cmptDeplV.put(e, 1); + + retour = true; + } + break; + case gauche: + case droite: + if (cmptDeplH.get(e) == null) { + cmptDeplH.put(e, 1); + retour = true; + + } + break; + } + } + + if (retour) { + deplacerEntite(pCourant, pCible, e); + } + + return retour; + } + + + private Point calculerPointCible(Point pCourant, Direction d) { + Point pCible = null; + + switch(d) { + case haut: pCible = new Point(pCourant.x, pCourant.y - 1); break; + case bas : pCible = new Point(pCourant.x, pCourant.y + 1); break; + case gauche : pCible = new Point(pCourant.x - 1, pCourant.y); break; + case droite : pCible = new Point(pCourant.x + 1, pCourant.y); break; + + } + + return pCible; + } + + private void deplacerEntite(Point pCourant, Point pCible, Entite e) { + grilleEntites[pCourant.x][pCourant.y] = null; + grilleEntites[pCible.x][pCible.y] = e; + map.put(e, pCible); + } + + /** Indique si p est contenu dans la grille + */ + private boolean contenuDansGrille(Point p) { + return p.x >= 0 && p.x < SIZE_X && p.y >= 0 && p.y < SIZE_Y; + } + + private Entite objetALaPosition(Point p) { + Entite retour = null; + + if (contenuDansGrille(p)) { + retour = grilleEntites[p.x][p.y]; + } + + return retour; + } + + public Ordonnanceur getOrdonnanceur() { + return ordonnanceur; + } +} diff --git a/src/modele/plateau/Mur.java b/src/modele/plateau/Mur.java new file mode 100644 index 0000000..53055c0 --- /dev/null +++ b/src/modele/plateau/Mur.java @@ -0,0 +1,5 @@ +package modele.plateau; + +public class Mur extends EntiteStatique { + public Mur(Jeu _jeu) { super(_jeu); } +}