Demande d'aide pour JAVA

Résolu
LastSolution Messages postés 9 Date d'inscription lundi 20 avril 2015 Statut Membre Dernière intervention 7 mai 2015 - 20 avril 2015 à 16:17
 LastSolution - 29 avril 2015 à 23:36
Bonjour,

je viens de débuter l'apprentissage de JAVA dans mon coin et j'aurais voulu savoir si des personnes seraient disponibles pour m'aider à avancer.

Je suis en train de faire juste un petit jeu avec affichage sur la console d'Eclipse mais je me démène tant bien que mal avec les classes, l'héritage, les interfaces, etc.

Je trébuche sur beaucoup de choses qui ne sont pas naturelles pour moi et j'aurais voulu voir si quelqu'un pourrait m'aider ?

Le but de ce tout petit jeu est, pour le moment, de faire combattre un Mage et un Guerrier.
C'est un programme qui a pour objectif de me faire découvrir pas à pas JAVA en l'étoffant par moi même au fil de mon apprentissage du langage.

Si quelqu'un peut m'apporter de l'aide je mettrais les quelques lignes que j'ai commencé à stabiliser ou j'enverrais le fichier à qui voudra.

3 réponses

jordane45 Messages postés 38244 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 4 octobre 2024 345
20 avril 2015 à 16:45
Bonjour,

Pour obtenir de l'aide sur ce forum .... il faut poster le CODE qui pose problème et expliquer en quoi il en fonctionne pas.

NB : Merci de bien vouloir utiliser la coloration syntaxique (les balises de code) lorsque tu postes du code sur le forum.
Explications disponibles ici :
http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
0
LastSolution Messages postés 9 Date d'inscription lundi 20 avril 2015 Statut Membre Dernière intervention 7 mai 2015
20 avril 2015 à 17:05
OBJECTIF DU PROGRAMME :

L'objectif de ce programme est de faire combattre un Mage et un Guerrier (héritent de la classe "Personnage").
Au lancement du programme on demande de saisir un nom de Mage puis un nom de Guerrier.

Chaque classe de personnage a un sort de base :
Le mage qui a un bâton (logique) aura l'attaque "Halo de bâton".
Le guerrier qui a une épée aura l'attaque "Coup d'estoc".

Après la création du personnage, on propose aux joueurs 2 sorts qui sont disponibles au niveau 1 de leur classe. Les joueurs choisissent 1 sort chacun.

Deux listes sont créées pour chaque classe de personnage :
Une liste pour stocker tous les sorts d'une classe (les 2 sorts proposés au niveau 1 ici) et une pour stocker tous les sorts
choisis par le joueur pour sa classe (le sort de base ainsi que celui choisi par le joueur au niveau 1 ici).

Une fois que chaque personnage a choisi son sort de niveau 1, on demande à chaque personnage quel sort il veut lancer entre son sort de base et son sort choisi.
On lance les attaques et on affiche les points de vie restants.

Le programme ne fait qu'une seule attaque pour commencer avant de partir sur un combat entier.


PROBLEMES :

- Je pense qu'il faut des classes Interfaces pour gérer les attaques des personnages non pas dans le main() mais dans la classe personnage pour centraliser.
- Je ne prends pas en compte les cooldown (temps avant que le sort ne soit de nouveau accessible dans le combat). J'attends de stabiliser la base avant de compliquer.
- Le paramètre "Catégorie" dans la classe personnage est actuellement en String mais je ne sais pas si c'est la bonne façon vu qu'à l'avenir je peux rajouter d'autres catégories.



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 */
	}


Je mets en dessous la classe PERSONNAGE qui est la classe dont découlent les classes MAGE et GUERRIER :

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...]
}


Pour exemple je mets la classe MAGE :

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");
	}
}


Je mets en dessous la classe SORT qui est la classe dont découlent les classes SORTMAGE et SORTGUERRIER:

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...]
}


Pour exemple je mets la classe SORTMAGE :

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);
	}
}


Je mets beaucoup de code mais j'explique au fur et à mesure avec des commentaires.
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 127
20 avril 2015 à 21:12
Bonjour,

1) "Je pense qu'il faut des classes Interfaces pour gérer les attaques des personnages non pas dans le main() mais dans la classe personnage pour centraliser"
Déjà, ne les appelles pas "interface", c'est une notion qui existe en Java, et ne correspond pas à ce que tu penses.
Sans rentrer dans des fenêtres graphiques un peu compliqué, tu peux commencer par des interactions au clavier avec un menu, en mode "on demande à chaque personnage quel sort il veut lancer entre son sort de base et son sort choisi. On lance les attaques et on affiche les points de vie restants."
Mais pour répondre à la question, oui, une classe pour gérer ça c'est mieux, voire plusieurs afin d'avoir plusieurs modes de jeu (par exemple humain/humain, humain/ordinateur), avec donc encore de l'héritage qui se promène.

2) "Je ne prends pas en compte les cooldown (temps avant que le sort ne soit de nouveau accessible dans le combat). J'attends de stabiliser la base avant de compliquer."
C'est une question ?

