Aide concernant la réalisation d'une application
Résolu
bountybob261
Messages postés
5
Date d'inscription
Statut
Membre
Dernière intervention
-
Utilisateur anonyme -
Utilisateur anonyme -
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:
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(); } } } }
A voir également:
- Aide concernant la réalisation d'une application
- Nommez une application d'appel vidéo ou de visioconférence - Guide
- Comment supprimer une application préinstallée sur android - Guide
- Desinstaller une application sur windows - Guide
- Windows application démarrage - Guide
- Miroir application - Guide
5 réponses
Bonsoir
tout d'abord
Ici
Quel est l'intérêt de te compliquer la vie? pour quoi un Eqals, pourquoi une comparaisons Ordinale?
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
ou encore mieux, en laissant à l'utilisateur la possibilité de répondre en minuscule
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 != reponseattendune 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);
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
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
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
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
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
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 :/
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question