Java - pętle, losowanie liczb

in #pl-artykuly6 years ago

Witam w kolejnym poście!!! Ostatnio dowiedziałeś się między innymi co to jest stała, jak nazywać zmienne oraz do czego nam służy biblioteka Math. Dziś dowiemy się co to jest pętla i do czego ją wykorzystujemy.
DQmaRwagdbWrrTD2BisW7KB8b6gSeNobyfyo7PB9duY3bV4.jpg

Co to jest pętla


Pomyśl sobie, że masz jakieś zadanie do wykonania które musisz wykonać. Np. obrać ziemniaki. Powiedzmy, że masz obierać ziemniaki do momentu zapełnienia garnka. Jako, iż automatyzacja następuje bardzo szybko to zadanie będzie wykonywał nasz komputer. Najpierw komputer powinien sprawdzić czy garnek jest pełen. Jeżeli nie jest ma wziąć ziemniaka i zacząć obierać. I ten kawałek kodu wykona się tylko raz!!! A więc żeby się wykonał kilka razy musimy napisać tak:

public class New{
      public static void main(String[] args){
            if(garnekNieJestPelen==true)//Fikcyjna zmienna która przechowuje stan garnka
            {
                    wezZiemniaka();//Komendy wyssane prze ze mnie z palca
                    obierajZiemniaka();
            }
            if(garnekNieJestPelen==true)//Fikcyjna zmienna która przechowuje stan garnka
            {
                    wezZiemniaka();//Komendy wyssane prze ze mnie z palca
                    obierajZiemniaka();
            }
            if(garnekNieJestPelen==true)//Fikcyjna zmienna która przechowuje stan garnka
            {
                    wezZiemniaka();//Komendy wyssane prze ze mnie z palca
                    obierajZiemniaka();
            }
            if(garnekNieJestPelen==true)//Fikcyjna zmienna która przechowuje stan garnka
            {
                    wezZiemniaka();//Komendy wyssane prze ze mnie z palca
                    obierajZiemniaka();
            }
            if(garnekNieJestPelen==true)//Fikcyjna zmienna która przechowuje stan garnka
            {
                    wezZiemniaka();//Komendy wyssane prze ze mnie z palca
                    obierajZiemniaka();
            }
            if(garnekNieJestPelen==true)//Fikcyjna zmienna która przechowuje stan garnka
            {
                    wezZiemniaka();//Komendy wyssane prze ze mnie z palca
                    obierajZiemniaka();
            }
            if(garnekNieJestPelen==true)//Fikcyjna zmienna która przechowuje stan garnka
            {
                    wezZiemniaka();//Komendy wyssane prze ze mnie z palca
                    obierajZiemniaka();
            }
      }
}

Oczywiście ten kod nie będzie działał bo nie istnieje a ni zmienna garnekJestPelen, ani polecenie wezZiemnika, ale ten kod w pełni oddaje o co chodzi. Przecież takie rozwiązanie jest głupie i kompletnie nie praktyczne powiedzmy że mamy nieco większy taki kod jak na górze napisałem i powiedzmy, że to samo działanie wykonuje się 100 razy. Ale mamy wielki gar w którym się zmieści więcej niż sto ziemniaków i co wtedy??? I tu z pomocą przychodzą nam pętle. Dzięki nim możemy wykonywać te same działania przez okres w którym jakiś warunek jest prawdziwy(coś takiego jak if) bądź określoną liczbę powtórzeń. W programowaniu mamy 3 podstawowe typy pętli while, do-while i for.

While


Najpierw zobaczmy w kod i zobaczmy jak się to pisze:

public class New{
     public static void main(String[] args){
           while(/*warunek*/){
           //dopóki warunek prawdziwy zawartość klamerek będzie się wykonywać
           }
     }
}

Można zobaczyć, że while to jest coś takiego jak if tylko zawartość whila jest powtarzana dopóki warunek jest prawdziwy.

Losowanie liczb i użycie whila


Skorzystamy z poznanej ostatnio biblioteki Math. Za nim zaczniemy mówić jak zdobywać liczby losowe. Powiedzmy sobie jak komputer to robi. Najważniejszą rzeczą jaką musimy sobie powiedzieć jest to, że komputer nie generuje nam liczb losowych tylko pseudolosowe. Ale jak to??? Komputer nie może sobie wymyślić jakiejś liczby. Komputer musi mieć jakieś dane żeby to wygenerować. Więc na jakiej podstawie generuje liczby pseudolosowe? Mechanizmów generujących takie liczby jest mnóstwo. Ale bazą jest tzw.seed czyli ziarno i to ziarno zostaje przerabiane na ciąg znaków. Takim seedem może być np. godzina. Dlatego w grach w których zdobywamy jakieś losowe itemki z mobów o godzinie 15 mamy większą szansę na super rzadki kamień. A o 10 już nie. Jak to się robi :

