Как мне сбросить таймер в Java? - PullRequest
0 голосов
/ 09 ноября 2018

Поэтому я пытаюсь запрограммировать портативную электронную игру под названием Lights Out Cube на Java с использованием Eclipse Oxygen.2, и я решил включить таймер, чтобы игрок знал, сколько времени ему потребуется, чтобы закончить игра. Когда игрок нажимает на кнопку «Пуск / Сброс» (я изменяю ее текст на «Сброс» после однократного нажатия), где я активирую таймер, начинается игра. После каждого щелчка я проверяю, закончил ли игрок игру, и если он делает, я останавливаю таймер. Если он хочет играть снова, я хочу, чтобы таймер перезапустился. Пожалуйста, помогите мне здесь:

//here i have a function called checkIfWinning() which does the checking; if there is a winner, the following code is executed to stop the timer
            timer.cancel();
            timer.purge();
//timer is a publicly declared java.util.Timer
//this is a code snippet for btnStart with "time" recording the time in seconds 
time=0;
timer.schedule(new TimerTask()
            {
                @Override
                    public void run() 
                    {
                            time++;
                            int hours = (int) time / 3600;
                            int remainder = (int) time - hours * 3600;
                            int mins = remainder / 60;
                            remainder = remainder - mins * 60;
                            int secs = remainder;
                            timeTaken.setText(String.format("%02d:%02d:%02d",hours,mins,secs));
                    }

            }, 1000,1000);

Есть ли в любом случае это можно сделать? Или мне придется полностью удалить таймер?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Это может быть понятно.

  1. Вы не можете сбросить или приостановить таймер в Java, но функциональность может быть достигнута, если не запустить таймер на основе проверки boolean.

  2. Как было сказано ранее Халком и Левом М., AtomicInteger может использоваться для обеспечения безопасности потока.

  3. Вся логика вrun() можно упростить, используя TimeUnit для преобразования секунд в указанный формат,

    time+=1000;
    System.out.println(String.format("%02d:%02d:%02d", TimeUnit.SECONDS.toHours(time), TimeUnit.SECONDS.toMinutes(time), time%60));
    

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

public class Game
{
    private static int time = 0;
    private static Timer t = new Timer();
    private static Game g;
    private static boolean ispaused = false;

    public static void main(String[] args)
    {
        t.schedule(new TimerTask() {
            public void run()
            {
                if(ispaused)
                {
                    return;
                }
                time++;
                System.out.println(String.format("%02d:%02d:%02d", TimeUnit.SECONDS.toHours(time), TimeUnit.SECONDS.toMinutes(time), time%60));
            }
        }, 1000, 1000);

        g = new Game();

        try
        {
            System.out.println("Starting first game");

            g.startGame(); Thread.sleep(5000); g.endGame();

            System.out.println("Starting second game.");

            g.startGame(); Thread.sleep(5000); g.endGame();
        }
        catch(Exception e)
        {}
    }

    private void startGame()
    {
        time = 0;
        ispaused = false;
        System.out.println("Game Started");
    }

    private void endGame()
    {
        time = 0;
        ispaused = true;
        System.out.println("Game ended");
    }
};
0 голосов
/ 09 ноября 2018

Вы не можете сбросить, когда объект TimerTask будет активирован, но в вашем конкретном случае вы можете сбросить счетчик игрового времени без удаления и повторного создания таймера.

Поскольку ваш таймер срабатывает каждую секунду, все, что вам нужно сделать, это сбросить переменную time, которую вы используете, когда пользователь нажимает кнопку сброса.

Я редактирую этот ответ, основываясь на Халксе и ваших комментариях:

  1. Халк прав, и вы должны использовать AtomicInteger для подсчета времени. Если вы продолжите работать таймер, в некоторых случаях может быть ошибка, при которой значение не будет сброшено.

  2. У вас может быть AtomicBoolean флаг, который позволяет TimerTask знать, играет ли игрок или нет.

Вот пример кода:

AtomicInteger time = new AtomicInteger();
//whenever you want to reset it:
time.set(0);

AtomicBoolean isPlaying = new AtomicBoolean();

//when user clicks "start":
isPlaying.set(true);
//when user wins or clicks "reset"
isPlaying.set(false);

//your timer task will look something like this:
public void run() {
    if (isPlaying.get()) {
        int currentTime = time.incrementAndGet();
        int hours = (int) currentTime / 3600;
        int remainder = (int) currentTime - hours * 3600;
        int mins = remainder / 60;
        remainder = remainder - mins * 60;
        int secs = remainder;
        timeTaken.setText(String.format("%02d:%02d:%02d",hours,mins,secs));
    }
}
...