Frage

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

    }
}

Ich habe die obige Klasse, die eine Schleife für eine bestimmte Zeitspanne ausführen und anschließend eine Instanzmethode aufrufen soll.Im Wesentlichen muss die Schleife in newGame () ungefähr eine Minute lang ausgeführt werden, bevor endGame () für die aktuelle Instanz aufgerufen wird.Bei Verwendung der Timer-Klasse bin ich mir jedoch nicht sicher, wie ich die Methode aufrufen soll, die ich für die aktuelle Instanz benötige, da ich der timertasks run-Methode keine Parameter übergeben kann?

Gibt es einen einfachen Weg, dies zu tun, oder gehe ich das falsch an?(beachten:dies ist nur ein Konsolenprojekt, keine GUI)

==========

code bearbeitet

Ich habe den Code gemäß den Empfehlungen in den obigen Code geändert und er funktioniert fast so, wie ich es erwartet habe, aber der Thread scheint immer noch nicht richtig zu enden.Ich war der Meinung, dass die while-Schleife sterben würde und die Kontrolle irgendwann zur Hauptmethode zurückkehren würde.Irgendwelche Ideen?

War es hilfreich?

Lösung

Da timesUP (bitte ändern Sie den Namen!) ist eine innere Klasse, sie hat bereits einen Verweis auf die Instanz von Boggle der es geschaffen hat.(Das wäre nicht der Fall, wenn es als markiert wäre static.) Wenn Sie eine Instanz von erstellen möchten timesUP in Verbindung mit einer anderen Instanz würden Sie so etwas tun:

otherBoggle.new timesUp();

Zugegeben, es ist eine ziemlich seltsame Syntax :)

Dies behebt zugegebenermaßen nicht das von Midhat identifizierte Problem - aber es bedeutet, dass Sie sich keine Sorgen machen müssen, einen Verweis auf die äußere Klasse zu erhalten.Rufen Sie einfach an endGame() von innen timesUP.run() und es wird es auf der entsprechenden Instanz aufrufen.

Andere Tipps

Sie haben Konsoleneingaben im Thread blockiert.Die Laufzeit wird davon diktiert.Sie können die Konsoleneingabe in einem separaten Thread haben und dem aktuellen Thread einen Timer hinzufügen, um den Eingabe-Thread nach einer Minute zu beenden, und dies aufrufen.Endspiel()

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top