mirror of
https://github.com/Cpt-Adok/SNAKE.git
synced 2026-01-25 12:34:07 +00:00
correction de probleme et ajout d'un quick multi
This commit is contained in:
6
Makefile
6
Makefile
@@ -13,6 +13,10 @@ LIB_DIR = lib
|
|||||||
|
|
||||||
JAR = $(LIB_DIR)/*
|
JAR = $(LIB_DIR)/*
|
||||||
|
|
||||||
|
#Arguments pour java
|
||||||
|
channel = $(arg1)
|
||||||
|
adversaire = $(arg2)
|
||||||
|
|
||||||
# main
|
# main
|
||||||
all: clean $(MAIN_FILE) run
|
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) $<
|
$(JAVAC) -d $(BIN_DIR) -sourcepath $(SRC_DIR) -classpath $(JAR) $<
|
||||||
|
|
||||||
run:
|
run:
|
||||||
java -cp $(BIN_DIR) $(MAIN_FILE)
|
java -cp $(BIN_DIR) $(MAIN_FILE) $(channel) $(adversaire)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@rm -rf $(BIN_DIR)
|
@rm -rf $(BIN_DIR)
|
||||||
53
README.md
53
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**
|
- 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
|
# CRÉDITS
|
||||||
|
|
||||||
Ce projet à été réalisé par FARIA Théo et GUEZO Loïc.
|
Ce projet à été réalisé par FARIA Théo et GUEZO Loïc.
|
||||||
|
|||||||
2
run.bat
2
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.
|
REM ceci est pour mettre un batch en utf-8 car sinon, nous aurons des problèmes avec les caractères.
|
||||||
chcp 65001
|
chcp 65001
|
||||||
|
|
||||||
make 2> %error_file%
|
make channel=%1 adversaire=%2 2> %error_file%
|
||||||
|
|
||||||
for %%A in ("%error_file%") do set "errror_size=%%~zA"
|
for %%A in ("%error_file%") do set "errror_size=%%~zA"
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import connexion.Channel;
|
|
||||||
import connexion.Reseau;
|
|
||||||
import environnements.*;
|
import environnements.*;
|
||||||
import game.Terminal;
|
import game.Terminal;
|
||||||
import personnages.*;
|
import personnages.*;
|
||||||
@@ -11,14 +9,27 @@ public class Main {
|
|||||||
|
|
||||||
Map map = new Map(20, 20);
|
Map map = new Map(20, 20);
|
||||||
|
|
||||||
Personnage[] personnages = new Personnage[] {
|
// lancer en local
|
||||||
new Player(new int[] {0, 0}, "Philippe Etchebest"),
|
if (args.length < 2) {
|
||||||
};
|
Grid[][] grid = map.getGrid();
|
||||||
|
|
||||||
|
Personnage[] personnages = new Personnage[] {
|
||||||
// map.addObjects(Item.FRAISE, 0, 0);
|
new Player(new int[] {0, 0}, "Philippe Etchebest"),
|
||||||
// map.addObjectsRandomize(new Item[] {Item.FRAISE}, 1);
|
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]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,6 @@
|
|||||||
package connexion;
|
package connexion;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
import environnements.*;
|
import environnements.*;
|
||||||
import types.Item;
|
|
||||||
import types.Mouvement;
|
import types.Mouvement;
|
||||||
import personnages.Personnage;
|
import personnages.Personnage;
|
||||||
|
|
||||||
@@ -12,12 +9,9 @@ public class Channel extends Personnage {
|
|||||||
private static Reseau adversaire;
|
private static Reseau adversaire;
|
||||||
private String channel;
|
private String channel;
|
||||||
|
|
||||||
private Map map;
|
|
||||||
|
|
||||||
public Channel(Map map, String channel, String autreChannel) {
|
public Channel(Map map, String channel, String autreChannel) {
|
||||||
super(new int [] {map.getGrid()[0].length - 1, map.getGrid().length - 1});
|
super(new int [] {map.getGrid()[0].length - 1, map.getGrid().length - 1});
|
||||||
|
|
||||||
this.map = map;
|
|
||||||
this.name = autreChannel;
|
this.name = autreChannel;
|
||||||
|
|
||||||
this.channel = channel;
|
this.channel = channel;
|
||||||
|
|||||||
Reference in New Issue
Block a user