Question

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();

    }
}

J'ai la classe ci-dessus qui doit effectuer une boucle pour une durée donnée et invoquer ensuite une méthode d'instance. Essentiellement, je besoin de la boucle dans NewGame () pour fonctionner pendant une minute avant Endgame () est invoquée sur l'instance en cours. Cependant, en utilisant la classe Timer Je ne sais pas comment j'invoquer la méthode que je besoin sur l'instance actuelle puisque je ne peux pas passer des paramètres à la TimerTask méthode run?

Y at-il un moyen facile de faire ceci ou je vais sur ce dans le mauvais sens? (Note: ce n'est un projet de console, pas d'interface graphique)

==========

Code modifié

J'ai changé le code pour les suivants au-dessus des recommandations, et il fonctionne presque comme je l'attends mais le fil ne marche pas semblent toujours finir correctement. J'étais la boucle while allait mourir et le contrôle finirait par revenir à la méthode principale. Toutes les idées?

Était-ce utile?

La solution

Parce que timesUP (s'il vous plaît changer le nom!) Est une classe interne, il a déjà une référence à l'instance de Boggle qui l'a créé. (Ce ne serait pas le cas si elle était marquée comme static.) Si vous voulez créer une instance de timesUP associée à une autre instance, vous feriez quelque chose comme:

otherBoggle.new timesUp();

Il est assez étrange syntaxe, il est vrai:)

Cela ne résout pas le problème identifié Midhat, il est vrai - mais cela signifie que vous n'avez pas à vous soucier de faire une référence à la classe externe. Il suffit d'appeler endGame() de l'intérieur timesUP.run() et il appellera sur l'instance appropriée.

Autres conseils

Vous avez le blocage entrée de la console dans le fil. Le temps d'exécution sera dictée par cela. Vous pouvez avoir l'entrée de la console dans un thread séparé, et ajouter une minuterie dans le thread courant pour tuer le fil d'entrée après une minute, et appelez this.endGame ()

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top