Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme collisions- JEU D'ECHEC

    22 novembre 2014 à 11:08:10

    Bonjour à tous,

    Je n'ai pas spécialements l'habitude de poster sur le forum, mais après quelque jours de galère j'apprécierai bien un petit coup de pouce.

    Voila je développe actuellement un jeu d'echec en JAVA, j'ai mon interface graphiques, mes pieces, mes déplacements, et le fait de pouvoir "manger la piece adverse".

    Malheuresement je n'arrive pas à arreter l'effet du "piece passe muraille", lors du deplacement d'une pièce, si une autre pièce lui barre la route, il lui passe litteralement au travers.

    Effectivement dans mon code, j'ai fait mes calculs de déplacement en prenant en compte mon point de départ et mon point d'arriver.

    Je vous laisse les méthodes de déplacement de certaine pieces et vous remercie d'avance.

    Deplacement du fou

    public boolean deplacement(int ligne, int colonne) {
    		boolean peutAller = false;
    		
    		int deplaX = Math.abs(colonne - this.colonne);
    		int deplaY = Math.abs(ligne - this.ligne);
    		
    		if(Principal.maF.pieceEchec[ligne][colonne] == null){
    			if(deplaY == deplaX){
    				peutAller = true;
    			}
    		}
    		else{
    			peutAller = mange(ligne,colonne);
    		}
    		return peutAller;
    	}

    Deplacement de la reine

    @Override
    	public boolean deplacement(int ligne, int colonne) {
    		boolean peutAller = false;
    		
    		int deplaX = Math.abs(colonne - this.colonne);
    		int deplaY = Math.abs(ligne - this.ligne);
    		
    		if(Principal.maF.pieceEchec[ligne][colonne] == null){
    			if(deplaY == deplaX){
    				peutAller = true;
    			}
    			else if(ligne < 8 && colonne == this.colonne || ligne == this.ligne && colonne < 8){
    				peutAller = true;
    			}
    		}
    		else{
    			peutAller = mange(ligne, colonne);
    		}
    		return peutAller;
    	}



    • Partager sur Facebook
    • Partager sur Twitter
      22 novembre 2014 à 11:33:24

      Bonjour,

      Pour éviter le problème, il faut que tu ajoutes une boucle, et que tu testes toutes les cases entre le point de départ et le point d'arrivée :

      si case_occupée() alors renvoyer faux

      Il y a un autre point très surprenant dans tes 2 portions de code : Par exemple, pour le fou, si le point visé n'est pas sur une des 2 diagonales, alors tu exécutes une procédure  mange ( ligne, colonne)

      Surprenant.

      • Partager sur Facebook
      • Partager sur Twitter
        22 novembre 2014 à 11:39:54

        Bonjour et merci pour ta réponse rapide.

        J'avais déja ajouter une conditions si une case entre mon point de départ et mon point d'arrivé etait différent de null, de renvoyer faux.

        Mais le calibrage de cette conditions ma poser enormement de problème;

        Pour l'appel à la methode mange, cette dernière est appelé uniquement si ma case visé contient un objet, ainsi mon déplacement devint une méthode pour manger. Mais je suis preneur de tes suggestions, que trouve tu d'etrange?

        Merci.

        • Partager sur Facebook
        • Partager sur Twitter
          22 novembre 2014 à 16:25:03

          Ce que je trouve bizarre, c'est que si la case visée est sur une diagonale par rapport à la case de départ, tu renvoies vrai, sans tester si la case visée est vide, occupée par une pièce de mon camp ou occupée par un pièce adverse.

          Et si la case visée n'est pas sur une des 2 diagonales, alors tu exécutes cette fameuse fonction mange.

          J'aurais fait exactement l'inverse.

          -
          Edité par tbc92 22 novembre 2014 à 16:33:26

          • Partager sur Facebook
          • Partager sur Twitter
            22 novembre 2014 à 18:09:59

            Je n'ai aucun soucis avec cette conditions, tu va peut être me trouver bete, mais je ne vois pas l'erreur.

               SI ma case visé est null..

                    Si mon deplacement est conforme en x & y

                         Alors tu peut te deplacer

                    Fin si

              SINON (Si ma case n'est pas null)

                        Alors regarde si tu  peut  aller la manger

            • Partager sur Facebook
            • Partager sur Twitter
              23 novembre 2014 à 9:59:40

              J'aurais deux solutions. La plus simple, ce serait de faire deux méthodes
              deplacementValide(posInitiale, posFinale)
              et
              deplacementValide(posInitiale, posFinale)
              qui retourneraient un booléen si le trajet n'est pas occupé et si la case finale est valide (vide pour un déplacement et occupée par une pièce de couleur opposée pour les prises).

              La deuxième, c'est une soultion plus Orientée Objet. Dans la classe Piece, tu ajoutes deux méthodes abstraites,
              getDeplacements() et getPrises() qui retournent la liste des coups valides pour la piece qui appelle ces méthodes. Ensuite, tu surcharges la méthode dans chacune des classes filles (Pion, Tour, etc). Mais encore faut-il que tu aies programmé ton jeu dans un style Orienté Objet pour ça.
              • Partager sur Facebook
              • Partager sur Twitter
                23 novembre 2014 à 10:35:17

                Thibaut Ridel a écrit:

                Je n'ai aucun soucis avec cette conditions, tu va peut être me trouver bete, mais je ne vois pas l'erreur.

                   SI ma case visé est null..

                        Si mon deplacement est conforme en x & y

                             Alors tu peut te deplacer

                        Fin si

                  SINON (Si ma case n'est pas null)

                            Alors regarde si tu  peut  aller la manger


                Bonjour,

                Exact, j'avais mal lu; 

                J'avais lu : 

                If  meme_diagonale  then  (...)  else mange ()

                La base que tu proposes peut te mener à une solution correcte. Mais tu vas devoir programmer à nouveau le contrôle de validité du mouvement ( même diagonale) dans la fonction mange() ; c'est donc une organisation pas idéale. 

                • Partager sur Facebook
                • Partager sur Twitter

                Probleme collisions- 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