public Jedi(String groupe) { super("Jedi_" + num++, groupe); this.caracts.put(Caracteristique.DON, 50); this.caracts.put(Caracteristique.VIE, Calculs.valeurCaracAleatoire(Caracteristique.VIE)); this.caracts.put( Caracteristique.INITIATIVE, Calculs.valeurCaracAleatoire(Caracteristique.INITIATIVE)); this.caracts.put(Caracteristique.FORCE, Calculs.valeurCaracAleatoire(Caracteristique.FORCE)); }
@Override public boolean ramassePotion(int refRMI, int refPotion) throws RemoteException { boolean res = false; VuePersonnage vuePersonnage = personnages.get(refRMI); VuePotion vuePotion = potions.get(refPotion); if (vuePersonnage.isActionExecutee()) { // si une action a deja ete executee logActionDejaExecutee(refRMI); } else { // sinon, on tente de jouer l'interaction int distance = Calculs.distanceChebyshev(vuePersonnage.getPosition(), vuePotion.getPosition()); // on teste la distance entre le personnage et la potion if (distance <= Constantes.DISTANCE_MIN_INTERACTION) { new Ramassage(this, vuePersonnage, vuePotion).interagit(); personnages.get(refRMI).executeAction(); res = true; } else { logger.warning( Constantes.nomClasse(this), nomRaccourciClient(refRMI) + " a tente d'interagir avec " + vuePotion.getElement().getNom() + ", alors qu'il est trop eloigne !\nDistance = " + distance); } } return res; }
public void executeStrategie(HashMap<Integer, Point> voisins) throws RemoteException { // arene IArene arene = console.getArene(); // reference RMI de l'element courant int refRMI = 0; // position de l'element courant Point position = null; try { refRMI = console.getRefRMI(); position = arene.getPosition(refRMI); } catch (RemoteException e) { e.printStackTrace(); } if (voisins.isEmpty()) { // je n'ai pas de voisins, j'erre console.setPhrase("J'erre...Seul"); arene.deplace(refRMI, 0); } else { int refCible = Calculs.chercheElementProche(position, voisins); int distPlusProche = Calculs.distanceChebyshev(position, arene.getPosition(refCible)); Element elemPlusProche = arene.elementFromRef(refCible); Point pointC = arene.getPosition(refCible); if (distPlusProche <= Constantes.DISTANCE_MIN_INTERACTION + 1) { // courir ! console.setPhrase("Je m'eloigne de cette potion "); arene.fuir(refRMI, pointC); } else { // si voisins, mais plus eloignes = POTION if (elemPlusProche instanceof Potion) { // pas de crainte a avoir console.setPhrase("J'erre..."); arene.deplace(refRMI, 0); } else { pointC = arene.getPosition(refCible); arene.poserPotion(refRMI, pointC); } } } }
/** * Verifie que les deux elements sont voisins, l'element courant etant un personnage. Pour etre un * voisin : ils doivent etre differents, ils doivent etre a une distance inferieure ou egale a la * vision, il doivent etre actifs. * * @param courant personnage courant * @param voisin element voisin * @return vrai si l'element donne est bien un voisin */ private boolean estVoisin(VuePersonnage courant, VueElement<?> voisin) throws RemoteException { boolean res = courant.getElement().estVivant() && Calculs.distanceChebyshev(voisin.getPosition(), courant.getPosition()) <= Constantes.VISION; if (voisin instanceof VuePersonnage) { // potion res = res && ((VuePersonnage) voisin).getElement().estVivant() && voisin.getRefRMI() != courant.getRefRMI(); } return res; }
public void lancerPotionTeleportation(int port, String ipArene) { String nom = "Téléportation"; // TODO remplacer la ligne suivante par votre numero de groupe String groupe = "G7"; // creation du logger LoggerProjet logger = null; try { logger = new LoggerProjet(true, "potion_" + nom + groupe); } catch (IOException e) { e.printStackTrace(); System.exit(ErreurLancement.suivant); } // lancement de la potion try { IArene arene = (IArene) java.rmi.Naming.lookup(Constantes.nomRMI(ipArene, port, "Arene")); logger.info("Lanceur", "Lancement de la potion sur le serveur..."); // caracteristiques de la potion HashMap<Caracteristique, Integer> caracts = new HashMap<Caracteristique, Integer>(); caracts.put(Caracteristique.VIE, 0); caracts.put(Caracteristique.FORCE, 0); caracts.put(Caracteristique.INITIATIVE, 0); caracts.put(Caracteristique.ESQUIVE, 0); caracts.put(Caracteristique.DEFENSE, 0); caracts.put(Caracteristique.BOUCLIER, 0); // ajout de la potion arene.ajoutePotion(new Potion(nom, groupe, caracts), Calculs.positionAleatoireArene()); logger.info("Lanceur", "Lancement de la potion reussi"); } catch (Exception e) { logger.severe("Lanceur", "Erreur lancement :\n" + e.getCause()); e.printStackTrace(); System.exit(ErreurLancement.suivant); } }
public boolean Vampirise(int refRMI, int refRMIAdv) throws RemoteException { boolean res = false; VuePersonnage client = personnages.get(refRMI); VuePersonnage clientAdv = personnages.get(refRMIAdv); if (personnages.get(refRMI).isActionExecutee()) { // si une action a deja ete executee logActionDejaExecutee(refRMI); } else { // sinon, on tente de jouer l'interaction IConsole console = consoleFromRef(refRMI); IConsole consoleAdv = consoleFromRef(refRMIAdv); int distance = Calculs.distanceChebyshev( personnages.get(refRMI).getPosition(), personnages.get(refRMIAdv).getPosition()); // on teste la distance entre les personnages if (distance <= Constantes.DISTANCE_MIN_INTERACTION) { Personnage pers = (Personnage) elementFromRef(refRMI); Personnage persAdv = (Personnage) elementFromRef(refRMIAdv); // on teste que les deux personnages soient en vie if (pers.estVivant() && persAdv.estVivant()) { console.log( Level.INFO, Constantes.nomClasse(this), "Je decoupe " + nomRaccourciClient(refRMIAdv)); consoleAdv.log( Level.INFO, Constantes.nomClasse(this), "Je me fait massacrer par " + nomRaccourciClient(refRMI)); logger.info( Constantes.nomClasse(this), nomRaccourciClient(refRMI) + " attaque " + nomRaccourciClient(consoleAdv.getRefRMI())); new Vampirise(this, client, clientAdv).interagit(); personnages.get(refRMI).executeAction(); // si l'adversaire est mort if (!persAdv.estVivant()) { setPhrase(refRMI, "Je tue " + nomRaccourciClient(consoleAdv.getRefRMI())); console.log( Level.INFO, Constantes.nomClasse(this), "Je tue " + nomRaccourciClient(refRMI)); logger.info( Constantes.nomClasse(this), nomRaccourciClient(refRMI) + " tue " + nomRaccourciClient(consoleAdv.getRefRMI())); } res = true; } else { logger.warning( Constantes.nomClasse(this), nomRaccourciClient(refRMI) + " a tente d'interagir avec " + nomRaccourciClient(refRMIAdv) + ", alors qu'il est mort..."); console.log( Level.WARNING, Constantes.nomClasse(this), nomRaccourciClient(refRMIAdv) + " est deja mort !"); } } else { logger.warning( Constantes.nomClasse(this), nomRaccourciClient(refRMI) + " a tente d'interagir avec " + nomRaccourciClient(refRMIAdv) + ", alors qu'il est trop eloigne... Distance de chebyshev = " + distance); console.log( Level.WARNING, "AVERTISSEMENT ARENE", nomRaccourciClient(refRMIAdv) + " est trop eloigne !\nDistance = " + distance); } } return res; }
public static void main(String[] args) { String nom = "Assassin"; // TODO remplacer la ligne suivante par votre numero de groupe String groupe = "G10"; // nombre de tours pour ce personnage avant d'etre deconnecte // (30 minutes par defaut) // si negatif, illimite int nbTours = Constantes.NB_TOURS_PERSONNAGE_DEFAUT; // init des arguments int port = Constantes.PORT_DEFAUT; String ipArene = Constantes.IP_DEFAUT; if (args.length > 0) { if (args[0].equals("--help") || args[0].equals("-h")) { ErreurLancement.aide(usage); } if (args.length > 2) { ErreurLancement.TROP_ARGS.erreur(usage); } try { port = Integer.parseInt(args[0]); } catch (NumberFormatException e) { ErreurLancement.PORT_NAN.erreur(usage); } if (args.length > 1) { ipArene = args[1]; } } // creation du logger LoggerProjet logger = null; try { logger = new LoggerProjet(true, "personnage_" + nom + groupe); } catch (IOException e) { e.printStackTrace(); System.exit(ErreurLancement.suivant); } // lancement du serveur try { String ipConsole = InetAddress.getLocalHost().getHostAddress(); logger.info("Lanceur", "Creation du personnage..."); // caracteristiques du personnage HashMap<Caracteristique, Integer> caracts = new HashMap<Caracteristique, Integer>(); // seule la force n'a pas sa valeur par defaut (exemple) caracts.put(Caracteristique.FORCE, 80); caracts.put(Caracteristique.VIE, 20); caracts.put(Caracteristique.INITIATIVE, 80); Point position = Calculs.positionAleatoireArene(); new StrategieAssassin( ipArene, port, ipConsole, nom, groupe, caracts, nbTours, position, logger); logger.info("Lanceur", "Creation du personnage reussie"); } catch (Exception e) { logger.severe("Lanceur", "Erreur lancement :\n" + e.getCause()); e.printStackTrace(); System.exit(ErreurLancement.suivant); } }