From 7f17674f5ad5aa8f8ae39f4580f84b51154227ac Mon Sep 17 00:00:00 2001 From: guezoloic Date: Thu, 23 May 2024 15:21:47 +0200 Subject: [PATCH] changement de tout le programme avec ajout de plein de nouvelle chose et coorection de chose pour le rendre plus pratique --- src/Connexion/Reseau.java | 281 ------------------ src/Environnements/Grid.java | 13 + src/Environnements/Map.java | 83 +++--- src/Main.java | 13 +- src/Personnages/Personnage.java | 11 +- src/Personnages/Player.java | 63 +++- src/Personnages/Robot.java | 7 - src/display/Display.java | 149 ++-------- src/display/Wall.java | 43 +++ src/game/Terminal.java | 143 ++------- src/object/Items.java | 34 --- src/object/Snake.java | 32 -- src/tests/MapTest.java | 11 +- src/tests/PersonnageTest.java | 12 +- .../Effects.java => types/Effect.java} | 14 +- src/types/Item.java | 67 +++++ .../Mouvements.java => types/Mouvement.java} | 11 +- src/types/SnakePart.java | 36 +++ 18 files changed, 344 insertions(+), 679 deletions(-) delete mode 100644 src/Connexion/Reseau.java create mode 100644 src/Environnements/Grid.java delete mode 100644 src/Personnages/Robot.java create mode 100644 src/display/Wall.java delete mode 100644 src/object/Items.java delete mode 100644 src/object/Snake.java rename src/{object/Effects.java => types/Effect.java} (56%) create mode 100644 src/types/Item.java rename src/{object/Mouvements.java => types/Mouvement.java} (86%) create mode 100644 src/types/SnakePart.java diff --git a/src/Connexion/Reseau.java b/src/Connexion/Reseau.java deleted file mode 100644 index 8b30758..0000000 --- a/src/Connexion/Reseau.java +++ /dev/null @@ -1,281 +0,0 @@ -package connexion; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.HttpURLConnection; -import java.net.URL; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; -import javax.net.ssl.HttpsURLConnection; - -import static java.util.Arrays.copyOfRange; - -/** - *

Cette classe est destiné un projet de fin d'année de L1, ne pas l'utiliser dans - * d'autre circonstance que dans ce projet. Elle contient plusieurs fonctions qui est - * utile pour la communication entre la machine et le site Padifac. - * - * @author Loïc GUEZO - * @version 1.0.0 - * @since 2024 - * @see Padiflac - */ -@SuppressWarnings("deprecation") - public class Reseau { - private static final String ADDRESS = "https://prog-reseau-m1.lacl.fr/padiflac/"; - private String CHANNEL; - private URL url; - - private ArrayList wordArrayList; - private ArrayList newerWordArrayList; - - private int index; - - /** - *

Le constructeur defini quelque information cruciale puis appelle directement la - * fonction {@code #searchContent()}. - * - * @param channel Ce string est utilisé pour se connecter à un channel dans le serveur web - */ - public Reseau(String channel) { - this.CHANNEL = channel; - this.wordArrayList = new ArrayList(); - this.newerWordArrayList = new ArrayList(); - - this.connexion(); - } - - /** - *

cette fonction redefini quelque information cruciale puis appelle directement la - * fonction {@code #searchContentSorted()}. - * - * @param channel Ce string est utilisé pour se reconnecter à un channel dans le serveur web - */ - public void reconnexion(String channel) { - this.CHANNEL = channel; - this.wordArrayList.clear(); - this.newerWordArrayList.clear(); - - this.connexion(); - } - - /** - * @return cette fonction renvoie tout ce qui est disponible sur le site quand on appelle la - * fonction searchContent et qui mets tout le texte dans le {@link ArrayList} - */ - public ArrayList getArrayContent() { - return this.wordArrayList; - } - - /** - * @return cette fonction renvoie uniquement les nouveauté de qui est disponible sur le site - * quand on appelle la fonction searchContent et qui mets tout le texte dans le {@link ArrayList} - */ - public ArrayList getNewArrayListContent() { - return this.newerWordArrayList; - } - - /** - *

cette fonction est en parallèle avec {@code #getLastedContent()} qui récupère le dernier indice - * utilisé lors de l'appelle de {@code #getLastedContent()}. - * @return renvoie le dernier indice - */ - public int getIndex() { - return this.index; - } - - /** - *

cette fonction est en parallèle avec {@code #getLastedContent()} et {@code #getIndex()}. Elle va - * reset l'indice. - */ - public void resetIndex() { - this.index = 0; - } - - /** - * @return cette fonction renvoie le String de l'indice puis l'incrémenter. Si c'est la fin de la liste, - * il renvoie null sans incrémenter - */ - public String getLastedContent() { - return (this.getArrayContent().size() > this.index) ? getArrayContent().get(this.index++) : null; - } - - /** - *

cherche les informations et trie seulement les nouvelles entre eux : - *


-     * Reseau reseau = new Reseau("ChatTest"); // dans le serveur : {"arbre", "pomme", "chocolat", "arbre"}
-     *System.out.println(reseau.searchContentSorted().toString()); // {"arbre", "arbre", "pomme", "chocolat"}
-     * 
- * @return il renvoie le {@link ArrayList} de la liste - */ - public ArrayList searchContentSorted() { - ArrayList localNewerArrayList = this.searchContent(); - if (this.getArrayContent().isEmpty()) this.addContentToContent(localNewerArrayList); - else this.searchDuplicates(localNewerArrayList); - return this.wordArrayList; - } - - /** - *

cherche les informations mais ne trie pas les nouvelles entre eux : - *


-     * Reseau reseau = new Reseau("ChatTest"); // dans le serveur : {"arbre", "pomme", "chocolat", "arbre"}
-     *System.out.println(reseau.searchContentSorted().toString()); // {"arbre", "arbre", "pomme", "chocolat"}
-     * 
- *

attention, il peut y avoir des erreurs en rajoutant par exemple {"arbre", "pomme", "chocolat", "pomme"} - * @return - */ - public ArrayList searchArrayListNotSorted() { - ArrayList localNewerArrayList = this.searchContent(); - this.addContentToContent(localNewerArrayList); - return this.wordArrayList; - } - - /** - *

ce programme essaye d'envoyer le String en parametre. Attention, la communication entre le serveur et la machine - * peut prendre du temps ! - * @param content Le contenu de texte que vous voulez renvoyer - */ - public void sendContent(String content) { - try { - this.url = new URL(ADDRESS + CHANNEL + "?nonce=" + this.generateNonce()); - HttpsURLConnection connection = (HttpsURLConnection)this.url.openConnection(); - - connection.setRequestMethod("POST"); - connection.setDoOutput(true); - - OutputStream outputStream = connection.getOutputStream(); - outputStream.write(serializeToString(content)); - outputStream.close(); - - int responseCode = connection.getResponseCode(); - if (responseCode == HttpURLConnection.HTTP_OK) { - InputStream inputStream = connection.getInputStream(); - inputStream.close(); - } else { - System.out.println("Erreur lors de l'envoi de la requête. Code de réponse : " + responseCode); - } - - } catch (Exception e) { - e.printStackTrace(); - } - } - - private ArrayList searchContent() { - try { - byte[] bytes = this.url.openConnection().getInputStream().readAllBytes(); - ArrayList localNewerArrayList = new ArrayList(); - - StringBuffer textContent = new StringBuffer(); - - for(int i = 0; i < bytes.length; i++) { - byte charByte = bytes[i]; - - if(charByte == '|' && textContent.length() > 0) { - int size = Integer.parseInt(textContent.toString()); - byte[] buffer = copyOfRange(bytes, i + 1, i + 1 + size); - - localNewerArrayList.add(new String(buffer)); - - i += size; - textContent.setLength(0); - - } else { - textContent.append((char)charByte); - } - } - return localNewerArrayList; - - } catch (Exception e) { - return null; - } - } - - private void addContentToContent(ArrayList localArrayList) { - int arrayListLength = this.getArrayContent().size(); - - this.newerWordArrayList.clear(); - - for(int i = arrayListLength; i < localArrayList.size(); i++) { - String arrayListValue = localArrayList.get(i); - this.wordArrayList.add(arrayListValue); - this.newerWordArrayList.add(arrayListValue); - } - } - - private void searchDuplicates(ArrayList localArrayList) { - HashMap counterHashMap = this.compareHashMap( - arrayListToHashmapCounter(this.wordArrayList), - arrayListToHashmapCounter(localArrayList) - ); - - this.newerWordArrayList.clear(); - - for(Map.Entry value : counterHashMap.entrySet()) { - String arrayListValue = value.getKey(); - - for(int i =0; i arrayListToHashmapCounter(ArrayList list) { - HashMap hashmapListCounter = new HashMap(); - - for(int i = 0; i compareHashMap(HashMap olderHashMap, HashMap newerHashMap) { - HashMap hashMapCompared = new HashMap(); - - for (Map.Entry entry : newerHashMap.entrySet()) { - String key = entry.getKey(); - Integer newValue = entry.getValue(); - Integer oldValue = olderHashMap.get(key); - - if (oldValue == null) { - hashMapCompared.put(key, newValue); - } else if (newValue > oldValue) { - hashMapCompared.put(key, newValue - oldValue); - } - } - - return hashMapCompared; - } - - private String generateNonce() { - return UUID.randomUUID().toString().replace("-", "")+ - UUID.randomUUID().toString().replace("-", ""); - } - - private byte[] serializeToString(String text) throws IOException { - return text.getBytes(); - } - - private void connexion() { - try { - this.url = new URL(ADDRESS + CHANNEL); - - this.searchContentSorted(); - } catch (IOException e) { - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/src/Environnements/Grid.java b/src/Environnements/Grid.java new file mode 100644 index 0000000..d8cf71d --- /dev/null +++ b/src/Environnements/Grid.java @@ -0,0 +1,13 @@ +package environnements; + +import types.Effect; + +public interface Grid { + public default String getName() { return this.toString().toLowerCase(); } + public default Effect get() { return null; } + + public void updateStringCode(String textCode); + public String getStringCode(); + + public Grid[] getValues(); +} \ No newline at end of file diff --git a/src/Environnements/Map.java b/src/Environnements/Map.java index 55061fd..ff66932 100644 --- a/src/Environnements/Map.java +++ b/src/Environnements/Map.java @@ -3,7 +3,7 @@ package environnements; import java.util.ArrayList; import java.util.Random; -import object.*; +import types.*; import personnages.*; @@ -16,17 +16,17 @@ public class Map { * cette variable est toute la grille où se * passe tout le jeu. */ - private Object grid[][]; + private Grid grid[][]; /** - * cette variable recupere tout les objects stockés, + * cette variable recupere tout les Grids stockés, * elle complete {@link #coordinateItems}. */ - private ArrayList ObjectItems; + private ArrayList GridItems; /** * cette variable recupere tout les coordonnées des - * objects stockés, elle complete {@link #ObjectItems}. + * Grids stockés, elle complete {@link #GridItems}. */ private ArrayList coordinateItems; @@ -45,9 +45,9 @@ public class Map { this.longueur = longueur; this.largeur = largeur; - this.grid = new Object[this.largeur][this.longueur]; + this.grid = new Grid[this.largeur][this.longueur]; - this.ObjectItems = new ArrayList<>(); + this.GridItems = new ArrayList<>(); this.coordinateItems = new ArrayList<>(); this.fillGrid(); @@ -61,7 +61,7 @@ public class Map { private void fillGrid() { for(int i = 0; i < this.grid.length; i++) { for(int k = 0; k < this.grid[0].length; k++) { - this.grid[i][k] = Items.VOID; + this.grid[i][k] = Item.VOID; } } } @@ -69,7 +69,7 @@ public class Map { /** * renvoie la grille du jeu. */ - public Object[][] getGrid() { + public Grid[][] getGrid() { return grid.clone(); } @@ -83,9 +83,9 @@ public class Map { * @param coordinate * @return un {@link Effects} */ - public Effects getEffect(int[] coordinate) { - Object object = this.grid[coordinate[1]][coordinate[0]]; - return (object instanceof Items) ? ((Items)object).getEffects() : ((Snake)object).getEffects(); + public Effect getEffect(int[] coordinate) { + Grid gridCoordinate = this.grid[coordinate[1]][coordinate[0]]; + return gridCoordinate.get(); } /** @@ -96,12 +96,12 @@ public class Map { } /** - * inverse toute la grille pour soit mettre 0, 0 en bas + * inverse toute la grille pour soit mettre (0, 0) en bas * ou en haut. */ - public Object[][] getInverseGrid() { - Object[][] grid = getGrid(); - Object[][] inverseGrid = new Object[this.largeur][this.longueur]; + public Grid[][] getInverseGrid() { + Grid[][] grid = getGrid(); + Grid[][] inverseGrid = new Grid[this.largeur][this.longueur]; int k = 0; for (int i = grid.length; i> 0; --i) { @@ -113,35 +113,34 @@ public class Map { /** * ajoute les coordonnées et les objets de façon non aléatoire - * @param object + * @param Grid * @param x * @param y */ - public void addObjects(Object object, int x, int y) { + public void addObjects(Grid Grid, int x, int y) { this.coordinateItems.add(new int[]{x, y}); - this.ObjectItems.add(object); + this.GridItems.add(Grid); } /** * cette fonction ajoute dans {@link #grid} les - * objects contenu dans {@link #coordinateItems} - * et {@link #ObjectItems}. - * @param objects prend le type d'objets que vous voulez + * Grids contenu dans {@link #coordinateItems} + * et {@link #GridItems}. + * @param Grids prend le type d'objets que vous voulez * mettre dedans. * @param number prend le nombre d'objets global que * vous voulez mettre dedans. */ - public void addObjectsRandomize(Object[] objects, int number) { - int lengthObjects = objects.length-1; + public void addObjectsRandomize(Item[] item, int number) { + int lengthGrids = item.length-1; Random random = new Random(); - for(int i = 0; i */ - public boolean applyEffects(Effects effect) { + public boolean applyEffects(Effect effect) { switch (effect) { case DECREASESIZE: if (this.coordinate.size() > 1) {this.coordinate.removeLast();} break; @@ -155,7 +156,7 @@ public class Personnage { * @param mouvement est le mouvement du personnage, comme HAUT, BAS, * GAUCHE et DROITE. */ - public void moveSnake(Mouvements mouvement) { + public void moveSnake(Mouvement mouvement) { int[] latestCoordinate = getLatestCoordinate(); for (int i = this.coordinate.size() - 1; i > 0; i--) { @@ -173,4 +174,6 @@ public class Personnage { private void increaseSnake(int[] coordinate) { if(round > 0 && n > 0) if (round%n == 0) this.coordinate.add(coordinate); } + + public abstract boolean round(Map map); } diff --git a/src/Personnages/Player.java b/src/Personnages/Player.java index b16040a..5eba4b2 100644 --- a/src/Personnages/Player.java +++ b/src/Personnages/Player.java @@ -1,6 +1,9 @@ package personnages; -import object.*; +import java.util.Scanner; + +import environnements.Map; +import types.*; /** * la classe Player a comme classe parent {@link Personnage} @@ -25,7 +28,7 @@ public class Player extends Personnage { } public boolean moveCoordinate(int keys) { - Mouvements value = getMouvement(keys); + Mouvement value = getMouvement(keys); if (value != null) { moveSnake(value); @@ -34,14 +37,58 @@ public class Player extends Personnage { return false; } - public Mouvements getMouvement(Integer keys) { + public Mouvement getMouvement(Integer keys) { switch (keys) { - case 0x77: case 0x7A: return Mouvements.HAUT; // w ou z - case 0x73: return Mouvements.BAS; // s - case 0x61: case 0x71: return Mouvements.GAUCHE; // a ou q - case 0x64: return Mouvements.DROITE; // d + case 0x77: case 0x7A: return Mouvement.HAUT; // w ou z + case 0x73: return Mouvement.BAS; // s + case 0x61: case 0x71: return Mouvement.GAUCHE; // a ou q + case 0x64: return Mouvement.DROITE; // d case null: return null; default: return null; } } -} + + /** + * transforme le String en prennant le premier char et + * le mets en ascii dans la classe Integer. + * @param input + * @return + */ + private Integer changeCoordinate(String input) { + if (input.length() > 0) { + return (int)input.charAt(0); + } + return null; + } + + /** + * Cette fonction est uniquement destiné pour la classe + * Players pour recuperer l'input dans le terminal. + * @param player + * @return il retourne int qui est le char en ascii + */ + @SuppressWarnings("resource") + private int getInput() { + Scanner scanner = new Scanner(System.in); + Integer input = null; + + while(this.getMouvement(input) == null) { + input = this.changeCoordinate(scanner.nextLine()); + } + + // scanner.close(); + return input.intValue(); + } + + @Override + public boolean round(Map map) { + this.moveCoordinate(this.getInput()); + + int[] coordinate = this.getHeadCoordinate(); + if(map.isGameOver(coordinate) || this.applyEffects(map.getEffect(coordinate))) return true; + map.deleteItems(coordinate); + + this.increaseRound(); + return false; + } +} diff --git a/src/Personnages/Robot.java b/src/Personnages/Robot.java deleted file mode 100644 index ca1d9b5..0000000 --- a/src/Personnages/Robot.java +++ /dev/null @@ -1,7 +0,0 @@ -package personnages; - -public class Robot extends Personnage { - public Robot(int[] coordinate) { - super(coordinate); - } -} diff --git a/src/display/Display.java b/src/display/Display.java index 816185c..f0c08c1 100644 --- a/src/display/Display.java +++ b/src/display/Display.java @@ -1,9 +1,8 @@ package display; -import java.util.ArrayList; - -import object.*; -import personnages.*; +import environnements.Grid; +import personnages.Personnage; +import types.Item; public class Display { /** @@ -18,133 +17,51 @@ public class Display { * cette fonction dessine la grille avec des noms * pour chaque items. */ - public static void printMap(Object[][] map) { - for (Object[] object : map) { - for (Object value : object) { - System.out.print(value.toString() + " "); + public static void printMapName(Grid[][] map) { + for(Grid[] mapLine : map) { + for(Grid mapValue : mapLine) { + System.out.print(" " + mapValue.getName()); } System.out.println(); } } - /** - * cette fonction print le snake dans le terminal avec des - * caracteres speciaux, (du utf-8). - * @param map - * @param personnages - */ - public static void printMap(Object[][] map, Personnage[] personnages) { + public static void printMap(Grid[][] map) { for (int i = 0; i 0) ? map[y - 1][x] == Item.WALL : false, + (y < map.length - 1) ? map[y+1][x] == Item.WALL : false, + (x > 0) ? map[y][x - 1] == Item.WALL : false, + (x < map[y].length - 1) ? map[y][x + 1] == Item.WALL : false, + }; + + for(Wall value : Wall.values()) { + if(value.isEqual(position)) map[y][x].updateStringCode(value.getAscii()); + } + } + + public static void printInformation(int round, Personnage personnage) { int[] coordinate = personnage.getHeadCoordinate(); System.out.println( - "Round : " + round + " | N : " + Personnage.n + - "\n Joueur " + (playerIndex+1) + " : " + personnage.getName() + " (" + - coordinate[0]+", "+ coordinate[1] +") | size : " + personnage.getSize() + "Round : " + round + " | N : " + Personnage.n +"\n Joueur : " + personnage.getName() + + " (" + coordinate[0]+", "+ coordinate[1] +") | size : " + personnage.getSize() ); } - - private static void printSnake(Snake item, Personnage[] personnages, int x, int y) { - switch (item) { - case BODY: System.out.print(" \u25A1 "); break; - case HEAD: printHead(personnages, x, y); break; - } - } - - private static void printItems(Items item, Object[][] map, int x, int y) { - switch (item) { - case FRAISE: System.out.print(" \uF353 "); break; - - case WALL: printWall(map, x, y); break; - case VOID: System.out.print(" "); break; - } - } - - - private static void printWall(Object[][] map, int x, int y) { - // TOP BOT LEFT RIGHT - boolean[] position = new boolean[] { - (y > 0) ? map[y - 1][x] == Items.WALL : false, - (y < map.length - 1) ? map[y+1][x] == Items.WALL : false, - (x > 0) ? map[y][x - 1] == Items.WALL : false, - (x < map[y].length - 1) ? map[y][x + 1] == Items.WALL : false, - }; - - System.out.print(whichWall(position)); - } - - private static String whichWall(boolean[] isWall) { - String positionWall = new String(); - - if (isWall[0] && isWall[1] && isWall[2] && isWall[3]) positionWall = "\u2550\u256C\u2550"; - - else if (isWall[0] && isWall[1] && isWall[3]) positionWall = "\u2560"; - else if (isWall[0] && isWall[1] && isWall[2]) positionWall = "\u2563"; - else if (isWall[0] && isWall[2] && isWall[3]) positionWall = "\u2550\u2569\u2550"; - else if (isWall[1] && isWall[2] && isWall[3]) positionWall = "\u2550\u2566\u2550"; - - else if (isWall[0] && isWall[1]) positionWall = "\u2551"; - else if (isWall[2] && isWall[3]) positionWall = "\u2550\u2550\u2550"; - else if (isWall[0] && isWall[2]) positionWall = "\u255D "; - else if (isWall[0] && isWall[3]) positionWall = "\u255A"; - else if (isWall[1] && isWall[2]) positionWall = "\u2557 "; - else if (isWall[1] && isWall[3]) positionWall = "\u2554"; - - else positionWall = "\u2550\u256C\u2550"; - - return positionWall; - } - - private static void printHead(Personnage[] personnages, int x, int y) { - Personnage personnage = searchSnake(personnages, x, y); - - if (personnage != null) { - ArrayList personnageCoordinate = personnage.getCoordinate(); - - int[] primaryCoordinate = personnage.getHeadCoordinate(); - - if (personnageCoordinate.size() > 1) { - int[] secondCoordinate = personnageCoordinate.get(1); - - // UP DOWN LEFT RIGHT - boolean[] isHead = new boolean[] { - primaryCoordinate[0] == secondCoordinate[0] && primaryCoordinate[1] > secondCoordinate[1], // UP - primaryCoordinate[0] == secondCoordinate[0] && primaryCoordinate[1] < secondCoordinate[1], // DOWN - primaryCoordinate[1] == secondCoordinate[1] && primaryCoordinate[0] > secondCoordinate[0], // LEFT - primaryCoordinate[1] == secondCoordinate[1] && primaryCoordinate[0] < secondCoordinate[0] // RIGHT - }; - - if (isHead[0]) {System.out.print(" \u21E9 ");return;} - else if (isHead[1]) {System.out.print(" \u21E7 ");return;} - else if (isHead[2]) {System.out.print(" \u21E8");return;} - else if (isHead[3]) {System.out.print("\u21E6 ");return;} - } - } - System.out.print(" \u25CF "); - } - - private static Personnage searchSnake(Personnage[] personnages, int x, int y) { - for (Personnage personnage : personnages) { - int[] primaryCoordinate = personnage.getHeadCoordinate(); - - int primaryY = primaryCoordinate[1] + 1; - int primaryX = primaryCoordinate[0] + 1; - - if (primaryX == x && primaryY == y) { - return personnage; - } - } - return null; - } } diff --git a/src/display/Wall.java b/src/display/Wall.java new file mode 100644 index 0000000..bf80e27 --- /dev/null +++ b/src/display/Wall.java @@ -0,0 +1,43 @@ +package display; + +import java.util.Arrays; + +public enum Wall { + ALL("\u2550\u256C\u2550", new boolean[] {true, true, true, true}), + AUCUN("\u2550\u256C\u2550", new boolean[] {false, false, false, false}), + + HAUT_BAS("\u2551", new boolean[] {true, true, false, false}), + GAUCHE_DROITE("\u2550\u2550\u2550", new boolean[] {false, false, true, true}), + + HAUT_GAUCHE("\u255D ", new boolean[]{true, false, true, false}), + HAUT_DROITE("\u255A", new boolean[]{true, false, false, true}), + + BAS_GAUCHE("\u2557 ", new boolean[]{false, true, true, false}), + BAS_DROITE("\u2554", new boolean[] {false, true, false, true}), + + HAUT_BAS_DROITE("\u2560", new boolean[] {true, true, false, true}), + HAUT_BAS_GAUCHE("\u2563", new boolean[] {true, true, true, false}), + + HAUT_GAUCHE_DROITE("\u2550\u2569\u2550", new boolean[] {true, false, true, true}), + BAS_GAUCHE_DROITE("\u2550\u2566\u2550", new boolean[] {false, true, true, true}); + + private final boolean[] POSITION; + private final String ASCII; + + Wall(String ascii, boolean[] position) { + this.POSITION = position; + this.ASCII = ascii; + } + + public String getAscii() { + return this.ASCII; + } + + public boolean isEqual(boolean[] position) { + return Arrays.equals(this.POSITION, position); + } + + public boolean[] getPosition() { + return POSITION; + } +} diff --git a/src/game/Terminal.java b/src/game/Terminal.java index b0c2348..9226b3b 100644 --- a/src/game/Terminal.java +++ b/src/game/Terminal.java @@ -1,143 +1,44 @@ package game; -import display.*; -import personnages.*; -import environnements.*; - -import java.util.Scanner; +import display.Display; +import environnements.Map; +import personnages.Personnage; public class Terminal { - private int round = 0; + Map map; + Personnage[] personnages; - private static Map map; - private static Personnage[] personnages; - - private static Scanner scanner; - - - public Terminal(Map m, Personnage[] personnage) { - scanner = new Scanner(System.in); - personnages = personnage; - map = m; - - run(); - } - - /** - * Cette fonction est uniquement destiné pour la classe - * Players pour recuperer l'input dans le terminal. - * @param player - * @return il retourne int qui est le char en ascii - */ - private static int getInput(Player player) { - String value = new String(); - Integer input = null; - - do { - value = scanner.nextLine(); - input = changeCoordinate(value); - }while(player.getMouvement(input) == null); - - return input.intValue(); - } - - /** - * transforme le String en prennant le premier char et - * le mets en ascii dans la classe Integer. - * @param input - * @return - */ - private static Integer changeCoordinate(String input) { - if (input.length() > 0) { - return (int)input.charAt(0); - } - return null; - } - - /** - * place tout les personnages dans la fonction {@link #map.placePersonnages()} - * @param personnages - */ - private static void placePersonnages(Personnage[] personnages) { + private void placePersonnages() { for(Personnage personnage : personnages) { map.placePersonnages(personnage); } } - /** - * cette fonction est spécialement conçu pour gerer le gameplay du joueur. - * @param player - * @return - */ - private static boolean playerRound(Player player) { - player.moveCoordinate(getInput(player)); - - int[] coordinate = player.getHeadCoordinate(); - if(map.isGameOver(coordinate) || player.applyEffects(map.getEffect(coordinate))) return true; - map.deleteItems(coordinate); - - player.increaseRound(); - return false; + public Terminal(Map map, Personnage[] personnages) { + this.personnages = personnages; + this.map = map; } - /** - * cette fonction est spécialement conçu pour gerer le gameplay du robot. - * @param player - * @return - */ - private static boolean robotRound(Robot robot) { - return false; - } - - /** - * cette fonction cherche si le personnage mis en paramètre - * est un {@link Player} ou un {@link Robot}. - * @param player - * @return - */ - private static boolean instancePersonnage(Personnage personnage) { - if (personnage instanceof Player) { - // tour du Player - return playerRound((Player)personnage); - } - - if (personnage instanceof Robot) { - // tour du robot - return robotRound((Robot)personnage); - } - - return false; - } - - /** - * la fonction principal qui lance tout le jeu en terminal. - */ - private void run() { - boolean isGameOver = false; + public void run() { int i = 0; - while(!isGameOver) { - for (i = 0;i type de variable pour recuperer le nom de l'item: - *
String name = Item.WALL.getName()
- * @return Avoir le nom de l'item - */ - public String getName() { - return this.NAME; - } - - /** - *

type de variable pour recuperer l'effet de l'item: - *

Effects effect = Item.WALL.getEffects()
- * @return Avoir l'effet de l'item - */ - public Effects getEffects() { - return this.EFFECT; - } -} diff --git a/src/object/Snake.java b/src/object/Snake.java deleted file mode 100644 index 1ab029d..0000000 --- a/src/object/Snake.java +++ /dev/null @@ -1,32 +0,0 @@ -package object; - -public enum Snake { - HEAD("TETE", Effects.IMPASSABLE), - BODY("BODY", Effects.IMPASSABLE); - - private final String NAME; - private final Effects EFFECT; - - Snake(String name, Effects effect) { - this.NAME = name; - this.EFFECT = effect; - } - - /** - *

type de variable pour recuperer le nom du corps du snake: - *

String name = Snake.HEAD.getName()
- * @return Avoir le nom de l'item - */ - public String getName() { - return this.NAME; - } - - /** - *

type de variable pour recuperer l'effet du corps du snake: - *

Effects effect = Snake.HEAD.getEffects()
- * @return Avoir l'effet de l'item - */ - public Effects getEffects() { - return this.EFFECT; - } -} diff --git a/src/tests/MapTest.java b/src/tests/MapTest.java index e613d51..4d03617 100644 --- a/src/tests/MapTest.java +++ b/src/tests/MapTest.java @@ -2,14 +2,13 @@ package tests; import display.Display; import environnements.Map; -import object.Items; -import personnages.Personnage; import personnages.Player; +import types.Item; public class MapTest { public static void creationMap() { Map map = new Map(30, 30); - map.addObjects(Items.FRAISE, 29, 29); + map.addObjects(Item.FRAISE, 29, 29); map.placeObjects(); Display.printMap(map.addEdges()); @@ -17,20 +16,20 @@ public class MapTest { public static void drawMap() { Map map = new Map(30, 30); - Display.printMap(map.addEdges(), null); + Display.printMap(map.addEdges()); } public static void placePersonnageMap() { Map map = new Map(30, 30); map.placePersonnages(new Player(new int[]{1, 1}, "null")); - Display.printMap(map.addEdges(), new Personnage[] {new Player(new int[]{1, 1}, "null")}); + Display.printMap(map.addEdges()); } public static void effects() { Map map = new Map(5, 1); Player player = new Player(new int[] {0, 0}, "null"); - map.addObjects(Items.FRAISE, 0, 0); + map.addObjects(Item.FRAISE, 0, 0); player.applyEffects(map.getEffect(player.getHeadCoordinate())); System.out.println(player.getSize()); diff --git a/src/tests/PersonnageTest.java b/src/tests/PersonnageTest.java index 9dcaa64..0037ba1 100644 --- a/src/tests/PersonnageTest.java +++ b/src/tests/PersonnageTest.java @@ -1,15 +1,15 @@ package tests; -import object.Effects; -import object.Mouvements; import personnages.Personnage; import personnages.Player; +import types.Effect; +import types.Mouvement; public class PersonnageTest { public static void avancerPersonnage() { Player player = new Player(new int[]{1, 1}, "test"); - player.moveSnake(Mouvements.HAUT); // si la position s'est avancé, c'est normal + player.moveSnake(Mouvement.HAUT); // si la position s'est avancé, c'est normal int[] coordinate = player.getHeadCoordinate(); System.out.println(coordinate[0] + " " + coordinate[1]); @@ -20,18 +20,18 @@ public class PersonnageTest { Player player = new Player(new int[]{1, 1}, "test"); player.increaseRound(); - player.moveSnake(Mouvements.HAUT); // si il y a 2 valeurs, c'est normal + player.moveSnake(Mouvement.HAUT); // si il y a 2 valeurs, c'est normal for (int[] coordinate : player.getCoordinate()) { System.out.println(coordinate[0] + " " + coordinate[1]); } } - public static void effectsPersonnage() { + public static void effectPersonnage() { Personnage.n = 2; Player player = new Player(new int[]{1, 1}, "test"); - player.applyEffects(Effects.DECREASESIZE); // si c'est vide c'est que ça marche + player.applyEffects(Effect.DECREASESIZE); // si c'est vide c'est que ça marche System.out.println(player.getCoordinate()); } diff --git a/src/object/Effects.java b/src/types/Effect.java similarity index 56% rename from src/object/Effects.java rename to src/types/Effect.java index 78067e8..f384e06 100644 --- a/src/object/Effects.java +++ b/src/types/Effect.java @@ -1,23 +1,23 @@ -package object; +package types; /** * cette enumérateur {@link Effects} contient tout les effets * necessaire pour le bon déroulement du jeu et quelque effets * amusant qui pousse un peu plus les mecaniques du jeu. */ -public enum Effects { +public enum Effect { /** - * reduis le corps de 1. + * Effet : Réduit la taille du serpent de 1 segment. */ DECREASESIZE, /** - * tue le joueur si contact. + * Effet : Intransposable, entraînant la mort du joueur lors du contact. */ IMPASSABLE, /** - * le vide. + * Effet : Vide, aucun effet. */ - VOID; -} + VOID; +} \ No newline at end of file diff --git a/src/types/Item.java b/src/types/Item.java new file mode 100644 index 0000000..47d3bc3 --- /dev/null +++ b/src/types/Item.java @@ -0,0 +1,67 @@ +package types; + +import environnements.Grid; + +/** + * cette enum représente différents types d'objets dans le jeu. + */ +public enum Item implements Grid { + /** + * Mur impassable. + * Effet associé :
{@code types.Effect.IMPASSABLE}
+ * utf : null car c'est un autre programme qui gère le mur. + */ + WALL(Effect.IMPASSABLE, null), + + /** + * Zone vide sans effet. + * Effet associé :
{@code types.Effect.VOID}
+ * utf : vide + */ + VOID(Effect.VOID, " "), + + /** + * Fraise. + * Effet associé :
{@code types.Effect.DECREASESIZE}
+ * utf : un drapeau (0x26FF) + */ + FRAISE(Effect.DECREASESIZE, " \u26FF "); + + private final Effect EFFECT; + private String utfCode; + + /** + * @param effect L'effet associé à l'objet. + */ + Item(Effect effect, String utf) { + this.EFFECT = effect; + this.utfCode = utf; + } + + /** + * cette methode donne l'effet associé à l'objet. + * + * @return L'effet associé à l'objet. + */ + + @Override + public Effect get() { + return this.EFFECT; + } + + @Override + public Item[] getValues() { + return values(); + } + + @Override + public String getStringCode() { + return this.utfCode; + } + + @Override + public void updateStringCode(String textCode) { + this.utfCode = textCode; + } + +} \ No newline at end of file diff --git a/src/object/Mouvements.java b/src/types/Mouvement.java similarity index 86% rename from src/object/Mouvements.java rename to src/types/Mouvement.java index d14eca7..2583f1e 100644 --- a/src/object/Mouvements.java +++ b/src/types/Mouvement.java @@ -1,14 +1,11 @@ -package object; - -import java.io.Serializable; +package types; /** * Cet enumerateur prend en charge tout les mouvements possible * pour le serpent, il a uniquement la possibilité de se déplacer - * grâce a {@link Mouvements} pour la classe Player et Robot. + * grâce a {@link Mouvement} pour la classe Player et Robot. */ -@SuppressWarnings("unused") -public enum Mouvements implements Serializable { +public enum Mouvement { /** * HAUT prend comme coordonnée (0, -1) pour se déplacer. * @param x = 0 @@ -40,7 +37,7 @@ public enum Mouvements implements Serializable { private final int deltaX; private final int deltaY; - Mouvements(int deltaX, int deltaY) { + Mouvement(int deltaX, int deltaY) { this.deltaX = deltaX; this.deltaY = deltaY; } diff --git a/src/types/SnakePart.java b/src/types/SnakePart.java new file mode 100644 index 0000000..46069a3 --- /dev/null +++ b/src/types/SnakePart.java @@ -0,0 +1,36 @@ +package types; + +import environnements.Grid; + +public enum SnakePart implements Grid { + HEAD(Effect.IMPASSABLE, " \u25CF "), + BODY(Effect.IMPASSABLE, " \u25A1 "); + + private final Effect EFFECT; + private String utfCode; + + SnakePart(Effect effect, String utf) { + this.EFFECT = effect; + this.utfCode = utf; + } + + @Override + public Effect get() { + return this.EFFECT; + } + + @Override + public SnakePart[] getValues() { + return values(); + } + + @Override + public String getStringCode() { + return this.utfCode; + } + + @Override + public void updateStringCode(String textCode) { + this.utfCode = textCode; + } +}