Jeu de guerre sur console

Fermé
Nelson_EU Messages postés 3 Date d'inscription samedi 12 décembre 2015 Statut Membre Dernière intervention 13 décembre 2015 - 12 déc. 2015 à 22:57
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 13 déc. 2015 à 14:09
Bonjour,

J'ai du creer un jeu pour l'ecole qui consiste en une guerre entre deux equipes de trois guerriers. Chaque equipe selectionne un guerrier parmi ses trois, puis ils se tapent dessus jusqu'a ce que l'un n'ai plus de PV. Le jeu s'arrete quand une des deux equipes n'a plus de guerrier en vie.

Mon jeu est globalement fini, j'ai rajoute quelques trucs comme le fait que chaque guerrier a un privilege (bonus d'attaque, de soin,...). Tous les guerriers commencent avec un privilege qu'ils peuvent utiliser pendant la partie. Si il est utilise, le guerrier ne la bien evidemment plus. Si le guerrier meurt sans avoir utilise son privilege, le guerrier adverse recoit ce privilege (si il ne la pas deja).

Jusqu'ici, tout fonctionne. J'ai fait une partie et ca roule.

Le probleme vient du fait que quand je relance une partie, par exemple le guerrier qui a finit avec 2 privileges a la partie precedente revient avec ces deux privileges, hors il ne devrait en avoir qu'un seul (puisque c'est le debut d'une nouvelle partie).

Les privileges d'un guerrier sont representes sous la forme d'un tableau de boolean.

Any help ? (je posterai le code si necessaire) Merci !!
A voir également:

2 réponses

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
12 déc. 2015 à 23:08
Bonjour,

Je ne sais pas comment tu as mis en place le système de nouvelle partie, mais si tu as ce genre d'effet de bords c'est probablement que tu as essayés d'effacer les données de la partie précédente et qu'il t'en manque un morceau, le plus simple et sûr aurait été de ne pas réutiliser les données de la première partie mais de les recréer de toute pièce comme tu l'as fait la première fois.

Par exemple, tu as une classe Game avec un attribut boolean[] privileges; tu as un objet Game g; et une méthode reset() qui parcourt privileges pour tout remettre à false. Ce genre de code est pas terrible. Il vaut mieux oublier l'objet Game g, et le reconstruire complètement avec un new Game() et ce pour chaque partie, la première, comme les suivantes.
1
Nelson_EU Messages postés 3 Date d'inscription samedi 12 décembre 2015 Statut Membre Dernière intervention 13 décembre 2015
Modifié par Nelson_EU le 12/12/2015 à 23:36
Salut ! Merci de ta reponse. J'ai essaye de rajouter une methode reset pour qu'a la fin de la partie tout se reinitialise mais ca ne fonctionne toujours pas :/
En gros j'ai une classe Guerrier (de laquelle j'instance mes differents guerriers: barbare, archer,...), une classe EquipeGuerriers (de laquelle j'instance mes deux equipes), une classe Combat qui contient le main, classe qui "gere" vraiment le jeu. Mes nouvelles parties ne sont donc pas instancees, il faut run le programme pour lancer une partie...
Edit: Ma table de privilege se trouve dans la classe guerrier, elle est propre a chaque guerrier et fait partie du constructeur (lorsque je cree par exemple mon barbare, je lui donne un nom, un nombre de PV, et le numero de son privilege
0
Nelson_EU Messages postés 3 Date d'inscription samedi 12 décembre 2015 Statut Membre Dernière intervention 13 décembre 2015
13 déc. 2015 à 13:40
J'ai cree une methode reset() qui est directement appelee dans le main quand le programme se lance.

Cette methode ne fonctionne pourtant pas. Pourquoi ?
	public static void reset(){
		barbare.setPrivileges(2);
		archer.setPrivileges(3);
		mage.setPrivileges(3);
		geant.setPrivileges(1);
		dragon.setPrivileges(1);
		sorciere.setPrivileges(2);
				
	}

Methode privilege:
public void setPrivileges(int privilege) {
    for (int i = 0; i < tableDesPrivileges.length; i++) {
        if (i == privilege - 1) {
            this.privileges[i] = true;
        } else {
            this.privileges[i] = false;
        }
    }
}


Et dans le main j'ai appelee la methode comme ceci: EquipeGuerriers.reset();

Une idee du probleme ?
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
13 déc. 2015 à 14:09
Mon explication n'était peut-être pas clair hier :
Par exemple, tu as [...] une méthode reset() qui parcourt privileges pour tout remettre à false. Ce genre de code est pas terrible. Il vaut mieux oublier l'objet Game g, et le reconstruire complètement avec un new Game() [...]

Quand je regarde ta méthode EquipeGuerriers.reset(); je vois qu'elle est static, c'est à dire que tu ne construits pas d'objet pour avoir une équipe, mais que c'est la classe ton équipe et ça c'est pas bon. Ça veut dire que barbare, archer, mage, etc. sont static aussi, d'où les effets de bords.

Il vaut mieux avoir un objet EquipeGuerrier, que tu instancie avec un new EquipeGuerriers(), qui initialise les privilèges de barbare, archer, mage etc. localement à cette instance d'EquipeGuerriers, de sorte que quand tu recommences ton jeu, tu recréés une nouvelle EquipeGuerriers construites de zéro, sans dépendre des modifications précédentes.

De manière générale, les attributs static dans une classe sont censés être relativement peu fréquent, cela sert dans certains cas, mais ils ne doivent pas remplacer les attributs non-static liés aux objets de la classe.
0