Terminar aplicação em 30 segundos

1 resposta
touch-mx
Olá manolos :lol: Estou estudando java e tentando aplicar um pouco do aprendizado. Estou criando um joguinho aqui e quero que ele funcione da seguinte forma: Durante 30 segundos eu posso responder perguntas, basicamente o que imprime na tela é uma palavra qualquer de uma array de Strings. Quando passar 30 segundos, eu quero que ele apenas imprima a quantidade de pontos e pare de fazer as perguntas. Criei duas classes. sendo uma a mega_m.java
import java.util.Random;
import java.util.Scanner;
public class mega_m {

String[] palavras;
private static final Random random_palavra = new Random();
int pontos=0;

Scanner input = new Scanner(System.in);

//construtor que recebe o array de Strings com as palavras do jogo
public mega_m(String[] p){
palavras = p;
}

//metodo que seleciona a palavra no array, a variavel indice recebe o numero gerado entre 0 a 5,
// e a variavel palavra recebe o array palavras com o indice que foi gerado pela classe Random(numero aleatorio)

public void chamaPalavra(){
String palavra;
int indice= random_palavra.nextInt(5);
palavra = palavras[indice];
System.out.printf("A palavra selecionada foi: %s\n", palavra);
}

// Método decisão, ele vai retornar uma String C para certo e P para pular, ele ler apartir do teclado
// o que o kr digitou e armazena na variavel decisão que é a mesma a ser retornada e que vai ser usada
// pelo método Controla.
public String decisao(){
System.out.println("Escolha C para certo e P para pular");
String decisao = input.next();
return decisao;
}

// Método controla, ele recebe uma String, ou seja, a decisão do usuario, se o kr acertou ou pulou a palavra
// se o kr tiver acertado entra com a letra C se ai ele incrementa os pontos e chama o método chamaPalavra
// novamente e o própio metodo Controla com o parametro de decisão, e o kr pulou a pergunta ele faz a mesma coisa.
public void Controla(String decisao){
if(decisao.equals("c")){
System.out.println("Você acertou\n");
pontos++;
chamaPalavra();
Controla(decisao());

}else{
if(decisao.equals("p")){
System.out.println("Você pulou\n");
chamaPalavra();
Controla(decisao());
}else{
	return;
}
}
}

}

E a classe jogar.java

public class jogar extends Thread{
		
	static int pontuacao=0;
	
	
	public void run(){
			
		
		try {
			String[] palavras = {"homen","casal","férias","namoro","facebook"};
			
			mega_m jogar = new mega_m(palavras);
			
			jogar.chamaPalavra();
			jogar.Controla(jogar.decisao());
			
			Thread.sleep(30000);
			jogar.Controla("h");
			
		} catch (InterruptedException e) {
			return;
		}
	
	}

		
	public static void main(String[] args){			
		new jogar().start();
		
	}
}

Do jeito que está, ele continua fazendo as perguntas e só quando eu digito algo diferente de c ou p é que ele passa 30 segundos e executa algo.

Então, por favor me ajudem. To pirando já com isso.
Agradeço desde já.

1 Resposta

tondatto

Você terá que ter 03 classes de controle:
1. Uma classe para fazer o controle dos turnos do jogo: fazer perguntas, receber respostas e avaliar acerto.
2. Uma classe para fazer o controle do tempo.
3. Uma classe para fazer o controle do jogo.

A primeira, do controle de turnos, poderá ter basicamente a seguinte estrutura:
public class Turno {
    public boolean newTurno(){
        //Faz pergunta
        //Lê resposta
        return verificaAcerto(respostaEsperada, respostaUsuario);
    }
}
A segunda classe, basicamente uma Thread que faz o controle do tempo, poderá funcionar com a seguinte estrutura:
public class Tempo extends Thread {
    private final int TEMPO_LIMITE = 30;
    private int tempoCorrido = 0;
    
    public void run() {
        // enquanto segundos não atingir o tempo limite
        // acrescentar +1 segundo ao tempoCorrido a cada 1 segundo
        while(segundos <= TEMPO_LIMITE){
            Thread.sleep(1000);
            tempoCorrido++;
        }
    }
}
Na classe do Jogo, você terá um simples while que testará se a thread Tempo está ativa enquanto roda os turnos.
public class Jogo {
    int pontuacao = 0;
	
	public Jogo(){
		Turno turno = new Turno();
		Thread tempo = new Tempo();
		
		// inicia contagem do tempo
		tempo.start();
		
		// enquanto o tempo estiver rodando, fazer o jogo
		while(tempo.isAlive()){
			boolean acerto = turno.newTurno();
			if(acerto){
				pontuacao++;
			}
		}
		
		resultado();
	}
	
	public void resultado(){
		System.out.println("Pontuacao: " + resultado);
	}
}

Procure ler sobre Threads.
Esta página do The Java Tutorial é um excelente começo: [url]http://docs.oracle.com/javase/tutorial/essential/concurrency/simple.html[/url]

Criado 10 de setembro de 2012
Ultima resposta 10 de set. de 2012
Respostas 1
Participantes 2