3) "Le paramètre "Catégorie" dans la classe personnage est actuellement en String mais je ne sais pas si c'est la bonne façon vu qu'à l'avenir je peux rajouter d'autres catégories."
La meilleure manière de faire serait sûrement d'utiliser des énumérations, c'est simple à mettre en place et assez puissant en Java (comparé à d'autres langages). Mais ATTENTION, car tu as l'air de vouloir créer une catégorie "mage" pour la classe Mage, et probablement une catégorie "guerrier" pour la classe Guerrier... c'est inutile d'avoir deux fois la même information. Soit tu fais de l'héritage de la classe Personnage avec des classes pour chaque catégorie de Personnage, soit tu fais une seule classe Personnage à laquelle tu spécifies une catégorie pour les objets.

Voici comment je conçois la chose en Java (ce n'est qu'un exemple, je n'ai pas du tout repris les règles du jeu qui te sont fixés).

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;
    }
}

L'héritage est utile lorsque le code à l'intérieur des méthodes peut changer d'un type d'objet à un autre (c'est probablement le cas des attaques dont certaines), mais la construction que j'ai faite au dessus me parait plus adaptée pour la gestion des catégories de personnages, dont le principe de jeu (perte de vie, montée en niveau, etc.) seront très certainement communes à tous les personnages.
0
LastSolution
20 avril 2015 à 22:03
1) Oui je compte bien rester sur de l'affichage basique pour le moment. J'affiche les sorts et le joueur tape le numéro correspondant au sort choisi.
Plus tard je pensais à un affichage dans une fenêtre avec des boutons mais je n'y suis pas du tout encore.

2) Non ce n'était pas une question ^^. J'avertissais qu'effectivement j'avais cette variable non utilisée mais que je préférais travailler sur la base du programme avant de compliquer les choses.

3) Dans ta méthode d'énumération de catégorie tu mets :
"MAGE("Mage", 100, 150, Attaque.HALO_BATON),
GUERRIER("Guerrier", 200, 50, Attaque.COUP_D_ESTOC);"
Pour les autres attaques tu les mets dans un tableau d'attaques si je comprends bien ? Mais je ne comprends pas bien comment ça fonctionne. La classe Attaque semble ne gérer que les sorts de base des personnages. Quel est son lient avec les autres attaques choisies par les joueurs ? Comment vois tu la chose ?

Désolé je débute et je déchiffre tant bien que mal.

Mais je vais commencer à tester ta façon de voir les choses pour voir comment ça s'articule.

Merci beaucoup pour le temps que tu investis dans les conseils que tu me donnes.
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 127 > LastSolution
20 avril 2015 à 22:33
Comme je disais ce n'était qu'un exemple, je voyais ça comme la liste des attaque que pourrais utiliser un personnage, car j'imaginais que tous les personnages ne pouvaient pas forcément utiliser toutes les attaques.

Si tu faisais par un exemple un
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.

Remarque, il faudrait rajouter un argument au constructeur Personnage dans mon exemple pour pouvoir rajouter les attaques spécifique au personnage.
Je le répète, ce n'est qu'un exemple pour te montrer comment on peut faire des énumérations ou autres mécanismes du Java.
0
LastSolution Messages postés 9 Date d'inscription lundi 20 avril 2015 Statut Membre Dernière intervention 7 mai 2015
21 avril 2015 à 09:33
Bonjour,

merci de ta réponse !

1) Pour en revenir au code, ta classe Attaque ne semble pas différencier les sorts selon les classes si ? Est-ce possible sinon ?
J'ai essayé de gérer ça avec les arraylist que je remplie au début du main() mais ne peut t'on pas les mettre dans des classes séparées (exemple : classe Sort séparée en classes SortMage et SortGuerrier comme je partais de base ? Stocker tous les sorts du mage dans sa classe pour ensuite alimenter une liste qu'on affichera au joueur concerné ?

2) Concernant la méthode d'énumération que tu utilises quand tu fais :
MAGE("Mage", 100, 150, Attaque.HALO_BATON),
GUERRIER("Guerrier", 200, 50, Attaque.COUP_D_ESTOC);


Je ne comprends pas ce que sont "MAGE" et "GUERRIER". Ce sont des classes ? Des objets ? Je nage un peu :)

Quand j'ai créé la classe "Attaque" Eclipse n'a pas voulu me prendre les "final". Il me propose "float" ou changer ça par "AttaquePhysique".
Qu'est ce que j'ai pu oublier selon toi ?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 127
21 avril 2015 à 18:34
Bonjour,

ta classe Attaque ne semble pas différencier les sorts selon les classes si ? Est-ce possible sinon ?
En fait ce n'est pas vraiment une classe, au sens où il n'y a que des constantes, c'est un peu une bibliothèque de toutes les attaques possibles.
La différence sur le type d'attaque va être portée par chacune des valeurs, en l'occurence je n'ai que mis que des AttaquePhysique mais il pourrait y avoir d'autres types.

