Próbuję zasymulować mecz piłki nożnej w Android Studio (język: Java). Generuję 90 liczb losowych. Każda iteracja musi odpowiadać jednej minucie meczu. (Ale teraz jest to tylko jedna sekunda podczas testowania). Po każdej rozegranej minucie (w tym przypadku sekundowej) minuty rozegrane i ewentualnie wynik należy skorygować w aplikacji. Przetestowałem już szereg rozwiązań, które mogłem znaleźć w internecie, jak na przykład rozwiązanie Thread, które pojawia się wszędzie. Nie daje to jednak rezultatu, jakiego się spodziewałem.

Oczekiwany wynik: aplikacja, która zaczyna się od 0 minut i wyniku 0-0, zwiększając liczbę minut gry o 1 co sekundę, a także dostosowując wynik w przypadku strzelenia gola.

Rzeczywiste dane wyjściowe: biały ekran z liczbą milisekund określoną w kodzie, a następnie tylko „wynik końcowy” gry. Na przykład: 90' 2-1.

Próbowałem już umieścić kod try/catch w innym miejscu w pętli. Zastąpiłem również sleep wait. To zawsze daje ten sam wynik. Czy ktoś może mi powiedzieć, w jaki sposób mogę wyświetlić na żywo liczbę sekund, aby zwiększyć się na ekranie, a wynik zmienia się, gdy tylko padnie gol?

public void playLeagueMatch(Team team1, Team team2, TextView minuteTV,
                            TextView homeGoalsTV, TextView awayGoalsTV){

    int strength1 = team1.strength;
    int strength2 = team2.strength;
    int minutesPlayed = 0;
    double separation = Double.valueOf(strength1) / (Double.valueOf(strength1)+Double.valueOf(strength2)) * 100;

    int homeGoals = 0;
    int awayGoals = 0;

    for (minutesPlayed = 0; minutesPlayed < 91; minutesPlayed++) {
        String minuteName = Integer.toString(minutesPlayed);
        minuteTV.setText(minuteName + "'");

        int random = playMinute();

        if(random < 101){
            if(random <= separation){
                homeGoals++;
                homeGoalsTV.setText(Integer.toString(homeGoals));
            }
            else{
                awayGoals++;
                awayGoalsTV.setText(Integer.toString(awayGoals));
            }
            try{
                Thread.sleep(1000);
            }
            catch(InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

Funkcja playMinute:

public int playMinute(){
    Random ran = new Random();

    int random = ran.nextInt(3500) + 1;

    return random;
}
0
eniesee 18 marzec 2020, 16:53

2 odpowiedzi

Najlepsza odpowiedź

Nie używaj Thread.sleep() to zła praktyka. Możesz użyć Countdown Timer i onTick uruchomić playMinute()

new CountDownTimer(30000, 1000) {

    public void onTick(long millisUntilFinished) {
      Log.i("seconds remaining: " ,""+ millisUntilFinished / 1000);
    }

    public void onFinish() {
         Log.i("Timer Finished");
    }  
}.start();
3
appersiano 18 marzec 2020, 14:01

Thread.sleep(1000) będzie spać tylko przez 1 sekundę, ponieważ 1 sekunda to 1000 ms.

Zastąp go na minutę Thread.sleep(1 * 60 * 1000)

-1
Rafsanjani 18 marzec 2020, 13:56