ajustement sur les fichiers de configurations

This commit is contained in:
2024-08-14 21:19:32 +02:00
parent 9ef8ef2bc4
commit cb2173d717
9 changed files with 160 additions and 109 deletions

View File

@@ -2,7 +2,7 @@ import java.io.File;
import java.io.ObjectInputFilter.Config;
import java.util.ArrayList;
import configuration.ConfigXml;
import configuration.ConfigGame;
import game.Terminal;
import game.environnement.*;
import personnage.*;
@@ -36,11 +36,11 @@ public class Main {
*/
public static void main(String[] args) {
ConfigXml configXml = new ConfigXml(null);
Personnage[] personnages = configXml.getCharacters();
Map map = configXml.getMap();
ConfigGame config = new ConfigGame(null);
Personnage.n = 4;
Personnage[] personnages = config.getPersonnages();
Map map = config.getMap();
Personnage.n = config.getN();
if (args.length < 1) { new Terminal(map, personnages).run(); } // lancer en local
else if (args.length == 2) { new Terminal(map, personnages).run(args[0], args[1]); } // lancer en ligne

View File

@@ -2,7 +2,7 @@
<!-- Configuration globale -->
<Configuration>
<Size n="4"/>
<Size n="2"/>
<!-- Configuration de la map -->
<Map>
<Coordinate x="22" y="22"/>
@@ -15,8 +15,8 @@
<!-- Configuration des personnages -->
<Personnage>
<Player name="Philippe_Etchebest" x="2" y="2"/>
<Player name="Luke Skywalker" x="19" y="19"/>
<!-- <Player name="Luke Skywalker" x="19" y="19"/> -->
<!-- <IA name="" x="19" y="19" QTable=""/> -->
<!-- <Robot name="R2D2" x="19" y="19"/> -->
<Robot name="R2D2" x="19" y="19"/>
</Personnage>
</Configuration>

View File

@@ -0,0 +1,143 @@
package configuration;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import game.environnement.Map;
import personnage.IA;
import personnage.Personnage;
import personnage.Player;
import personnage.Robot;
import personnage.IAQLearning.QTable;
import personnage.types.Item;
public class ConfigGame {
private HashMap<String, ArrayList<HashMap<String, String>>> data;
public ConfigGame(String path) {
try {
FileReaderXml fileReaderXml = new FileReaderXml(path);
this.data = fileReaderXml.getElements();
} catch (IOException | SAXException | ParserConfigurationException e) {
e.printStackTrace();
}
}
public Map getMap() {
ArrayList<HashMap<String,String>> mapList = data.get("Map.Coordinate");
if (data.get("Configuration.Map") == null) {
System.err.println("Erreur: La balise Map est introuvable.");
System.exit(-1);
}
if (mapList.size() != 1) {
System.err.println("Erreur: Plusieurs Coordonnées trouvées.");
System.exit(-1);
}
Map map = new Map(
Integer.parseInt(mapList.get(0).get("x")),
Integer.parseInt(mapList.get(0).get("y"))
);
addItems(map);
return map;
}
public int getN() {
ArrayList<HashMap<String, String>> n;
if ((n = data.get("Configuration.Size")) == null) {
return 4;
}
return Integer.parseInt(n.get(0).get("n"));
}
public Personnage[] getPersonnages() {
String[] personnagesList = new String[] {"Player", "Robot", "IA"};
Personnage[] personnages = new Personnage[2];
int index = 0;
if (data.get("Configuration.Personnage") == null) {
System.err.println("Erreur: La balise Personnage est introuvable.");
System.exit(-1);
}
for (String personnage : personnagesList) {
ArrayList<HashMap<String, String>> informations = data.get("Personnage."+personnage);
if (informations != null) {
for(HashMap<String, String> information : informations) {
if (index > 2) {
System.err.println("Erreur: Il doit y avoir au ]0; 3[ personnages");
System.exit(-1);
}
personnages[index++] = choosePersonnage(personnage, information);
}
}
}
return personnages;
}
private Personnage choosePersonnage(String name, HashMap<String, String> information) throws Error {
int[] coordinate = new int[] {
Integer.parseInt(information.get("x")),
Integer.parseInt(information.get("y")),
};
switch (name.toLowerCase()) {
case "player": return new Player(coordinate, information.get("name"));
case "robot": return new Robot(information.get("name"), coordinate);
case "ia": {
String path = information.get("QTable");
return new IA(coordinate, (path.equals("")) ? new QTable("res/save/") : new QTable(path), name);
}
default: {
System.err.println("Erreur: Il n'existe aucun personnage jouable dans la balise Personnage");
System.exit(-1);
return null;
}
}
}
private void addItems(Map map) {
String[] itemList = new String[]{"Wall", "Fraise"};
for(String item : itemList) {
ArrayList<HashMap<String, String>> informations = data.get("Map."+item);
if(informations != null) {
for(HashMap<String, String> information : informations) {
map.addObjects(
chooseItem(item, information),
Integer.parseInt(information.get("x")),
Integer.parseInt(information.get("y"))
);
}
}
}
}
private Item chooseItem(String name, HashMap<String, String> information) {
switch (name.toLowerCase()) {
case "wall": return Item.WALL;
case "fraise": return Item.FRAISE;
default: {
System.err.println("Erreur: Il n'existe aucun item valide dans la balise Map");
System.exit(-1);
return null;
}
}
}
}

View File

@@ -1,86 +0,0 @@
package configuration;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import game.environnement.Map;
import personnage.IA;
import personnage.Personnage;
import personnage.Player;
import personnage.Robot;
import personnage.IAQLearning.QTable;
public class ConfigXml {
private HashMap<String, ArrayList<HashMap<String, String>>> informationConfig;
public ConfigXml(String path) {
try {
FileReaderXml fileReader = new FileReaderXml(null);
informationConfig = fileReader.getElements();
System.out.println(informationConfig);
} catch (IOException | SAXException | ParserConfigurationException e) {
e.printStackTrace();
}
}
public Personnage[] getCharacters() throws Error {
String[] playableCharacters = new String[] {"Player", "Robot", "IA"};
ArrayList<Personnage> personnages = new ArrayList<>();
if (informationConfig.get("Configuration.Personnage") == null) {
throw new Error("Pas de personnage !");
}
for (String character : playableCharacters) {
ArrayList<HashMap<String, String>> hashMapChar = informationConfig.get("Personnage." + character);
if(hashMapChar != null) {
for(int i = 0; i<hashMapChar.size(); i++) {
if (personnages.size() > 2) {
throw new Error("Trop de personnage dans la partie !");
}
int[] coordinate = new int[] {Integer.parseInt(hashMapChar.get(i).get("x")), Integer.parseInt(hashMapChar.get(i).get("y"))};
if (character.toLowerCase().equals("player")) personnages.add(new Player(coordinate, hashMapChar.get(i).get("name")));
if (character.toLowerCase().equals("robot")) personnages.add(new Robot(hashMapChar.get(i).get("name"), coordinate));
if (character.toLowerCase().equals("ia")){
QTable qTable;
String path;
if((path = hashMapChar.get(i).get("QTable")).equals("")) {
qTable = new QTable("res/save/");
} else {
qTable = new QTable(path);
}
personnages.add(new IA(coordinate, qTable, hashMapChar.get(i).get("name")));
}
}
}
}
return new Personnage[] {personnages.get(0), personnages.get(1)};
}
public Map getMap() throws Error {
if (informationConfig.get("Configuration.Map") == null) {
throw new Error("Pas de Map !");
}
ArrayList<HashMap<String,String>> map = informationConfig.get("Map.Coordinate");
if (map.size() != 1) {
throw new Error("problème de coordonnée");
}
return new Map(Integer.parseInt(map.get(0).get("x")), Integer.parseInt(map.get(0).get("y")));
}
}

View File

@@ -1,7 +1,6 @@
package configuration;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
@@ -13,10 +12,7 @@ import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
public class FileReaderXml {
private String pathname = "src" + File.separator + "conf.xml";

View File

@@ -29,7 +29,7 @@ public class IA extends Personnage {
this.qLearning = new QLearning(qTable, alpha, gamma, epsilon);
// Attribution d'un nom unique à l'IA.
this.name = (name == null) ? "IA : " + UUID.randomUUID() : name;
super.name = (name == null) ? "IA : " + UUID.randomUUID() : name;
}
/**

View File

@@ -24,8 +24,7 @@ public class Player extends Personnage {
*/
public Player(int[] coordinate, String name) {
super(coordinate);
this.name = name;
super.name = name;
}
public boolean moveCoordinate(int keys) {

View File

@@ -8,14 +8,12 @@ import game.environnement.*;
import personnage.types.*;
public class Robot extends Personnage {
Map m;
Mouvement move;
String name;
public Robot(String name, int[] coordinate) {
super(coordinate);
this.name = name;
super.name = name;
}
/**Fonction commune aux sous-classes de Personnage

View File

@@ -1,11 +1,12 @@
package tests;
import configuration.ConfigXml;
import configuration.FileReaderXml;
import configuration.ConfigGame;
public class XmlReaderTest {
public static void main(String[] args) {
ConfigXml configXml = new ConfigXml(null);
System.out.println(configXml.getCharacters());
ConfigGame configXml = new ConfigGame(null);
System.out.println(configXml.getPersonnages());
System.out.println(configXml.getN());
System.out.println(configXml.getMap());
}
}