Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème pour un projet !

    5 décembre 2005 à 15:34:14

    Bonjour à tous !

    J'en profite pour faire un coucou a la communauté car je viens de m'enregistrer :)

    Alors voilà, J'ai un projet à faire pour mon cours de Programmation à l'université. Ce projet consiste à créer un jeu : "Puissance 4" je ne sais pas si vous connaissez ;)

    Dont voici le début :

    #include <iostream>
    #include <math.h>
    #include <stdlib.h>
    #include <time.h>
    using namespace std;
    const int Taille = 7;
    /////////////////////////////////////////////////////////////////
    int NombreAlea() // Choisi un nombre aléatoire
    {
    int j;
    j = 1 + (int) ( 7.0 * (rand() / (RAND_MAX + 1.0)));
    return j;
    }
    //////////////////////////////////////////////////////////////////
    void Coup_Gagnant ( int TDeJeu[Taille][Taille] , int Player, bool &fin)
    {
    }   
    //////////////////////////////////////////////////////////////////
    void SwapPlayer( int &player ) // Fonction qui change de joueur à chaque tour
    {
    if ( player == 1 )
        player = 2 ;
    else
        player = 1 ;
    }
    //////////////////////////////////////////////////////////////////
    void AfficheTDeJeu ( int TDeJeu [Taille][Taille] )
    {
    for ( int i=0 ; i < Taille ; i++ )
      {
         cout << i+1 << "|| ";
         for ( int j=0 ; j < Taille ; j++ )
             cout << TDeJeu [i][j] << " ";
         cout << "|" << endl;
      }
    cout << "  + - - - - - - - +"<<endl;
    cout << "   " << " 1 2 3 4 5 6 7"<<endl<<endl;
    }
    ///////////////////////////////////////////////////////////////////////////////////////////
    bool Test_Win ( int TDeJeu[Taille][Taille], int Player )
    {
    bool res = false;
    int compteurVer=0, compteurHor=0, CompteurObl_1=0, CompteurObl_2=0 ;
    for ( int i=0 ; i < Taille && res == false; i++ )
        for ( int j=0 ; j < Taille && res == false ; j++ )
         {
           for ( int Dec=0 ; Dec < 4 ; Dec++ )
            {
              if ( i < 4 )
                 if ( TDeJeu[i+Dec][j] == Player )
                    compteurVer++;
              if ( j < 4 )
                 if ( TDeJeu[i][j+Dec] == Player )
                    compteurHor++;
              if ( i < 4 && j < 4 )
                 if ( TDeJeu[i+Dec][j+Dec] == Player )
                    CompteurObl_1++;
              if ( i < 4 && j > 2 )
                 if ( TDeJeu[i+Dec][j-Dec] == Player )
                    CompteurObl_2++;
              else
                ;
            }
           if ( compteurVer == 4 || compteurHor == 4 || CompteurObl_1 == 4 || CompteurObl_2 == 4 )
              res = true;
           else
              res = false;
           compteurVer=0;
           compteurHor=0;
           CompteurObl_1=0;
           CompteurObl_2=0;

         }
    return res;
    }

    //////////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////
    int main()
    {
    srand ( time(NULL));
    bool fin = false;
    int TDeJeu [Taille][Taille];
    char Arret = 'Z';
    int Colonne, compteur, player=1;
    for ( int i=0 ; i < Taille ; i++ )
        for ( int j=0 ; j < Taille ; j++ )  // initialisation de la table de jeu.
           TDeJeu [i][j] = 0;
    AfficheTDeJeu ( TDeJeu );
    do
    {
       compteur = 0;
       if ( player == 1 )
        {
           cout << " ! A VOUS D'JOUER ! " <<endl;
           cin >> Colonne;
           while ( TDeJeu [compteur+1][Colonne-1] == 0 && compteur < 6 )
           {
               compteur++;
           }
           TDeJeu [compteur][Colonne-1] = player;
           if ( Test_Win( TDeJeu , player ) == true )
            {
              Arret = 'W';
              cout << " ! YOU WIN ! " << endl<< endl;
            }
           else
              ;
        }
       else
        {
            cout << " L'ORDINATEUR JOUE " <<endl;
            Coup_Gagnant( TDeJeu , player, fin );
            if ( fin == false )
             {
                Colonne = NombreAlea ();
                while ( TDeJeu[compteur+1][Colonne-1] == 0 && compteur < 6 )
                  {
                     compteur++;
                  }
                TDeJeu [compteur][Colonne-1] = player;
             }
            if ( Test_Win(TDeJeu,player)==true )
             {
               Arret = 'W';
               cout << " ! YOU LOSE ! " << endl<< endl;
             }
            else
               ;
        }
      AfficheTDeJeu ( TDeJeu );
      SwapPlayer( player );
    }
    while ( Arret != 'W' );
    cin >> Arret;
    }
    /////////////////////////////////////////////////////////////////////////////////////////////


    J'ai déjà fait un fonction pour changer de joueur a chaque tour, une fonction pour tester si un des 2 joueur à gagner et une pour afficher la table de jeu ( TDeJeu ==> (7X7) )

    Comme vous pouvez le voir, je dois encore trouver un moyen de créer une "IA" qui permettrais à l'ordinateur de :

    1) Si un coup gagnant peut être éffectué, il le sera.
    2) Si un coup permet d'empecher l'adverssaire de gagner, il sera effectué
    3) Si un coup permet a l'ordinateur de bloquer le joueur, il sera effectué.

    Si ces 3 cas ne sont pas rempli, l'ordinateur choisi une colonne au hasard ( doù la présence de la fonction "NombreAlea".

    Je dois rendre mon projet mercredi et je trime depuis vendredi pour trouver une solution ! Je ne vous demande pas de me donner un code et puis comme ca, c'est fini mais de me mettre sur les rails, ca serait vraiment très gentil !

    Si vous avez des questions sur des choses ke vous ne comprenez pas, faites-le moi savoir :)

    Merci d'avance ! et bonne continuation au site !

    • Partager sur Facebook
    • Partager sur Twitter
      5 décembre 2005 à 18:21:01

      ehhh desole d'etre mechant, mais si tu est la pour avoir un code tu en trouve des deja fait sur le net, et de plus si c'est pour un tuyeaux, va sur

      www.candiulb.be

      Sincerment, je te dirait que ca, tu a deja une fonction pour regarder la victoire,
      maintenant dit toi que tu doit, lui faire chercher un coup pour gagner.

      Cela veut dire quoi, que apres son coup joue, il a gagne.(regle 1)

      Regle 2, viceversa, tu regarde ceux que il fait, et si tu voit que en joaut en colonne x il gagne, tu te dit je doit pas y jouer (meme fonction de victoire)

      regle 3, ici plus complexe^^ tu doit regarder 2 coup a l'avance, et voir si cela te fait gagner ou pas.

      C'est pas si dure, suffit de la bonne volonte, mais je trouve decevant de demander un code, sortout que on a une superbe communeaute sur candiulb, avec des gens de l'ULB^^

      Voila je dit rien d'autre, mon projet est pret^^ (bref dans les limites^^)
      • Partager sur Facebook
      • Partager sur Twitter
        5 décembre 2005 à 22:03:35

        Pour voir si c'est gagnant, j'ai fait cela :

        void Coup_Gagnant ( int TDeJeu[Taille][Taille] , int Player, bool &fin)
        { 
           fin = false;
           int Colonne,compteur;
           for ( int i=0 ; i < Taille && fin == false; i++ )
               for ( int j=0 ; j < Taille && fin == false ; j++ )
                {   
                   if ( TDeJeu [i][j] == 0 )
                    {
                        TDeJeu [i][j] = 2;
                        if ( Test_Win ( TDeJeu , Player ) == true )
                            fin = true;
                        else
                            TDeJeu [i][j]= 0;
                    }
                }
           
            if ( fin == false )
            {
                Colonne = NombreAlea ();
                while ( TDeJeu[compteur+1][Colonne-1] == 0 && compteur < 6 )
                      {
                         compteur++;
                      }
                TDeJeu [compteur][Colonne-1] = Player;
            }       
        }


        Donc, en gros, je remplace toutes les valeurs du tableau par 2 ( qui est le pion de l'ordinateur ) Et je test : si quand je remplace par 2, est ce que il gagne ou pas ... Si oui, il laisse le 2. si non, il remet un 0.

        Cette fonction me semble bonne mais pourtant lorsque je l'exécute, elle plante ! et je ne sais pas pourquoi ! Ca serait gentil de m'aider ... :)

        ps : la fonction : Test_Win ( ... ) sers a savoir si il a gagné ou pas ;)

        merci d'avance
        • Partager sur Facebook
        • Partager sur Twitter
          6 décembre 2005 à 12:13:53

          UP !

          J'ai trouvé les cas 1 et cas 2 !!

          Merci pour votre aide ... :s

          et pour répondre a celui qui ma "répondu", je ne demandais pas du code mais un chemin pour m'aider ! Si tu avais tout lu, tu aurais compris ! La prochaine fois, lis avant d'accuser ;) merci

          ciao a toté
          • Partager sur Facebook
          • Partager sur Twitter
            6 décembre 2005 à 12:26:54

            Le problème de ton IA, c'est qu'elle serait imbattable :lol:
            Mais bon, du moment que tu as fait ce qu'on te demandait ça va :)
            • Partager sur Facebook
            • Partager sur Twitter
              6 décembre 2005 à 17:28:13

              Mmmm j'ai lu j'ai lu ;) et je t'ai donne un tuyaux, mais utilise candiulb.be, tu aurait trouve des reponses a tes question

              Sinon elle est jamais imbattable, j'ai joue contre l'IA d'un ami (fait par recurrence etc etc) et je l'ai battu en 26 coup (elle prevoyait a 8 coup d'avance)

              Pour la rendre imbattable fau bien plus que les ~400 ligne que on a pour ce projet
              • Partager sur Facebook
              • Partager sur Twitter
                6 décembre 2005 à 21:32:14

                C'est ce qu'on me demandait ! alors j'lai fait :)
                • Partager sur Facebook
                • Partager sur Twitter

                Problème pour un projet !

                × 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