slt! j'aimerai faire 1 pti jeu en c++ (en console) dans lequel le joueur devra saisir un mot et je voudrai limiter son temp jeu, genre le programme s'arrete s'il n'a pas pu saisir le mot a temp! comment faire svp?
Version imprimable
slt! j'aimerai faire 1 pti jeu en c++ (en console) dans lequel le joueur devra saisir un mot et je voudrai limiter son temp jeu, genre le programme s'arrete s'il n'a pas pu saisir le mot a temp! comment faire svp?
Salut
À mon avis, le plus propre est d'utiliser des threads interruptibles. Ceux de la STL ne conviennent pas mais ceux de boost oui.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include <boost/chrono.hpp> #include <boost/thread/thread.hpp> #include <iostream> int main() { std::string reponse; auto lireReponse = [&reponse] () { std::getline(std::cin, reponse); }; boost::thread th(lireReponse); if (not th.try_join_for(boost::chrono::seconds(5))) { std::cout << "\ntrop tard..." << std::endl; exit(-1); } std::cout << "\nreponse lue : " << reponse << std::endl; return 0; }
bsr! stp pourrais-tu expliquer en détails? je suis un peu perdu, je débute en programmation .
Il n'est nul besoin de sortir boost si le but est que le thread à côté arrête le programme :calim2:
C'est typiquement un truc que la console rend galère à mettre en place par son aspect bloquant sur les inputs. :?Code:
1
2
3
4
5
6
7
8
9
10
11 #include <thread> #include <iostream> int main() { std::thread th([&](){ std::this_thread::sleep_for(std::chrono::seconds(5)); std::cout << "timeout !" << std::endl; exit(-1); }); std::cout << "taper un mot : "; char c; std::cin >> c; std::cout << "lettre : " << c << std::endl; exit(0); }
Bonjour,
Je suggère donc de passer la console en mode brut.
@bousk: oui, cette solution fonctionne bien dans ce cas simple mais si tu as besoin de faire quelque chose qui prend un peu de temps après la saisie ou de faire une deuxième saisie, ça ne fonctionne plus. Même pour un jeu simple, j'imagine qu'il y aura plusieurs saisies en boucle, d'où l'idée des threads interruptibles.
@Cedric21: par défaut, la saisie clavier (getline ou >>) est bloquante donc la fonction principale (main) ne peut pas demander une saisie et en même temps compter 5s. Donc l'idée est de faire la saisie (lireReponse) dans un thread séparé (th) comme ça on peut mesurer le temps en parallèle dans le thread principal. La méthode try_join_for permet d'attendre la fin du thread de saisie ou de l'interrompre au bout d'un temps donné; un booléen est retourné pour indiquer quel cas s'est produit.