From 94a3fbb26c6ae0f69a754be49fa7db49673ba779 Mon Sep 17 00:00:00 2001 From: guezoloic Date: Fri, 24 May 2024 10:27:58 +0200 Subject: [PATCH] correction de probleme et ajout d'un quick multi --- Makefile | 6 ++++- README.md | 53 ++++++++++++++++++++++++++++++++++++++ run.bat | 2 +- src/Main.java | 29 ++++++++++++++------- src/connexion/Channel.java | 6 ----- 5 files changed, 79 insertions(+), 17 deletions(-) diff --git a/Makefile b/Makefile index 5f1ab88..70717fc 100644 --- a/Makefile +++ b/Makefile @@ -13,6 +13,10 @@ LIB_DIR = lib JAR = $(LIB_DIR)/* +#Arguments pour java +channel = $(arg1) +adversaire = $(arg2) + # main all: clean $(MAIN_FILE) run @@ -23,7 +27,7 @@ $(BIN_DIR)/$(MAIN_FILE).class : $(SRC_DIR)/$(MAIN_FILE).java $(JAVAC) -d $(BIN_DIR) -sourcepath $(SRC_DIR) -classpath $(JAR) $< run: - java -cp $(BIN_DIR) $(MAIN_FILE) + java -cp $(BIN_DIR) $(MAIN_FILE) $(channel) $(adversaire) clean: @rm -rf $(BIN_DIR) \ No newline at end of file diff --git a/README.md b/README.md index e7b8db8..0f69f96 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,59 @@ C'est un projet de fin de Licence L1 en Informatique à UPEC, la création d'un - La partie **PROBLÈME ET SOLUTION RENCONTRÉES** +### AVANT TOUT : Comment lancer le jeu. + +Pour lancer le jeu, nous pouvons utiliser les addons de vscode en appuyant sur ***run*** sur la methode **main**. + +Sinon vous pouvez utiliser le Makefile, il va stocker tout les fichiers `.class` dans un fichier **bin**. Nous pouvons le re-utiliser plus tard grâce à une autre commande sur le Makefile. + +Les commandes pour le makefile : + +- `Make` : il va lancer la compilation et va lancer l'interpréteur java (il va aussi nettoyer le fichier bin avant). + +- `Make clean` : il va supprimer le fichier bin. + +- `Make run` : il va uniquement lancer l'interpréteur java (Attention à ne pas supprimer le bin avant) + +Pour lancer le jeu en multijoueur avec Makefile (mot1 et mot2 sont des mots à changer en fonction du canal): +- `Make channel=mot1 adversaire=mot2` : compile tout le programme et le lance en multijoueur. +- `Make run channel=mot1 adversaire=mot2` : lance uniquement le programme en multijoueur. + +Sur windows, vous avez une autre option que personnellement je vous encourage, c'est l'utilisation du `run.bat`. Ce programme va lancer + +# IA (Q-Learning) + +## - Explications + +Le Q-Learning ou l'apprentissage par renforcement est un type d'apprentissage où le personnage ou autre apprend par une base de donnée de tout ce qu'il a réussi dans le passé. Il apprend en sauvegardant dans sa base de donnée toute les actions qu'il a pu faire au long de son apprentissage. + +Il y a 2 types de temps dans son apprentissage : + +- La phase d'exploration +- La phase d'apprentissage + +### La phase d'exploration + +La phase d'exploration se passe le plus possible au début de son apprentissage, il va tester tout les actions aléatoire qu'il a en dispositions. Il va souvent se planter et il va sauvegarder toute sa progression. + +### La phase d'apprentissage + +La phase d'apprentissage est souvent beaucoup plus long dans son apprentissage, il va tester des mécaniques qu'il a apprises et essayer un max possible de faire des actions qui sont dans sa base de donnée. + +## - Calcul et Compréhension + +$$Q(s_t, a_t) = Q(s_t, a_t) + \alpha * (R_t + \gamma * \max(Q(s_{t+1}, a)) - Q(s_t, a_t))$$ + +Ce calcul sera la valeur de toutes les actions que l'IA va enregistrer dans sa base de donnée, il y aura toutes les informations comme la position du snake ou la grille du jeu puis ce calcul pour définir la "fiabilité" du coup. + +- $Q(s_t, a_t)$ : est la valeur de Q actuelle, il contient $s_t$ qui l'état et $a_t$ qui est l'action de Q. + +- $\alpha$ : est le taux d'apprentissage, c'est lui qui détermine si on doit écraser les valeurs ou non. +- $R_t$ : est la récompense de l'action, si c'est une bonne action ou non. +- $\gamma$ : est l'importance des futures récompenses. +- $\max(Q(s_{t+1}, a))$ : est la valeur maximale de Q du prochain tour parmi toute sa base de donnée. + + # CRÉDITS Ce projet à été réalisé par FARIA Théo et GUEZO Loïc. diff --git a/run.bat b/run.bat index e4a8c64..f2eec0f 100644 --- a/run.bat +++ b/run.bat @@ -5,7 +5,7 @@ set "error_file=error.txt" REM ceci est pour mettre un batch en utf-8 car sinon, nous aurons des problèmes avec les caractères. chcp 65001 -make 2> %error_file% +make channel=%1 adversaire=%2 2> %error_file% for %%A in ("%error_file%") do set "errror_size=%%~zA" diff --git a/src/Main.java b/src/Main.java index 6910aee..cfe9d28 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,5 +1,3 @@ -import connexion.Channel; -import connexion.Reseau; import environnements.*; import game.Terminal; import personnages.*; @@ -11,14 +9,27 @@ public class Main { Map map = new Map(20, 20); - Personnage[] personnages = new Personnage[] { - new Player(new int[] {0, 0}, "Philippe Etchebest"), - }; + // lancer en local + if (args.length < 2) { + Grid[][] grid = map.getGrid(); - - // map.addObjects(Item.FRAISE, 0, 0); - // map.addObjectsRandomize(new Item[] {Item.FRAISE}, 1); + Personnage[] personnages = new Personnage[] { + new Player(new int[] {0, 0}, "Philippe Etchebest"), + new Player(new int[] {grid[0].length - 1, grid.length - 1}, "Luke Skywalker") + }; - new Terminal(map, personnages).run("channel129", "channel128"); + map.addObjects(Item.FRAISE, 3, 5); + map.addObjectsRandomize(new Item[] {Item.FRAISE, Item.WALL}, 3); + + new Terminal(map, personnages).run(); + } + // lancer en ligne + else { + Personnage[] personnages = new Personnage[] { + new Player(new int[] {0, 0}, "Philippe Etchebest"), + }; + + new Terminal(map, personnages).run(args[0], args[1]); + } } } diff --git a/src/connexion/Channel.java b/src/connexion/Channel.java index b4a639f..7511444 100644 --- a/src/connexion/Channel.java +++ b/src/connexion/Channel.java @@ -1,9 +1,6 @@ package connexion; -import java.util.Arrays; - import environnements.*; -import types.Item; import types.Mouvement; import personnages.Personnage; @@ -12,12 +9,9 @@ public class Channel extends Personnage { private static Reseau adversaire; private String channel; - private Map map; - public Channel(Map map, String channel, String autreChannel) { super(new int [] {map.getGrid()[0].length - 1, map.getGrid().length - 1}); - this.map = map; this.name = autreChannel; this.channel = channel;