Losowanie nowej liczby po każdym przejściu pętli

0

Witam przerabiam sobie teraz trochę tut na yt i aktualnie robię sobie taki mini projekt. Mam jeden problem a mianowicie chciałbym aby program w każdym kroku losował nowe wartości i wiem, że można zrobić wszystko w jednej klasie ale przy większym projekcie takie tworzenie ma chyba sens? Myślałem nad przeniesieniem funkcji "wyliczenie" do innych klas i wtedy w pętli for w GetAttack() tworzyłoby tyle różnych wartości ile kroków do pokonania jednej z stron ale coś nie chciało działać :D Pewnie poszłoby gdybym napisał tablicę i dał żeby wylosował od razu z 80 możliwości ale takie coś raczej nie ma sensu :)

package HeroVsMonster;

public class Monster {
    private int Health = 500;
    private int Attack = (int) (Math.random()* 16);


    public int GetHealth()
    {
        return Health;
    }

    public int GetAttack()
    {

        return Attack;
    }



}
package HeroVsMonster;

public class Hero {

    private int Health = 200;
    private int Attack = random(10, 40);


    public int GetHealth()
    {
        return Health;
    }

    public int GetAttack()
    {
        return Attack;
    }



    int random(int min, int max)
    {
        int range = (max - min) +1 ;
        return (int)(Math.random() * (double)range) + min;
    }


}
package HeroVsMonster;


public class Versus {



    public static void main(String[] args) {
        Monster Kaczka = new Monster();
        Hero Jozek = new Hero();
        int mHealth = Kaczka.GetHealth();
        int hHealth = Jozek.GetHealth();
        int wyliczenie = 0;

        while (mHealth > 0 && hHealth > 0)
        {
            wyliczenie++;
            mHealth -= Jozek.GetAttack();
            hHealth -= Kaczka.GetAttack();
            System.out.println(wyliczenie + " HP Kaczki: " + mHealth + " vs HP Józka: " + hHealth);
        }
        if (mHealth <=0)
        {
            System.out.println("HERO uratował ziemię!");
        }
        else if (hHealth <=0)
        {
            System.out.println("KACZKA przejeła kontrolę nad ziemią ");
        }
        else
        {
            System.out.println("Kaczka i HERO zgineli w walce zabijając siebie nawzajem");
        }
    }
}
1

Jeżeli dobrze rozumiem to chcesz pobierać nową wartość za każdym razem gdy wykonujesz metodę "GetAttack()"?

...
    private int Attack = (int) (Math.random()* 16);

    public int GetAttack()
    {

        return Attack;
    }
...

W tej wersji pole 'Attack' jest wyliczane tylko raz w momencie utworzenia obiektu, jeżeli chcesz żeby wartość była wyliczana za każdym razem gdy wywołasz 'GetAttack()' metoda ta powinna wołać funkcję Math.random() i zwracać jej wartość. Mniej więcej tak:

public int GetAttack() 
{
     return (int) (Math.random()* 16);
}
0

Ale wtedy przestanie być to private oraz funkcja Attack będzie zupełnie niepotrzebna a chciałbym żeby jednak funkcja takowa była. Teraz pytanie bo takie coś

return Attack = (int) (Math.random()* 16);

działa jak należy funkcja Attack jest prywatna i wylicza ale czy jest sens tworzyć prywatną zmienną skoro na start do Attack nie jest przypisywana żadna wartość?

0

Attack jest polem, nie funkcją :) I nie rozumiem dlaczego chcesz żeby było private? Ale jeżeli Ci zależy możesz dodać jakieś pola typy minimumAttack i maximumAttack które będą określały przedział liczb do losowania. Jeszcze lepiej byłoby to wyekstrahować do jakiejś klasy typu Weapon, wtedy Hero i Monster mogłyby mieć pola prywatne typu Weapon.

0

Dopiero się uczę więc mylę i pewnie będę mylił jeszcze wiele razy pojęcia :D, co do private to po prostu uważam, że takie coś jak Hp czy dmg nie może być zmieniane gdzie komu się to podoba, a dodatkowo starając się jakoś użyć klasy private nauczę się więcej niż robiąc klasę public jeszcze dodatkowo w głównym pliku :D. Tak jak pisałem to jest taki malutki projekcik a pisząc go nauczyłem się kilku nowych rzeczy ;) I właściwie aktualnie osiągnąłem w nim to co chciałem a może za 10 dni coś dojdzie jak się nauczę czegoś jeszcze innego co może okazać się fajne

0

Zatem motywacje masz dobre, takie ukrywanie pól za akcesorami nazywa się enkapsulacją ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1