Partage
  • Partager sur Facebook
  • Partager sur Twitter

TD Morpion - recherche gagnant

problème d'algorithme

    20 janvier 2019 à 16:41:19

    Bonjour,

    Je travaille sur un TD morpion pour ma formation et je bloque un peu sur la méthode qui permet de trouver un gagnant.

    La version du morpion sur laquelle on travaille est évolutive avec une grille n*n et il faut aligner 5 pions pour gagner.

    Pour le moment, j’ai une première méthode rechercherAlignement() qui recherche un alignement de pions du joueur courant.

    La méthode rechercherAlignement() est appelée par une méthode coupGagnant() qui recherche après chaque coup, un alignement de pions du joueur courant dans toutes les directions (8 directions) à partir de la position du dernier pion joué.

    Cet algo ne me détecte pas toutes les combinaisons gagnantes :

    exemple 1 : dernier position jouée (3,3) → gagnant non détecté

    [ x ] [ O] [ x ] [ O] [ O] [ O]

    [ O] [ x ] [ x ] [ O] [ x ] [ O]

    [ O] [ O] [ x ] [ x ] [ O] [ O]

    [ O] [ O] [ O] [ x ] [ x ] [ O]

    [ O] [ O] [ x ] [ O] [ x ] [ x ]

    [ O] [ O] [ O] [ O] [ O] [ O]

    exemple 2 : dernier position jouée (4,4) → gagnant détecté

    [ x ] [ O] [ x ] [ O] [ O] [ O]

    [ O] [ x ] [ x ] [ O] [ x ] [ O]

    [ O] [ O] [ x ] [ x ] [ O] [ O]

    [ O] [ O] [ O] [ x ] [ x ] [ O]

    [ O] [ O] [ x ] [ O] [ x ] [ x ]

    [ O] [ O] [ O] [ O] [ O] [ O]

    Je ne vois pas trop comment faire sans multiplier les tests tout autours de la dernière position jouée.

    d’avance merci de votre aide.

    boolean coupGagnant(int x, int y) {
    
      //case courante = dernier pion joué 
      int ligne = x;
      int colonne = y;
    
      //boucle sur les tableaux de déplacements pour faire une recherche
      //dans toutes les directions de la dernière case jouée
      for (int i=0; i<8; i++) {
        //case de départ --> dernier coup joué
        //on stocke le nombre de pions alignés dans chaque direction
        alignement[i] = rechercherAlignement(ligne, colonne, DEP_COL[i], DEP_LIG[i]);
        //println("Nombre de pions alignés direction "+i+": "+alignement[i]);
        
        //Vérification des conditions pour gagner
        if (alignement[i]>=5) {
          println("Joueur "+joueurCourant+" gagnant");
          //textSize(24);
          //textAlign(CENTER, CENTER);
          //text("Joueur "+joueurCourant+" gagnant", 400, 50);
    
          return true;
        }
      }
      return false;
    }
    
    int rechercherAlignement(int x, int y, int depX, int depY) {
    
      int ligne = x;
      int colonne = y;
      int nombreAlignes = 0;
      
      //On récupère la liste des cases composant l'alignement pour 
      //éventuellement le ré-afficher
      //ArrayList<Integer> listeCases = new ArrayList<>();
    
      //5 == au nombre de pion qui doivent être alignés pour gagner
      for (int i=0; i<5; i++) {
        //si la case correspond à un pion du joueur courant
        //on incrémente le compteur
    
        //on teste que l'on est dans la grille
        if (ligne>=0 && ligne<nbCases && colonne>=0 && colonne<nbCases) {
          if (tableau[ligne][colonne]==joueurCourant) {
            nombreAlignes++;
            //sinon, on réinitialise le compteur
          } else {
            nombreAlignes=0;
          }
          //deplacement depuis la position du dernier pion joué
          //utiliser le tableau des déplacements en X et Y
          colonne+=depX;
          ligne+=depY;
        }
      }
      ligne = 0;
      colonne = 0;
      return nombreAlignes;
    }



    • Partager sur Facebook
    • Partager sur Twitter
      20 janvier 2019 à 17:08:38

      Bonjour,

      En fait, tu as juste 4 directions. Horizontale, verticale et deux diagonales.

      Après, pour une direction donnée, tu dois compter le nombre de pions avant et après la position jouée.

      • Partager sur Facebook
      • Partager sur Twitter
        20 janvier 2019 à 17:20:53

        bonjour

        merci de ta réponse

        c'est ce que j'avais fais au départ (recherche alignement de 2 + 2 dans 2 directions opposées)

        mais le problème reste le même il me semble

        • Partager sur Facebook
        • Partager sur Twitter
          20 janvier 2019 à 18:20:26

          Non, ça doit être entre -4 et +4, sachant qu'on doit s'arrêter dès qu'on sort de la grille ou si on n'a pas un pion de la même couleur.
          • Partager sur Facebook
          • Partager sur Twitter
            20 janvier 2019 à 18:54:29

            c'est que je fais actuellement...
            • Partager sur Facebook
            • Partager sur Twitter

            TD Morpion - recherche gagnant

            × 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