Lecture d'une chaine avec comptes a rebours

Fermé
m_bess Messages postés 6 Date d'inscription samedi 12 mars 2016 Statut Membre Dernière intervention 19 décembre 2017 - 3 nov. 2016 à 15:14
tarek_dotzero Messages postés 817 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 12 avril 2022 - 15 nov. 2016 à 22:07
Bonjour,

Donc je veux faire une application java avec eclipce pour créer en fait le jeu Motus ou presque..
et mon application n'a pas le coté graphique vue qu'on n'a pas encore étudié les interfaces et les graphiques .
et je me bloque justement dans la partie ou le joueur doit saisir un mot dans un délais de 8 secondes. J'ai essayé avec system.currentTime() mais je n'arrive pas à l'appliquer correctement.
voulez-vous bien me monter un ptit code pour la lecture de la chaine?

1 réponse

Utilisateur anonyme
3 nov. 2016 à 20:21
Salut,

Est-ce que tu es à l'aise avec les Threads ?
0
m_bess Messages postés 6 Date d'inscription samedi 12 mars 2016 Statut Membre Dernière intervention 19 décembre 2017
3 nov. 2016 à 23:11
je viens de lire le cours de Threads dans OpenClassrooms et j'ai une ptite idée de ce qu'est un thread
0
Utilisateur anonyme
4 nov. 2016 à 19:40
L'idée serait de lancer un Thread avant de demander à l'utilisateur quoi que ce soit. Ce Thread ferait une boucle tant que l'utilisateur n'a pas fait son choix. Chaque tour de boucle, le Thread attend 1s (
tonthread.wait(1000)
). Il y a peut-être moyen de faire mieux : récolter la date avant de demander à l'utilisateur son choix, lancer le thread qui sera chargé à chaque tour de boucle de récolter la nouvelle date, faire la différence avec la date initiale.

Dans les deux cas, tu peux savoir si ça fait 8s ou moins que l'utilisateur fait son choix.
Si ça fait moins de 8s, le thread s'arrête tout seul (sortie de boucle). Sinon, il faudra gérer ça (arrêt du programme ?)
0
m_bess Messages postés 6 Date d'inscription samedi 12 mars 2016 Statut Membre Dernière intervention 19 décembre 2017
15 nov. 2016 à 20:52
Je m'excuse pour ma réponse tardive.
Donc voila j'ai testé plusieurs codes et lu plusieurs cours avec ma binôme et voila où nous sommes arrivés

classe Timer:
import java.util.concurrent.atomic.AtomicBoolean;

public class Timer extends Thread{

public void run() {
long time=0L;
while (! isInterrupted())
{
time = System.currentTimeMillis();
try
{
// 8 secondes d'attente
Thread.sleep(8000);
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();

break;
}
System.out.println("temps ecoulé");
break;
}


}

}


class lire:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Scanner;
import java.util.concurrent.atomic.AtomicBoolean;

public class Lire extends Thread
{
private String nom ="motatester";
public static String chaine() throws InterruptedException
{
String tmp = "";
char C='\0';
try
{
while ((C=(char) System.in.read()) !='\n')
{
if (C !='\r')
{
tmp = tmp+C;
}}}
catch (IOException e)
{
System.out.println("Erreur de frappe");
System.exit(0);
}
return tmp;
}
public static String chaine2(){
Scanner s =new Scanner (System.in);
String tent =s.next();
return tent;
}
public boolean TestChaine(String ch){
boolean res;
if (ch.equals(nom)){
System.out.println("Bravo! Le mot est correct");
res=true;}
else res=false;
return res;
}
}


et la class Main:



import java.io.InputStream;
import java.util.Scanner;
import java.util.concurrent.atomic.AtomicBoolean;

public class Main {

public static void main(String[] args) throws Exception{
AtomicBoolean resultat = new AtomicBoolean();
Lire l =new Lire ();
String tentative;
int i=1;
Boolean stop =false;
while (i<=5 && stop==false ){
System.out.println("la valeur de i est "+" " +i);
Unthread th=new Unthread();
th.start();
System.out.println("Saisir votre mot !");
tentative=l.chaine();//saisie
if (l.TestChaine(tentative))
{
stop=true;
break;
}
th.interrupt();
th.join();

if (i<5 )
System.out.println("Le mot est incorrect ! passons a la "+" "+(i+1)+" "+" ème tentative");
i=i+1;

}
}
}


mon problème est : en faisant l'exécution à chaque tentative si j'entre rien et le temps est écoulé le programme ne passe pas a la ième tentative et il faut que je tape quelque chose au clavier pour qu'il passe à la tentative suivante .

Je veux simplement que si aucun mot est entré et si le temps est écoulé il passe tout seul à la tentative suivante .

j'ai utilisé System.in.read() pour la saisie du mot et cette méthode permet de lire seulement un caractère alors j'ai opté pour une classe Lire qui utilise cette méthode afin de lire toute une chaine
0
Utilisateur anonyme
15 nov. 2016 à 21:35
J'avoue que là, je suis en manque d'idée ...
0
tarek_dotzero Messages postés 817 Date d'inscription jeudi 19 juillet 2007 Statut Membre Dernière intervention 12 avril 2022 121
15 nov. 2016 à 22:07
Bonjour,

Continuons avec la même idée mais avec une petite différence : la lecture se fait dans un thread contrôlé.
Dans le code que vous citez, le pauvre Thread Timer n'a aucune puissance et aucun contrôle sur la lecture qui est bloquante (elle bloque l'excution) alors il faut lui donner un peu de pouvoir, si vous mettez le code de lecture dans un thread contrôlé par le Timer, il peut l'arrêter au bout de 8 secondes :

public class Timer extends Thread{ 

public void run() {	
long time=0L; 
while (! isInterrupted()) 
{ 
time = System.currentTimeMillis(); 
try 
{
// ThreadLecture par exemple pour le thread qui lit 
 ThreadLecture lire = new ThreadLecture();
lire.start();
Thread.sleep(8000); 
lire.stop();
} 
catch (InterruptedException e) 
{ 
Thread.currentThread().interrupt(); 

break; 
} 
System.out.println("temps ecoulé"); 
break; 
} 


} 

} 


Dans le ThreadLecture, la méthode run() doit effectuer la lecture et mettre le résultat dans une variable static par exemple.

Alors ce qui va se passer : si le ThreadLecture fait la lecture alors il se termine normalement sinon il sera "tué" après la fin de Thread.sleep(8000).
0