Après avoir continuer le code et lu ton message j'ai plusieurs question :
Pour le tableau, en utilisant :
public final static int BOARD_SIZE = 20;
Je ne crée pas mon tableau en lui donnant 20 lignes et 20 colonnes avec les méthodes ?
Vous me conseillez quoi entre une création aléatoire de la carte ou utiliser un carte fixe à mon niveau ?
Ta classe Virtual, c'est ton application ? Nous avons déjà une application qui contient un main(), donc faut-il que je mette à la suite ce que tu m'as donné ?
public class GeoStrat {
public static void main(String[] args) {
/* Read and register a player name */
Scanner sc = new Scanner(System.in);
System.out.println("Veuillez saisir votre nom :");
String namescan = sc.nextLine();
Joueur joueur1;
joueur1 = new Joueur(namescan);
System.out.println(" ");
System.out.println("Bonjour " + joueur1.getName()+ " et bienvenue !");
System.out.println(" ");
System.out.println("Une partie de GeoStrat a été créée. Regarde la fenêtre qui a été créée ! ");
System.out.println(" ");
Joueur Joueur = new Joueur(joueur1, sc);
InterfaceUtilisateur win = new InterfaceUtilisateur();
Audio son = new Audio(null);
}
Je n'ai pas réussi à faire fonctionner le System.out.println que tu m'as passé en 1er methode :
1/ Si tu crée ton tableau, sauf que toute ses cases sont null car non instanciée. (pas de = new ForestCase())
2/ Tu peux très bien faire une Carte fixe pour le moment au moins tu sais quel résultat attendre.
3/ Oui Virtual c'est juste une petite classe pour tester l'heritage sur ton projet et te montrer comment cela marche (si tu copie colle mon code dans une classe Vitual, elle va marcher)
4/ Pas oblige de mettre mon code en brut dans ton main, tu peux passer par encore d'autres objets pour les instanciation et mecanique de jeu (ce qu'il te faudra faire)
5/ Case.displayXXX affiche un truc j'avais pas fait gaffe... utilise Case.getVitesse() du coup
Je me retrouve avec VirtualCarte qui est mon application, Carte qui est celle où va etre le tableau avec un affichage, ensuite j'ai Case qui est une classe abstraite, et ses dérivés Foret, Montagne, Plaine, Ville.
Pour afficher mon tableau fixe comme je fais ? Je voudrais qu'il fasse du 20x20, pour le moment j'ai du mal sans affichage à tout bien cerné je pense...
Commence par faire une fonction initCarte() dans Carte qui sera appelée en début de programme pour générer ta Carte. tu peux l'appeler dans le constructeur de Carte par exemple.
Elle aura cette tete la :
void initCarte (){
for (int i = 0 ; i < SIZE ; i++){
for (int j = 0 ; j < SIZE ; j++){
cases[i][j] = new ForestCases();
}
}
}
A mettre dans
void Carte() {
// ...
initCarte();
//...
}
Tu te retrouve avec cases[][] initialisé avec du SIZE*SIZE de case de foret.
Pour l'affichage il te faut une méthode (inspire toi de mon System.out.println de toute a l'heure) qui se trouve dans Carte et qui va parser le tableau 2D cases.
Dans ton application il te faudra créer une Carte. Son appel a son constructeur ( = new Carte()) va appeler la fonction initCarte(). Une fois creer tu pourra l'afficher avec carte.displayCarte();
Ce qui te donne dans le genre :
public class VirtualCarte {
public static void main (String[] arg){
Carte carte = new Carte(); // appel constructeur qui va initialiser la carte via initCarte()
carte.displayCarte(); // affiche en console toute les cases : Type(Vitesse)
}
}
Ca fait plusieurs fois que tu utilise le mot "parser" est ce une faute de frappe ou ça veut dire quelque chose ? Parce que dans ce cas là je ne sais pas ce que ça veut dire
J'ai une erreur du type :
Exception in thread "main" java.lang.NullPointerException
at fr.iutvalence.info.dut.m2107.Carte.<init>(Carte.java:16) //Il me selectionne la ligne cases[i][j] = new CaseForet(); que j'ai mis dans le constructeur Carte()
at fr.iutvalence.info.dut.m2107.VirtualCarte.main(VirtualCarte.java:29) // Il me selectionne la ligne : Carte carte = new Carte(); dans mon application.
Tu me dis que la methode initCarte va dans le constructeur de Carte(); mais dans ce cas là, il faut que je crée une classe initCarte non ?
Parser (de l'anglais) c'est pour dire que tu va analyser/regarder toute les donnees d'une entite. Dans ton cas tu vas parser un tableau => tu va parcourir tous les indices
Non non initCarte est juste une méthode qui va dans ta classe Carte pour instancier ton tableau.
Fais voir ton code, car tu dois mal faire des instanciations
public class VirtualCarte {
/**
* @param args
*/
public static void main(String[] args)
{
Case c0 = new CaseForet();
Case c1 = new CasePlaine();
Case c2 = new CaseVille();
Case c3 = new CaseMontagne();
Case[] cases = { c0, c1, c2, c3 };
for (int i = 0; i < cases.length; i++)
{
cases[i].displayVitesse();
cases[i].displayDefense();
}
Carte carte = new Carte(); // appel constructeur qui va initialiser la carte via initCarte()
carte.afficherMap(); // affiche en console toute les cases : Type(Vitesse)
}
}
public class Carte {
public final static int SIZE = 20;
protected Case[][] cases;
/**
* @param cases
*/
public Carte()
{
for (int i = 0 ; i < SIZE ; i++){
for (int j = 0 ; j < SIZE ; j++)
{
cases[i][j] = new CaseForet();
}
}
}
private Case[][] genererCarte()
{
Case[][] cases = new Case[SIZE][SIZE];
return cases;
}
public Case[][] getCases()
{
return cases;
}
public void setCases(Case[][] cases)
{
this.cases = cases;
}
public void afficherMap()
{
for(int i = 0 ; i < cases.length ; i++)
{
for(int j = 0 ; j < cases.length ; j++)
{
System.out.print(cases[i][j].getClass().toString() + " " + cases[i][j].getVitesse() + "\t");
}
System.out.println();
}
}
}
abstract class Case
{
public abstract int getVitesse();
public abstract int getDefense();
public void displayVitesse()
{
System.out.println("Vitesse de deplacement : " + getVitesse() + "%");
}
public void displayDefense()
{
System.out.println("Bonus de défense : " + getDefense() + "%");
}
}
class CaseForet extends Case{
public int getVitesse(){
return 50;
}
public int getDefense() {
return 50;
}
}
Ah d'accord merci, je comprends mieux maintenant Tu peux imbriquée deux classes non ?
Maintenant ton main devrait ressembler a cela plutot :
public static void main(String[] args)
{
Carte carte = new Carte(); // appel constructeur qui va initialiser la carte via initCarte()
carte.afficherMap(); // affiche en console toute les cases : Type(Vitesse)
}
On peut imbriquer deux classes mais je pense que c'est loin de ton niveau... Je pense que tu veux dire autre chose du coup mais je ne vois pas quoi
Tu dois avoir une erreur avec ton code car tu n'appelle jamais genererCarte(). Inutile d'ailleurs de retourner le tableau de Cases.
public class Carte {
public final static int SIZE = 20;
protected Case[][] cases= new Case[SIZE][SIZE];
/**
* @param cases
*/
public Carte()
{
for (int i = 0 ; i < SIZE ; i++){
for (int j = 0 ; j < SIZE ; j++)
{
cases[i][j] = new CaseForet();
}
}
}
public Case[][] getCases()
{
return cases;
}
//...
Seulement pour ma petite coquille si je la corrige il me dis qu'il peut pas utiliser l'opérande < si après je met cases[] il est non défini pour le type d'argument de cases[], une erreur de syntaxe, et cases cannot be resolved to a type..
Mais si ça ne gène pas mon affichage si je garde mon écriture d'avant, je peux donc la garder ?
Et je me retrouve avec qu'une seule ligne enfaite...j'ai pas les colonne et j'ai uniquement un affichage de Forêt 50, ce qui est déjà super Mais j'aimerais bien qu'il y ai les autres aussi.
La 1ere boucle for permet de parser la 1ere dimension de ton tableau. La deuxieme permet de lire chaque tableau (cases[i] du coup) de la 1ere dimension pour pouvoir faire cases[i][j]. Il te faut donc bien utiliser cases[i] pour dire "Je veux la longueur de la 1ere dimension"
Bizarre que tu ai tout sur une ligne... Fait voir ton code mis a jour !
package fr.iutvalence.info.dut.m2107;
public class VirtualCarte {
/**
* @param args
*/
public static void main(String[] args)
{
Case c0 = new CaseForet();
Case c1 = new CasePlaine();
Case c2 = new CaseVille();
Case c3 = new CaseMontagne();
Case[] cases = { c0, c1, c2, c3 };
for (int i = 0; i < cases.length; i++)
{
cases[i].displayVitesse();
cases[i].displayDefense();
}
Carte carte = new Carte(); // appel constructeur qui va initialiser la carte via initCarte()
carte.afficherMap(); // affiche en console toute les cases : Type(Vitesse)
}
}
package fr.iutvalence.info.dut.m2107;
public class Carte {
public final static int SIZE = 20;
protected Case[][] cases= new Case[SIZE][SIZE];
/**
* @param cases
*/
public Carte()
{
for (int i = 0 ; i < SIZE ; i++){
for (int j = 0 ; j < SIZE ; j++)
{
cases[i][j] = new CaseForet();
}
}
}
public Case[][] getCases()
{
return cases;
}
public void setCases(Case[][] cases)
{
this.cases = cases;
}
public void afficherMap()
{
for(int i = 0 ; i < cases.length ; i++)
{
for(int j = 0 ; j < cases[i].length ; j++)
{
System.out.print(cases[i][j].getType() + " " + cases[i][j].getVitesse() + "\t");
}
}
}
}
package fr.iutvalence.info.dut.m2107;
abstract class Case
{
public abstract int getVitesse();
public abstract int getDefense();
abstract String getType();
public void displayVitesse()
{
System.out.println("Vitesse de deplacement : " + getVitesse() + "%");
}
public void displayDefense()
{
System.out.println("Bonus de défense : " + getDefense() + "%");
}
}
package fr.iutvalence.info.dut.m2107;
class CaseForet extends Case{
public int getVitesse(){
return 50;
}
public int getDefense() {
return 50;
}
String getType()
{
return "Foret";
}
}
package fr.iutvalence.info.dut.m2107;
public class CaseMontagne extends Case{
@Override
public int getVitesse() {
return 25;
}
@Override
public int getDefense() {
return 75;
}
String getType()
{
return "Montagne";
}
}
Oui du coup il te manque un saut de ligne a la fin des 20 cases
Dans afficherMap() :
for(int i = 0 ; i < cases.length ; i++)
{
for(int j = 0 ; j < cases[i].length ; j++)
{
System.out.print(cases[i][j].getType() + " " + cases[i][j].getVitesse() + "\t");
}
System.out.println(); // Des que l'on a fait une ligne, on saute une ligne
}
Quelques conseils :
Soit coherent au niveau de tes noms : essaie le plus possible de tout mettre en anglais et ne mélanges pas les deux (afficherMap() pour la classe Carte ...).
Tu as des getter et setter pour cases[][] donc passe le en private et non en protected. (meme private final).
Enleve dans ton main les premiere lignes, elles te sont inutiles maintenant Tu peux les regrouper dans une fonction test(); si tu veux pour les tester plus tard pour verifier si cela marche toujours.
C'est vrai tu as raison pour l'anglais, je pense qu'on va renommer nos classes et méthodes. Si je passe mes getter et setter en private il me met un Attention, les valeurs ne sont pas utilisées localement, je sais que ça ne craint rien un attention c'est juste préventif, mais je les utilise uniquement ailleurs.
Oui il faut qu'on réalise un jeu de test, merci pour le tips
Comment je fais pour avoir des cases différentes de forêt qui s'affiche ?
Ils sont utiles lorsque la variable est en private justement
Lors de ton initialisation, tu fais caes[i][j] = new ForestCase();. Donc il suffit de faire new PlainCase() et tu aura que des plaine etc... soit tu genere aleatoirement, soit tu dis que les contour de map sont de la forest (i, j == 0 ou == cases[i].length-1), l'interieur est fait de moitie plaine, moitie montagne ou autre... A toi de jouer avec des if et des modulo pour remplir correctement ton tableau =)
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Ah d'accord merci, je comprends mieux maintenant Tu peux imbriquée deux classes non ?