public class New{
      public static void main(String[] args){
            double liczbaPseudolosowa = Math.Random();
            System.out.println(liczbaPseudolosowa);
      }
}

A teraz stwórzmy program który przerwie swoje działanie w momencie wylosowania liczby 5. Ponadto wartość wylosowaną zapiszemy w incie.

public class New{
      public static void main(String[] args){
          int wylosowanaLiczba = 0;
          while(wylosowanaLiczba!=5)//Wykonuj póki wylosowana liczba jest != 5
          {
              wylosowanaLiczba = (int)(1+Math.random()*10);//losuj z zakresu liczb 1-10
              System.out.println(wylosowanaLiczba);
          }
      }
}

Wyjaśnijmy co oznacza (int)(1+Math.random()10). Najpierw (1+Math.random()10). Komenda Math.random losuje nam wartość w double mniejszą od 1. Do wylosowanej wartości dodajemy 1 czyli ustalamy, że minimalną wartością jest 1. Jeżeli byśmy dodali np. 3 to minimalną wartością byłaby liczba 3. A teraz co oznacza * 10. Ustalamy wartość maksymalną. Teraz rozważmy taki zestaw liczb minimalną liczbą będzie 1, maksymalna 10, a liczbą wylosowaną będzie 0.999. Czyli wzór będzie wyglądał tak 1+0.99910(Pamiętajmy kolejność wykonywania działań).

No to rozwiążmy to:

1 + 0.999 * 10=1+9.99 = 10.99


Zaraz, zaraz czemu 10.99 przecież maksymalną liczbą powinna być 10. Więc teraz przejdźmy do (int) bo w tym właśnie leży rozwiązanie zagadki. Tym czymś mówimy żeby wynik który powstał traktową jako inta czyli logicznie by było żeby 10.99 jako int wynosiło 11. Ale nie pisząc (int) komputer ucina nam końcówkę i wychodzi 10. Trochę to skomplikowane, ale nie trzeba tego do końca rozumieć :) . Tak już w programowaniu jest, że przychodzi taka chwila oświecenia i coś czego nie rozumiałeś staje się jasne.

do-while


I znowu zobaczmy kod:

public class New{
      public static void main(String[] args){
          int wylosowanaLiczba = 5;
          do//powtórzy raz kod w klamerkach
          {
              wylosowanaLiczba = (int)(1+Math.random()*10);
              System.out.println(wylosowanaLiczba);
          }while(wylosowanaLiczba!=5);//I będzie powtarzał dopóki warunek jest prawdziwy
      }
}

Rzeczy w klamerkach zostaną wykonana minimum raz. I będą powtarzane tak jak w whilu. I tyle.

For


Dochodzimy do ostatniej pętli. Czyli pętli for. Zerknijmy jak się ją zapisuje.

for(/*zmienna do kontroli pętli*/;/*warunek*/;/*I operacja po wykonaniu jednego przejścia przez pętlę)
{
//Jeżeli warunek będzie spełniony zawartość pętli zostanie wykonana
}

Trochę tego dużo ale napiszemy kod który będzie odliczał od 1 do 10.

public class New{
      public static void main(String[] args){
          for(int i = 1;i<=10;i++)
          {
              System.out.println(i);
          }
      }
}

O co tu w ogóle biega??? O tuż gdy komputer dochodzi do pętli na samym początku tworzy zmienną "i" oraz przypisuje jej wartość 1. Jeżeli warunek jest prawdziwy wykonuje zawartość klamerek. Po wykonaniu wszystkich komend z klamerek(jednej iteracji) zostaje zmieniona wartość zmiennej i.

Na koniec


W następnych postach pokażę ci, że ta wiedza którą teraz posiadasz jest wystarczająca do napisania gry tekstowej. Oczywiście w kolejnych postach będziemy poszerzać twoją wiedzę pisząc skrypty do tej gry.

Sort:  

OMG! This is SUCH an AMAZING post! Thank you for sharing! I gave you a vote!!

Thank you.

Congratulations @miki164! You received a personal award!

1 Year on Steemit

Click here to view your Board of Honor

Support SteemitBoard's project! Vote for its witness and get one more award!

Coin Marketplace

STEEM 0.28
TRX 0.13
JST 0.032
BTC 65860.84
ETH 3017.19
USDT 1.00
SBD 3.70