Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jeu d'echec

Null pointer exception...

Sujet résolu
    1 mai 2012 à 16:55:24

    Bonjour à tous :),

    Voila pour mon cour de Java j'ai un jeu d'échec à codé ! Pour l'instant je n'ai pas fait grand chose et je m'attaque à l'affichage de l'échiquier (en console pour le moment ^^) sachant que je dois obligatoirement utiliser des listes... Et malheureusement les listes et moi ça fait deux.

    Echiquier.java


    import java.util.*;
    
    public class Echiquier {
    	public LinkedList<Piece> ech;
    
    	public Echiquier() {
    		ech = new LinkedList<Piece>();
    	}
    
    	public Echiquier(LinkedList<Piece> ech) {
    		this.ech = ech;
    	}
    	public LinkedList<Piece> getListPiece() {
    		return ech;
    	}
    
    
    	public void afficherListe() {
    		int i=0,j=0;
    		Color color = new Color();
    		Position pos = new Position(i,j);
    		Piece piece ;
    
    		System.out.print(color.getCyan());
    		System.out.print("  A B C D E F G H\n");
    		color.setDefault();
    		
    		for(j=0;j<8;j++) {
    			System.out.print(color.getCyan());
    			System.out.print(j+1);
    			color.setDefault();
    			for(i=0;i<8;i++) {
    			    pos = new Position(i,j);
    				piece = getPiecePosition(pos);
    				if(pos == null) {
    					System.out.println("nul");
    				}
    				else {
    				
    					System.out.print(piece.toString());
    				}
    			} 
    			System.out.println();
    		}
    	}
    
    	public Piece getPiecePosition(Position position) { 
    		for(int i=0;i<ech.size();i++) {
    			if(ech.get(i).getPosition().equals(position)) {
    				return ech.get(i);	
    			}
    		}
    		return null;
    	}
    


    Piece.java


    import java.util.*;
    
    public abstract class Piece {
    	public String nom;
    	public int couleur;
    	public Position position;
    
    	public Piece() {
    		nom="Inconnue";
    		couleur=0;
    	}
    
    	public Piece(String nom, int couleur, int x, int y) {
    		this.nom=nom;
    		this.couleur=couleur;
    		this.position = new Position(x,y) ;
    	}
    
    	public String getNom() {
    		return nom;
    	}
    
    	public int getCouleur() {
    		return couleur;
    	}
    
    	public abstract String toString();
    
    	public Position getPosition() {
    		return position;
    	}
    


    Partie.java


    import java.util.*;
    
    public class Partie { 
    	public Echiquier echi;	
    
    	public Partie() {
    		echi = new Echiquier();	
    	}
    
    	public Echiquier getEchiquier() {
    		return echi;
    	}
     
            public void initialiserPositions() {
    
    		Fou fou = new Fou("F",1,1,3); 
    // 1: le nom (string), 2: la couleur (1 noir et 0 blanc), 3: x, 4: y
    		echi.getListPiece().add(fou);
    		System.out.println(echi);
            }
    }
    


    Mon erreur lors de l’exécution se trouve à ce niveau: System.out.print(piece.toString());
    J'ai également des classes pour chaque pièce dans lesquelles j'ai redéfini la méthode abstraite toString(). Le main ne contient rien de spécial à part une nouvelle partie appelant initialiserPosition et par la suite j'essaye d'afficher l’échiquier et là j'ai mon erreur.

    Voila si vous pourriez m'aider, ça serait bien sympa !
    • Partager sur Facebook
    • Partager sur Twitter
      1 mai 2012 à 17:20:04

      L'object piece vaut null, d'où l'erreur.
      • Partager sur Facebook
      • Partager sur Twitter
      Je ne réponds pas aux MP techniques, les forums sont là pour ça / Danser le rock à Lille / BetaSeries
        1 mai 2012 à 17:28:22

        Tout d'abord merci d'avoir répondu :) !

        Pour ta réponse: je m'en suis douter ^^. Mais du coup c'est pourquoi il est nul que j'aimerais bien savoir, en effet la fonction getPiecePosition retourne une piece de la liste ech.get(i). Dans ma class Partie en initialisant la liste je mets toutes les pièces dedans (dans l'exemple j'ai montré pour une seule pièce). Du coup comment récupérer le résultat de cette ligne return ech.get(i)? Et cette ligne ne me permet-elle pas de récupérer ce résultat dans pièce: piece = getPiecePosition(pos); ?
        • Partager sur Facebook
        • Partager sur Twitter
          1 mai 2012 à 18:34:56

          Salut,
          Il suffit de se relire, vous testez si pos est null au lieu de piece ^^
          (Peut être que mieux nommer la méthode getPiecePosition aurait éviter l'erreur d'ailleurs).
          if(pos == null) {
          

          Sinon il y a des choses plus sympa en java maintenant, comme par exemple :
          for (Piece piece : ech)
          {
              piece.getPosition();
          }
          

          D'ailleurs même en 1.4 sur une LinkedList il faut mieux utiliser un Iterator.
          Peut être qu'avec un affichage en console c'est difficile mais s'il était graphique la logique serait plutôt de dessiner la grille puis chacune des pièces à leur position (évite de parcourir toutes les cases de l'échiquiers).
          • Partager sur Facebook
          • Partager sur Twitter
            1 mai 2012 à 18:47:38

            Salut,

            Juste comme ça en passant, tu devrais éviter de mettre tes attributs en visibilité public et de faire des getters après, ton prof va sauter de sa chaise s'il voit ça :) . Mets plutôt tes attributs private.

            De même pour la méthode toString(), à priori c'est une méthode de la classe Object de laquelle tes classes héritent, c'est inutile de la déclarer abstraite dans ta classe mère, tu peux directement la redéfinir dans tes classes filles.
            • Partager sur Facebook
            • Partager sur Twitter
              1 mai 2012 à 19:14:04

              Merci pour les conseils Yuyuu :) !

              Merci aussi mac.aque, pour le nom de la méthode, elle est imposée >< ^^ je croyais avoir compris, j'ai essayé quelque chose du genre:

              if(ech.get(i) != null)
              


              Si la pièce est différente de null, on l'affiche sinon on n'affiche rien mais ça ne marche quand même pas, c'est le piece.toString(); la ligne ou l'erreur se situe et je ne vois toujours pas pourquoi :S !
              • Partager sur Facebook
              • Partager sur Twitter
                1 mai 2012 à 19:44:40

                Je ne vois vraiment pas ce que tu ne comprends pas.
                La méthode "getPiecePosition" return null s'il n'y a pas de pièce à la position indiquée.
                La méthode "afficherListe()" essaie d'afficher les pièces de toutes les positions, donc il y a forcément des positions où la pièce sera null.
                pos ne peut pas être null puisqu'il est crée juste avant le test, c'est bien piece qu'il faut tester.
                Ce que tu veux faire est donc me semble t'il :
                pos = new Position(i,j);
                piece = getPiecePosition(pos);
                if(piece == null) {
                    System.out.println("nul");
                }
                else {
                    System.out.print(piece.toString());
                }
                

                Ainsi piece ne peut pas être null dans System.out.print(piece.toString());
                • Partager sur Facebook
                • Partager sur Twitter
                  1 mai 2012 à 20:06:29

                  Merci, en effet c'est ce que je voulais faire :) ! Et j'ai compris par contre du coup quand j’exécute je me retrouve avec des null afficher a chaque endroit même la ou il y censé avoir des pièces :S

                  Edit: j'avais oublié de redéfinir equals ^^ c'est bon merci à tous
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Jeu d'echec

                  × 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.
                  • Editeur
                  • Markdown