Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz
  • 0

Jak to ogarnąć, problem z TimerTask? - Java


Pytanie

Opublikowano

Cześć mam taki mały problem z kodem:

 

import java.util.*;


public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Timer czas = new Timer();
        TimerTask zd = new TimerTask(){ 
            public void run(){
                int hp = 10;
                do{
                    Random los = new Random();
                    int pc = 1 + los.nextInt(4);
                    System.out.println("5 sek");
                    String odp = sc.nextLine();
                    switch(odp){
                        case "atk":
                            hp = hp - pc;
                            System.out.println("hp spadlo o " + pc + "wynosi" + hp);
                        default:
                            hp = hp + pc;
                            System.out.println("zle hp wzroslo o " + pc);
                    }
                }while(hp>0);
                    System.out.println("pokonany ");
                    czas.cancel();
            };
        };
            System.out.println("5sek");
            czas.schedule(zd, 5 * 1000);
    
                        
        
    }
}

 

 

Problem polega na tym, że gdy upłynie czas dla wpisującego polecenie, uruchamia się metoda void run, i teraz co muszę zrobić aby po uruchomieniu tej metody , powrócić z powrotem do pętli? Ponieważ uruchomienie metody void run automatycznie blokuje mi pętle, czas się nie nalicza od nowa , jak i użytkownik nie dostaje polecenia że ma 5 sekund.

Co próbowałem?

Stworzyłem 2 różne metody i wywoływałem je na zmianę np metdoa1("asd");

Program powracał do pętli , ale się bugował  i co chwilę wyskakiwał timertask jak i nie można było wpisać polecenia,

System.exit całkowicie zamyka program nie ma powrotu do pętli 

Return; nie działa

Jak mogę to rozwiązać?

Miałem jeszcze pomysł,  ponieważ kiedy odpalona jest metoda void run, to scanner działa, i jeśli tylko wpisze np atk to wtedy ładnie przechodzi do pętli i wszystko działa. I może jest jakiś sposób np żeby wymusić przez console wpisanie do Scanner np dana komendę? Jeśli tak to w jaki sposób? 

Próbowałem System.console().writer..

Ale nie działa 

2 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0
Opublikowano

Hej,  aby rozwiązać ten problem, można użyć break, która pozwoli na wyjście z pętli do-while. W tym przypadku należy umieścić break w momencie, gdy zostanie wykonana operacja czas.cancel().

Przykładowy kod, który rozwiązuje ten problem, może wyglądać tak:

To jest ukryta treść, proszę

W ten sposób po wykonaniu operacji czas.cancel() program automatycznie przejdzie do kodu po pętli do-while, a następnie wróci do pętli i znowu wyświetli komunikat "5 sek", umożliwiając wpisanie polecenia przez użytkownika.

Jeśli chciałbyś wymusić wpisanie określonej komendy przez użytkownika, możesz użyć while z warunkiem sprawdzającym poprawność wpisanej komendy. Przykładowy kod może wyglądać tak:

To jest ukryta treść, proszę

Mam nadzieję że pomogłem 🙂

  • 0
Opublikowano (edytowane)

@Dill3k

logi z konsoli 

 

<stdin>:28: error: break outside switch or loop
            break;  
            ^
1 error

Break można dać tylko do pętli,  ale wtedy kończy mi pętle i wyłącza program.

Wrzucę wam inny troszkę kod który aktualnie działa mi najlepiej bez  błędów gdzie void jest w pętli 

 

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

public class Main {
    public static void main(String [] args) {
        int hp = 10;
        Scanner sc = new Scanner(System.in);
        do{
            Random los = new Random();
            int pc = 1 + los.nextInt(6);
            TimerTask zd = new TimerTask(){
                @Override
                public void run(){
                    System.out.println("Czas off");
                    
                         
                 } 
                         
            };
            Timer czas = new Timer();
            czas.schedule(zd, 1 * 1000);
            System.out.println("5 sek na odp");
           
            String odp = sc.nextLine();
            switch(odp){
                case "atk":
                    System.out.println("oo tak");
                     hp = hp - pc;
                    System.out.println("hp spadlo o " + pc + " "  + " wynosi " + hp);
                    czas.cancel();
                                                              
                    break;
                default:
                    System.out.println("zle");
                    hp = hp + pc;  
                    System.out.println("hp wzroslo o " + pc);
                       
                }
           }while(hp>0); 
           
                      
                System.out.println("pokonany");       
    }

 

@gucio88pl

Używałem if zamiast switch ale wtedy wyskakują mi błędy z integer  nie czyta mi wgl wartości hp nie bardzo wiem dlaczego, 

 

Generalnie uczę się dopiero javy, i nie wiem czy niektóre problemy są związane z tym że piszę program na telefonie w aplikacji jvdroid, a nie w intellijide.

Może to być też tego kwestia ? 

Edytowane przez Ancyrafi

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...