Pergunta

import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask;


public class Boggle {
    Board board;
    Player player;
    Timer timer;
    boolean active;

    static Scanner in = new Scanner(System.in);

    public Boggle() {
        board = new Board(4);
        timer = new Timer();
    }

    public void newGame() {
        System.out.println("Please enter your name: ");
        String line = in.nextLine(); 
        player = new Player(line);
        active = true;

        board.shuffle();
        System.out.println(board);

        timer.schedule(new timesUP(), 20000);
        while(active) {
            String temp = in.nextLine();
            player.addGuess(temp);
        }
    }


    public void endGame() {
        active = false;
        int score = Scoring.calculate(player, board);
        System.out.println(score);
    }


    class timesUP extends TimerTask {
        public void run() {
            endGame();
        }
    }


    public static void main(String[] args) {
            Boggle boggle = new Boggle();
            boggle.newGame();

    }
}

Eu tenho a classe acima que deve executar um loop por um determinado período de tempo e depois invocar um método de instância.Essencialmente, preciso que o loop em newGame() seja executado por cerca de um minuto antes de endGame() ser invocado na instância atual.No entanto, usando a classe Timer, não tenho certeza de como invocaria o método necessário na instância atual, pois não consigo passar nenhum parâmetro para o método de execução timertasks.

Existe uma maneira fácil de fazer isso ou estou fazendo isso da maneira errada?(observação:este é apenas um projeto de console, sem GUI)

==========

código editado

Alterei o código acima seguindo as recomendações e funciona quase como esperado, mas o tópico ainda parece não terminar corretamente.Eu era o loop while que morreria e o controle eventualmente voltaria ao método principal.Alguma ideia?

Foi útil?

Solução

Porque timesUP (por favor, mude o nome!) é uma classe interna, ela já possui uma referência à instância de Boggle que o criou.(Isso não seria o caso se fosse marcado como static.) Se você quisesse criar uma instância de timesUP associado a outra instância, você faria algo como:

otherBoggle.new timesUp();

É uma sintaxe bem estranha, admito :)

É certo que isso não resolve o problema identificado por Midhat - mas significa que você não precisa se preocupar em obter uma referência à classe externa.Apenas ligue endGame() de dentro timesUP.run() e ele irá chamá-lo na instância apropriada.

Outras dicas

Você bloqueou a entrada do console no thread.O tempo de execução será ditado por isso.Você pode ter a entrada do console em um thread separado e adicionar um cronômetro no thread atual para encerrar o thread de entrada após um minuto e chamar this.endGame()

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top