import java.util.ArrayList; import java.util.Random; import java.util.Scanner; public class MainJeu { public static void main(String[] args) { // La liste "listeSortsMageDeBase" et "listeSortsGuerrierDeBase" contiennent les sorts qu'on propose au joueur pour chaque niveau (ici uniquement au niveau 1). ArrayList<SortMage> listeSortsMageDeBase = new ArrayList<SortMage>(); ArrayList<SortGuerrier> listeSortsGuerrierDeBase = new ArrayList<SortGuerrier>(); // La liste "listeSortsMage" et "listeSortsGuerrierDe" contiennent les sorts que les joueurs peuvent utiliser pendant le combat. ArrayList<SortMage> listeSortsMage = new ArrayList<SortMage>(); ArrayList<SortGuerrier> listeSortsGuerrier = new ArrayList<SortGuerrier>(); // Création du Mage Personnage m1 = new Mage(); // Création du guerrier Personnage g2 = new Guerrier(); // Création du sort de base de chaque personnage // Format : public SortMage(String nomS, int dMin, int dMax, int cm, int cd, int niv) Sort sortDeBaseMage = new SortMage("Halo de bâton", 5, 5, 0, 1, 0); listeSortsMage.add((SortMage) sortDeBaseMage); // Format : public SortGuerrier(String nomS, int dMin, int dMax, int cm, int cd, int niv) Sort sortDeBaseGuerrier = new SortGuerrier("Coup d'estoc", 5, 5, 0, 1, 0); listeSortsGuerrier.add((SortGuerrier) sortDeBaseGuerrier); // Création des deux sorts du niveau 1 du Mage. creationDesSortsMage(listeSortsMageDeBase); // Choix par le Mage de son premier sort. choixDuPremierSortMage(listeSortsMageDeBase, listeSortsMage, m1); // Création des deux sorts du niveau 1 du Guerrier. creationDesSortsGuerrier(listeSortsGuerrierDeBase); // Choix par le Guerrier de son premier sort. choixDuPremierSortGuerrier(listeSortsGuerrierDeBase, listeSortsGuerrier, g2); /* PREMIERE ATTAQUE */ attaqueMage(listeSortsMage, m1, g2); attaqueGuerrier(listeSortsGuerrier, m1, g2); /* FIN */ }
public class Personnage { protected String nom; protected int niveau; protected int vieMax; protected int vieRestante; protected int manaMax; protected int manaRestante; protected static String nomCategorie; public Personnage(int niveau, int vieMax, int vieRestante, int manaMax, int manaRestante, String nomCategorie) { System.out.println("----- Création d'un " + nomCategorie + " -----"); this.niveau = niveau; this.vieMax = vieMax; this.vieRestante = vieRestante; this.manaMax = manaMax; this.manaRestante = manaRestante; this.nomCategorie = nomCategorie; Scanner sc = new Scanner(System.in); System.out.print("Saisissez un nom de " + nomCategorie + " : "); setNom(sc.nextLine()); System.out.println("------------------------------"); System.out.println(); } [...Getters, setters...] }
public class Mage extends Personnage { public Mage() { /* Paramètres pour la création du Mage : niveau, vie maximale, vie restantes (pour le cas futur de combat successifs sans remise à 0 de la vie), mana maximale, mana restante, catégorie de personnage (je ne sais pas comment gérer la catégorie différemment). */ super(1, 100, 100, 100, 100, "Mage"); } }
public class Sort { private String nomSort; private int degatsMax; private int degatsMin; private int coutMana; private int cooldown; private int niveauDeDeblocage; public Sort(String nomS, int dMin, int dMax, int cm, int cd, int niv) { setNomSort(nomS); setDegatsMin(dMin); setDegatsMax(dMax); setCoutMana(cm); setCooldown(cd); // Je ne gère pas encore ce paramètre dans le programme. setNiveauDeDeblocage(niv); // Je ne gère pas encore ce paramètre dans le programme. } [...Getters, setters...] }
public class SortMage extends Sort { public SortMage(String nomS, int dMin, int dMax, int cm, int cd, int niv) { super(nomS, dMin, dMax, cm, cd, niv); } }
public final class Attaque { public static final HALO_BATON = new AttaquePhysique("Halo Baton",20,40,60); public static final COUP_D_ESTOC = new AttaquePhysique("Coup d'estoc",30,30,30);
public enum Categorie { MAGE("Mage", 100, 150, Attaque.HALO_BATON), GUERRIER("Guerrier", 200, 50, Attaque.COUP_D_ESTOC); private final String description; private final int statDeBase1; private final Attaque[] attaquesAutorisees; Categorie(String description, int statDeBase1, int statDeBase2, Attaque...attaquesAutorisees) { this.description = description; this.statDeBase1=statDeBase1; this.attaquesAutorisees = attaquesAutorisees; } public int getStatDeBase1() { return statDeBase1; } }
public class Personnage { private Categorie categorie; private String nom; private int vie; private int niveau; private int vieMax; public Personnage(Categorie categorie, String nom, int niveau) { this.categorie = categorie; this.nom = nom; this.niveau = niveau; this.vieMax = categorie.getStatDeBase1()*niveau; // par exemple this.vie = vieMax; } }
new Personnage(Categorie.MAGE, "toto", 42, Attaque.HALO_BATON)cela fonctionnerait car Halo Baton est une attaque de mage, mais si tu fais un
new Personnage(Categorie.GUERRIER, "toto", 42, Attaque.HALO_BATON)ça générerait une erreur (à gérer dans le jeu) car un Guerrier n'a qu'une seule attaque possible, COUP_D_ESTOC.
MAGE("Mage", 100, 150, Attaque.HALO_BATON), GUERRIER("Guerrier", 200, 50, Attaque.COUP_D_ESTOC);
public abstract class Attaque { } public class AttaquePhysique extends Attaque { } public final class Attaques { // au pluriel public static final Attaque HALO_BATON = new AttaquePhysique("Halo Baton",20,40,60); public static final Attaque COUP_D_ESTOC = new AttaquePhysique("Coup d'estoc",30,30,30);
enum Couleur { PIQUE, COEUR, CARREAU, TREFLE }; enum Valeur { UN, DEUX, TROIS, ..., DIX, VALET, DAME, ROI };
switch (personnage.getCategorie()) { case MAGE : ... case GUERRIER : ... }
ArrayList<Sort> listeSortsMageDeBase = new ArrayList<Sort>(); Personnage m1 = new Mage(); m1.choixDuPremierSort(listeSortsMageDeBase, m1);
// ON DEMANDE AU JOUEUR MAGE DE CHOISIR SON PREMIER SORT static void choixDuPremierSort(ArrayList<Sort> listeSortsDeBase, Personnage p) { System.out.println(); System.out.println("Choix du sort de niveau " + p.getNiveau() + " de votre " + p.getCategorie() + " : "); // Affichage des sorts Mage de la liste générale int i = 0; int j = 1; for (Sort s : listeSortsDeBase) { if(p.getNiveau() == listeSortsDeBase.get(i).getNiveauSort()) { System.out.println(j + "- " + s.getNomSort()); System.out.println(" * Coût en mana : " + s.getCoutMana() + "."); System.out.println(" * Plage de dégâts : " + s.getDegatsMin() + " à " + s.getDegatsMax() + "."); System.out.println(" * Temps de recharge : " + s.getCooldownDeBase() + " tour(s)."); j++; } i++; } int indice = 300; System.out.println(); while(indice > 2) { System.out.print("Quel est votre choix ? "); Scanner choix = new Scanner(System.in); indice = choix.nextInt(); } if(indice == 1) { listeSortsDeBase.remove(p.getNiveau() + 2); } else if(indice == 2) { listeSortsDeBase.remove(p.getNiveau() + 1); } System.out.println(); }
// LES ATTAQUES protected static void attaque(ArrayList<Sort> listeSortsDeBase, Personnage p1, Personnage p2) { System.out.println(); System.out.println(); System.out.println(p1.getCategorie() + " A VOUS ! Quel sort voulez-vous utiliser contre votre adversaire ?"); System.out.println(); ArrayList<Integer> listeSortsPossibles = new ArrayList(); int e = 0; int f = 1; for (Sort s2 : listeSortsDeBase) { // On affiche les sorts dont le joueur a la mana pour et dont le cooldown est à 0 (prêt à lancer) if((e > 0) && (p1.getManaRestante() >= listeSortsDeBase.get(e).getCoutMana()) && (listeSortsDeBase.get(e).getCooldownEnCours() == 0) && (listeSortsDeBase.get(e).getNiveauSort() <= p1.getNiveau())) { System.out.println("SORT " + f + " : " + s2.getNomSort()); System.out.println(" * Coût en mana : " + s2.getCoutMana() + "."); System.out.println(" * Dégats minimum : " + s2.getDegatsMin() + "."); System.out.println(" * Dégats maximum : " + s2.getDegatsMax() + "."); System.out.println(" * Temps de recharge : " + s2.getCooldownEnCours() + " tour(s)."); System.out.println(" * Temps de recharge Maximal : " + s2.getCooldownDeBase() + " tour(s)."); listeSortsPossibles.add(e); //System.out.println("liste des sorts possibles : " + listeSortsPossibles.get(e) + "."); f++; } e++; } int ind = 300; System.out.println(); // Vérifie que la saisie correspond à un sort proposé sinon redemande while(ind >= e || !listeSortsPossibles.contains(ind)) // A VERIFIER, PB : peut lancer le sort vide à 0 { System.out.print("Quel est votre choix ? "); Scanner choixAttaque = new Scanner(System.in); ind = choixAttaque.nextInt(); // Indice de l'attaque choisie } int ind2 = ind + 1; // Parcourir tous les AUTRES sorts et réduire le cooldown de 1 chacun // EN COURS !!! f = 0; int cd, cdec, cd2, cdec2, cdec3; for (Sort s3 : listeSortsDeBase) { cd = listeSortsDeBase.get(ind).getCooldownDeBase(); // cd de base du sort choisi cdec = listeSortsDeBase.get(ind).getCooldownEnCours(); // cd en cours du sort choisi cd2 = listeSortsDeBase.get(f).getCooldownDeBase(); // cd de base du sort en lecture cdec2 = listeSortsDeBase.get(f).getCooldownEnCours(); // cd en cours du sort en lecture cdec3 = cdec2 - 1; if(ind == f) { // Remettre le cooldown du sort à 0 quand il est lancé listeSortsDeBase.get(ind).setCooldownEnCours(cd); } else if(cdec2 > 0) { listeSortsDeBase.get(f).setCooldownEnCours(cdec3); } f++; } listeSortsPossibles.clear(); // Calcule les dégâts en prenant en compte l'écart aléatoire entre les bornes int nombreAleatoire; Random rand = new Random(); if (listeSortsDeBase.get(ind).getDegatsMin() != listeSortsDeBase.get(ind).getDegatsMax()) { nombreAleatoire = rand.nextInt(listeSortsDeBase.get(ind).getDegatsMax() - listeSortsDeBase.get(ind).getDegatsMin()) + listeSortsDeBase.get(ind).getDegatsMin(); } else { nombreAleatoire = listeSortsDeBase.get(ind).getDegatsMin(); } // On récupère les données des personnages avant et après l'attaque int vieGuerrierAvantAttaque = p2.getVieRestante(); int vieGuerrierApresAttaque = vieGuerrierAvantAttaque - nombreAleatoire; //int manaGuerrierAvantSort = p2.getManaRestante(); //int manaGuerrierApresSort = manaGuerrierAvantSort; int vieMageAvantAttaque = p1.getVieRestante(); int vieMageApresAttaque = vieMageAvantAttaque; int manaMageAvantSort = p1.getManaRestante(); int manaMageApresSort = p1.getManaRestante() - listeSortsDeBase.get(ind).getCoutMana(); int r = 0; while(r < 20) { System.out.println(); r++; } System.out.println("---------------- RAPPORT DE COMBAT ----------------"); System.out.println(); System.out.println("Le " + p1.getCategorie() + " : "); System.out.println(" * Dégâts du sort " + listeSortsDeBase.get(ind).getNomSort() + " : " + nombreAleatoire); System.out.println(" * Vie Restante : " + vieMageApresAttaque); System.out.println(" * Mana Restante : Elle passe de " + manaMageAvantSort + " à " + manaMageApresSort); if(vieGuerrierApresAttaque <= 0) { System.out.println(); System.out.println(); System.out.println("Le " + p2.getCategorie() + " TOMBE RAIDE MORT !"); } else { System.out.println(); System.out.println("Le " + p2.getCategorie() + " : "); System.out.println(" * Vie Restante : Elle passe de " + vieGuerrierAvantAttaque + " à " + vieGuerrierApresAttaque); } System.out.println(); System.out.println(); // Met à jour la vie du guerrier dans l'instance p2 de Guerrier. p2.setVieRestante(vieGuerrierApresAttaque); p1.setManaRestante(manaMageApresSort); }
// Méthode : Le personnage lance son attaque sur le monstre public int attaquerMonstre(ArrayList<Sort> listeSortsDeBase, Personnage p) { //[...] return degatDuSort; // retourne les dégâts que fait le sort }
// Méthode : Le monstre subit une attaque public int seFaitAttaquer(Monstre m, int degatDuSort) { //[...] return vieMonstre; // retourne la vie restante du monstre (car non modifié dans la classe Monstre contrairement aux personnages) pour continuer le combat }
donjon1.listeDeSalle.add(salle1)) et ensuite attribuer une liste de Monstres à chaque Salle (ArrayList =>
salle1.listeDeMonstres.add(monstre1)).
protected ArrayList<Monstre> listeDesMonstres = new ArrayList<Monstre>();