Quand j'ai créé la classe "Attaque" Eclipse n'a pas voulu me prendre les "final". Il me propose "float" ou changer ça par "AttaquePhysique".
C'est moi qui me suis trompé (je fais le code de tête sans tester), il manque effectivement le type de chaque objet. Du coup pour éviter les confusions on pourrait faire un peu de renommage et avoir.

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);

Stocker tous les sorts du mage dans sa classe pour ensuite alimenter une liste qu'on affichera au joueur concerné ?
Bien sûr, moi ce que je mettais c'était les attaques possibles pour la catégorie Mage, pas pour un Mage en particulier, dont les attaques seront effectivement dans l'objet de chaque mage, mais choisi parmi la liste d'attaque autorisées dans sa catégorie (mais ce n'est qu'un exemple...)

Concernant la méthode d'énumération ... Je ne comprends pas ce que sont "MAGE" et "GUERRIER".
Ce sont des types énumérés, il faut voir ça au même niveau que "true" et "false" pour les booléens. En fait je liste exhaustivement tous les cas possibles. Il ne peut pas y avoir d'autres types que ceux énumérés là.
Techniquement ce sont des objets, les seuls objets que peut avoir cette classe.

Exemple plus simple, pour un jeu de cartes, on pourrait avoir :
enum Couleur { PIQUE, COEUR, CARREAU, TREFLE };
enum Valeur { UN, DEUX, TROIS, ..., DIX, VALET, DAME, ROI };

Pour la catégorie de chaque personnage, je pense que c'est ce que tu devrais avoir, il n'y a qu'un seul objet pour représenter chaque catégorie, qui contient une liste finie d'éléments.

Du coup on peut faire ce genre de code :

switch (personnage.getCategorie()) {
    case MAGE : ...
    case GUERRIER : ...
}
0
LastSolution
27 avril 2015 à 12:01
Bonjour,

J'ai un soucis sur mon petit programme :

J'appelle ma fonction "choixDuPremierSort" mais je répète 2 fois l'instance m1. Je pense qu'il faut gérer juste avec le m1.[...]

ArrayList<Sort> listeSortsMageDeBase = new ArrayList<Sort>();	
Personnage m1 = new Mage();
m1.choixDuPremierSort(listeSortsMageDeBase, m1);


Ça appelle la méthode du même nom dans la classe "Personnage" :

	
// 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();
	}


Mais je ne vois pas comment enlever mon "m1" en doublon.
J'ai essayé en l'enlevant et en mettant du "this.VARIABLE" mais rien de bon n'en est ressorti.

Si quelqu'un peut m'aider :)
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 127
27 avril 2015 à 20:03
Bonjour,

Il faut enlever le static, sinon le m1. est juste un alias de Mage. qui ne connaît donc rien de l'état de m1 (ce qui t'oblige à le passer en paramètre)
0
LastSolution > KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024
27 avril 2015 à 20:11
Ah oui je ne savais pas que ça le bloquait ! Merci ça marche très très bien :)

Je reviens un peu plus tard avec d'autres questions ^^.
0
LastSolution
29 avril 2015 à 10:16
Bonjour,

RAPPEL : Dans mon petit programme je fais combattre deux personnages grâce à la méthode suivante :

	// 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);
	}


Comme j'aimerais partir sur un système de donjons avec un joueur attaquant des monstres, je pense qu'il serait préférable de séparer la partie où le premier joueur attaque de celle où l'autre joueur subit les dégâts.

Du style,

CLASSE PERSONNAGE
// 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
}


CLASSE MONSTRE
// 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
}


D'une part, est ce faisable de la sorte ?
D'autre part, comment puis-je faire passer les dégâts retournés dans l'attaque du personnage jusque dans la méthode où le monstre subit l'attaque ?
En règle générale comment le "return X" fonctionne ? Dans le main() comment fait t'on pour récupérer cette valeur ?

Désolé si ce sont des questions bêtes je tâtonne :)
0
LastSolution > LastSolution
29 avril 2015 à 11:43
J'ai compris comment s'utilise le "return", je suis un peu bête ! :p

Si vous avez des conseils pour le reste je suis preneur par contre.
0
LastSolution
29 avril 2015 à 23:36
Bonsoir,

J'ai un autre soucis.
Je voudrais qu'un personnage rentre dans un donjon constitué de salles successives, elles mêmes remplies de monstres.

Je pensais déclarer un Donjon et lui attribuer une liste de Salles (ArrayList =>
donjon1.listeDeSalle.add(salle1)
) et ensuite attribuer une liste de Monstres à chaque Salle (ArrayList =>
salle1.listeDeMonstres.add(monstre1)
).
Mais je n'ai aucune idée de comment déclarer une ArrayList dans les classes Salle et Monstre. J'ai cherché un peu partout et je continu à chercher mais en vain.

Dans ma classe Salle, par exemple, j'ai déclaré :

protected ArrayList<Monstre> listeDesMonstres = new ArrayList<Monstre>();


Mais je doute que ce soit ça.

Si quelqu'un peut m'aider je lui en serais très reconnaissant :)
0
Rejoignez-nous