Lecture d'une chaine avec comptes a rebours [Fermé]

Signaler
Messages postés
6
Date d'inscription
samedi 12 mars 2016
Statut
Membre
Dernière intervention
19 décembre 2017
-
Messages postés
814
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
17 avril 2020
-
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


Salut,

Est-ce que tu es à l'aise avec les Threads ?
Messages postés
6
Date d'inscription
samedi 12 mars 2016
Statut
Membre
Dernière intervention
19 décembre 2017

je viens de lire le cours de Threads dans OpenClassrooms et j'ai une ptite idée de ce qu'est un thread
Utilisateur anonyme
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 ?)
Messages postés
6
Date d'inscription
samedi 12 mars 2016
Statut
Membre
Dernière intervention
19 décembre 2017

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
Utilisateur anonyme
J'avoue que là, je suis en manque d'idée ...
Messages postés
814
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
17 avril 2020
115
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).