Aide concernant la réalisation d'une application

Résolu/Fermé
bountybob261 Messages postés 5 Date d'inscription samedi 18 juin 2016 Statut Membre Dernière intervention 22 août 2016 - Modifié par Chris 94 le 31/08/2016 à 15:10
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 - 30 août 2016 à 07:46
Bonjour à tous,
Il y a peu de temps j'ai décidé de créer un jeu (très basique) ou une machine doit trouver le nombre que l'utilisateur a choisi en un minimum d'étapes . elle propose des nombres (ex :50) et l'utlisateur indique si c'est plus ou moins et elle repropose un nombre

>Si c'est moins le nombre sera compris entre 0 et 50
>Si c'est plus le nombre sera compris entre 50 et 100

Cependant j'ai rencontré un problème dans mon calcul. Les résultats obtenus dans chaque boucles ne sont pas réutilisé pour définir les max/ min de l'intervalle dans lequel le prochain nombre sera généré. C'est très génant car lorsque j'indique plus puis moins au lieu de garder la dernière valeur qui était associé au "plus" la machine ignore se nouveau maximum et vice versa.

Voici mon code:



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace akinanombre
{
    class Program
    {

        static void Main(string[] args)
        {
            int xMax = 100;
            int xMin = 0;
            int xRes = (xMax - xMin) / 2;
            
            


            Console.WriteLine("Bienvenue dans akinanombre");
            Console.WriteLine("Choisi un nombre entre 1 et 100... c'est fait?");
            Console.WriteLine("Et dès que je l'ai trouvé dis moi <<tu as trouvé>>");
            Console.WriteLine("Si tu es prêt? Tape YES!");

            string caracpris = Console.ReadLine();

            string reponseattendu = "YES";

            bool areEqual = String.Equals(caracpris, reponseattendu, StringComparison.Ordinal);
            while (areEqual == false)
            {
                Console.WriteLine("es tu sur?");
                caracpris = Console.ReadLine();
                reponseattendu = "YES";
                areEqual = String.Equals(caracpris, reponseattendu, StringComparison.Ordinal);
            }

            Console.WriteLine(xRes);


            string readline = Console.ReadLine();
            
            string cbn = "tu as trouvé";
            bool findujeu = String.Equals(readline,cbn, StringComparison.Ordinal);

            while (findujeu == false) // boucle de la fin du jeu tant que pas eu de tu as trouvé on continu
            {
                Console.WriteLine("réécris le encore une fois");
                string Nbplmn = Console.ReadLine();
                string Nbattendu = "moins";
                bool Equal = String.Equals(Nbplmn, Nbattendu, StringComparison.Ordinal);


                if (Equal == true) // si utilisateur écrit moins
                {
                    xRes = xRes - ((xRes + xMin) / 2);
                    Console.WriteLine(xRes + " c'est ça?");
                   
                }
               
                else // sinon c'est plus
                {
                    xRes = ((xMax - xRes) / 2) + xRes;
                    Console.WriteLine(xRes + " c'est ça?");
                    
                }   
                    cbn = "tu as trouvé";
                    findujeu = String.Equals(readline, cbn, StringComparison.Ordinal);
                    readline = Console.ReadLine();
                
            }

                

        }

    }
}

5 réponses

Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 928
30 août 2016 à 00:00
Bonsoir

tout d'abord
            Console.WriteLine("Si tu es prêt? Tape YES!");

            string caracpris = Console.ReadLine();

            string reponseattendu = "YES";//dans l'absolue cette variable ne sert à rien, elle n'est utilisée qu'une fois avec cette valeur avant "réaffectation"

            bool areEqual = String.Equals(caracpris, reponseattendu, StringComparison.Ordinal);
            while (areEqual == false)
            {
                Console.WriteLine("es tu sur?");
                caracpris = Console.ReadLine();
                reponseattendu = "YES";// tu réafffeactes avec la valeur déjà présente...
//en plus tu demandes si le joueur est sûr, de ne pas être prêt? pas très logique
                areEqual = String.Equals(caracpris, reponseattendu, StringComparison.Ordinal);
            }


Ici
bool areEqual = String.Equals(caracpris, reponseattendu, StringComparison.Ordinal);


Quel est l'intérêt de te compliquer la vie? pour quoi un Eqals, pourquoi une comparaisons Ordinale?

caracpris != reponseattendu
ne te suffit pas?

Et pour conclure sur cette partie du code, tu as écrit deux fois la même chose.
Donc en cas d'erreur, il te faudra la corriger deux fois.
En programmation, on cherche à éviter ça, en utilisant une méthode, un objet (C# est un langage tout objet...) ou au pire en écrivant judicieusement la boucle

            string caracpris;
            do
            {
                Console.WriteLine("Si tu es prêt? Tape YES!");
                caracpris = Console.ReadLine();
            } while (caracpris != "YES")


ou encore mieux, en laissant à l'utilisateur la possibilité de répondre en minuscule
            string caracpris;
            do
            {
                Console.WriteLine("Si tu es prêt? Tape YES!");
                caracpris = Console.ReadLine();
            } while (string.Compare(caracpris, "YES",true) != 0);
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 928
Modifié par Whismeril le 30/08/2016 à 00:33
Dans les instructions, tu as oublié de dire qu'il faut répondre plus ou moins
Ensuite "tu as trouvé" est trop compliqué il y aura forcément des erreurs de frappe, oui ou ok suffisent

Pour "trier" les réponses de l'utilisateur, tu peux faire un switch

            int xMax = 100;
            int xMin = 0;//déjà dans les instructions c'est de 1 à 100 pas de 0 à 100...
            int nbCoups = 0;
            bool onContinue = true;

            do
            {
                nbCoups++;
                int xRes = (xMax + xMin) / 2;
                Console.WriteLine(string.Format("Est-ce {0}? si oui tape OK, sinon tape + ou -",xRes));

                switch(Console.ReadLine())
                {
                    case "+":
                        xMin = xRes;//c'est plus donc le résultat proposé devient le nouveau minimun
                        break;

                    case "-":
                        xMax=xRes;//inversement
                        break;

                    case "OK":
                    case "ok":
                    case "oK":
                    case "Ok"://j'ai mis les 4 possibilités juste pour te montrer que ça existe
                        Console.WriteLine(string.Format("J'ai trouvé en {0} coups", nbCoups));
                        Console.ReadLine();
                        onContinue = false;
                        break;

                    default://toute autre réponse
                        Console.WriteLine("Réponse non attendue");
                        //comme là le programme va refaire la même proposition, on enlève un coup qui sera ajouté à la prochaine itération
                        nbCoups--;
                        break;
                }
            }while(onContinue);



Quand j'étais petit, la mer Morte n'était que malade.
George Burns
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 928
Modifié par Whismeril le 30/08/2016 à 00:30
Et là tu constateras que ton problème est résolu, mais en soit ça n'est pas un problème de programmation, mais de math.

La moyenne entre un min est un max c'est (min + max)/ 2...

Ce que tu aurais très vite vu en exécutant le code en pas à pas, la base du débogage....

Quand j'étais petit, la mer Morte n'était que malade.
George Burns
0
Bountybob261
30 août 2016 à 02:33
Vraiment je te remercie tu m'as montré une manière de faire que j'ignorais totalement! Et oui je me suis rendu compte qu'il fallait faire xmin + xmax mais seulement le lendemain :/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 928
30 août 2016 à 07:46
de rien
0