Réponse acceptée !
Beaucoup de soucis dans ton code. J'ai retiré les choses inutiles.
- Évite absolument les variables globales !
- Inutile de faire des std::cout de partout. Un seul suffit, et tu mets tout ce que tu as à mettre directement à le suite.
- Tu peux déclarer tes variables au moment où tu les utilises (très pratique pour les boucles).
- Inutile de faire un tableau pour stocker des valeurs que tu connais déjà.
- Découpe ton code en petite fonction. On évite de mettre beaucoup de chose dans un main.
- Si tu poses une question, et qu'une lettre est attendue, c'est plus sympas de ne pas prendre en compte la casse (minuscule ou majuscule).
- Enfin, pourquoi demander à un utilisateur s'il veut jouer ? S'il lance l'exécutable c'est qu'il le veut, inutile de lui redemander à chaque fois.
Pour ton bug, il vient du fait que la sortie est bufferisée. Il faut donc la nettoyer sinon elle garde tout en mémoire et retente en boucle de faire passer les valeurs entrées.
Il suffit d'appeler .clear() puis .ignore(). Je t'ai fais une fonction clear() a appeler après std::cin pour garantir que ce comportement ne se fera plus.
Correction:
Code C/C++ :
#include <iostream>
#include <limits>
void clear(std::istream& in)
{
in.clear();
in.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
void son()
{
// Beep(523,50);
// Beep(587,50);
// Beep(659,50);
// Beep(698,50);
// Beep(784,500);
}
void son1()
{
for(int i = 0; i < 20; ++i)
{
// Beep(100*i,50);
}
}
void afficher()
{
std::cout << "Choix de la table dans la liste suivante:" << std::endl;
for (int i = 10; i > 0; --i)
{
std::cout << i;
if (i != 1)
std::cout << " | " ;
}
std::cout << std::endl;
}
int jeu(int c)
{
int res;
int faute = 0;
for (int i = 1; i <= 10; ++i)
{
do
{
std::cout << c << " x " << i << " = ";
// Beep(1000,50);
std::cin >> res;
clear(std::cin);
if (res != c * i)
{
std::cout << "Mauvaise reponse\n";
son();
++faute;
}
}
while (res != c * i);
}
return faute;
}
int askTable()
{
int table = 0;
while (table < 1 || table > 10)
{
std::cout << "Entrez la table:";
std::cin >> table;
clear(std::cin);
if (table < 1 || table > 10)
std::cout << "La table doit être comprise entre 1 et 10" << std::endl;
}
return table;
}
void jouer()
{
std::cout << "Entre les reponse puis valide par entree" << std::endl
<< "Es-tu pret pour commencer ?\n";
son();
int table = askTable();
int faute = jeu(table);
std::cout << std::endl << "note : " << 10 - faute << "/10" << std::endl;
son1();
}
bool menuJouer()
{
char c;
std::cout << "Jeu de calcul\nVoulez vous commencer le jeu (O ou N) ";
std::cin >> c;
clear(std::cin);
while (true)
{
switch (c)
{
case 'N':
case 'n':
std::cout << "Vous avez choisi de ne pas jouer\nAu revoir et a bientot!!\n";
son1();
return false;
case 'O':
case 'o':
std::cout << "Vous avez choisi de jouer tres bien !! \n";
return true;
default:
std::cout << "Tapez O ou N : ";
std::cin >> c;
clear(std::cin);
break;
}
}
}
int main()
{
// Je retirerais cela, très ennuyant pour un utilisateur.
if (!menuJouer())
return 1;
jouer();
// system ("pause");
return 0;
}
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question