Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Pętla For
Forum PHP.pl > Forum > Przedszkole
Ulysess
Witam , potrzebuję napisać pętle która przestanie się wykonywać w 3 warunkach , gdy zmienna $zycie1 lub $zycie2 osiagna wartosc mniejsza badz rowna 0 lub petla sie wykona 30 x i wtedy koniec.

prosił bym o pomoc z góry dziękuje.

  1.  
  2. for ($p = 1 ;$p<=30;$p++)
  3. {
  4.  
  5. $losowe_liczba1 = rand(100,500);
  6. $losowe_liczba2 = rand(100,500);
  7.  
  8. $zycie1 = $zycie1-$losowe_liczba1;
  9. $zycie2= $zycie2-$losowe_liczba2;
  10.  
  11. echo '<br>',$zycie1,' / ',$losowe_liczba;
  12.  
  13. }
  14.  

Spawnm
break;
Czytaj kursy .
Ulysess
  1.  
  2. for ($l_r = 1 ;$zycie1 <= 0 OR $zycie2 <= 0;$l_r++)
  3. {
  4.  
  5. $zycie1 = 600;
  6. $zycie2 = 1000;
  7.  
  8. $losowe_liczba1 = rand(100,500);
  9. $losowe_liczba2 = rand(100,500);
  10.  
  11. $zycie1 = $zycie1-$losowe_liczba1;
  12. $zycie2= $zycie2-$losowe_liczba2;
  13.  
  14. echo '<br>',$zycie2,' / ',$losowe_liczba;
  15.  
  16. if($l_r >=30)
  17. break;
  18.  
  19. }
  20.  


czy o tym mówiłeś questionmark.gif w tym coś mi nie pasuję ...
thek
Bezpieczniej byłoby zostawić te l_r < 30 jako
  1. for($l_r = 1; $l_r < 30; $l_r++)

Bo wiesz, że nigdy ta pętla się nie skończy przed l_r = 30?
Czemu? To proste, zycie1 i zycie2 nigdy nie zejdą poniżej 0 z tej przyczyny, że za każdym przejściem pętli wracają do wartości 600 i 1000 na starcie a rand losuje u nich od 100 do 500 winksmiley.jpg Odjęcie więc pokaże mniejszą liczbę (wciąż grubo powyżej 0), ale kolejna pętla znów ustawi 600 i 1000.Inna sprawa, że:
  1. $zycie1 = 600;
  2. $losowa_liczba1 = rand( 100, 500 );
  3. $zycie1 = $zycie1 - $losowa_liczba1;
to dokładnie to samo co
  1. $zycie1 = rand ( 100, 500 );

i analogicznie $zycie2 to:
  1. $zycie2 = rand( 500, 900 );
Ulysess
wiem właśnie że coś jest źle.. tylko jeszcze nie wiem co ;p

chodzi mi o to że chce zrobić że ja mam np 500 życia i jest poprzez rand losowane ile mi zabierze mój przeciwnik i tak samo ile ja mu zabiorę i chodzi o to żeby pętla przestała się wykonywać w 3 przypadkach.
gdy moje życie osiągnie 0 lub mniej , gdy przeciwnika lub żaden z nas nie zginie w ciągu 30 uderzeń (czyli 30 wykonań pętli)

  1.  
  2. $zycie1_poczatkowe = 500;
  3. $zycie2_poczatkowe = 500;
  4.  
  5. for ($l_r = 1 ;$zycie1 <= 0 OR $zycie2 <= 0;$l_r++)
  6. {
  7.  
  8. $losowe_liczba1 = rand(100,500);
  9. $losowe_liczba2 = rand(100,500);
  10.  
  11. $zycie1 = $zycie1-$losowe_liczba1;
  12. $zycie2 = $zycie2-$losowe_liczba2;
  13.  
  14. echo '<br>Życie Moje: ',$zycie1,' ('.$losowe_liczba2.')/ Zycie Przeciwnika: ',$zycie2,'(',$losowe_liczba1,')';
  15.  
  16.  
  17. if($l_r >=30)
  18. break;
  19.  
  20. }
  21.  



problem tkwi w tym że mam przypuszczenie że nie działa tak jak powinno (logicznie) oraz pętla za każdym razem wykonuje się 30x bez znaczenia że któryś przeciwnik ma już dawno poniżej 0
thek
Twoja obecna poprawka prawie wyeliminowała problem smile.gif Nie sprawdzałem nigdy wersji z wielokrotnym warunkiem sprawdzającym for więc nie wiem jak się zachowa ten z OR jaki zastosowałeś. Na pewno obecnie problem już rozwiązałeś ze zmniejszaniem życia. Wystawienie obu liczników życia poza for uczyni je globalnymi dla pętli, dzięki czemu będzie już odejmowało prawidłowo. Ja bym dla pewności owe 30 dał tam gdzie jest u ciebie OR, a owe sprawdzanie zycie1 i zycie2 za odejmowaniem. Będzie to przejrzystsze a co ważniejsze będziesz dokładnie wiedział kto zadał ostateczny cios smile.gif Skąd? Od razu po odejmowaniu sprawdzasz to. Podam Ci dwa przykłady myślenia.
Gracze atakują się równocześnie:
  1. $zycie1 = 500;
  2. $zycie2 = 500;
  3. for ($l_r = 1 ;$l_r < 30; $l_r++) {
  4. $zycie1 -= rand(100,500);
  5. $zycie2 -= rand(100,500);
  6. if($zycie1 <= 0 OR $zycie2 <= 0)
  7. break;
  8. }
Zauważ, że tutaj nieważne jest kto atakuje w jakiej kolejności. Wynik jest liczony po zadaniu ciosów.

Teraz wariant drugi, gdzie $zycie1 to życie atakującego, a $zycie2 to broniący się:

  1. $zycie1 = 500;
  2. $zycie2 = 500;
  3. for ($l_r = 1 ;$l_r < 30; $l_r++) {
  4. $zycie2 -= rand(100,500);
  5. if($zycie2 <= 0)
  6. break;
  7. $zycie1 -= rand(100,500);
  8. if($zycie1 <= 0)
  9. break;
  10. }
Co to daje? Odpowiednik walki turowej winksmiley.jpg Tak jakby przeciwnicy zadawali ciosy na zmianę winksmiley.jpg Najpierw agresor, potem obrońca i tak w kółko. Ten któremu skończy się życie - przegrał.

Zauważ, że rozwiążanie 1 ma jeden fajny dodatek... Może zaistnieć remis, jeśli po walce w tej samej turze obaj zejdą na życiu <= 0 winksmiley.jpg Stąd jaki wariant wybierzesz tak będziesz potem kombinować musiał by to uwzględnić.

A najważniejsze... Prawie sam rozwiązałeś problem życia. Licznik życia wewnątrz i na zewnątrz pętli (startowy) to powinny być te same zmienne. Wtedy nastąpi "nadpisanie" i dzięki temu będziesz miał stale aktualne wyniki życia graczy. Wynika to z zasięgu widoczności zmiennych. W innych językach programowania nie musi tak już być, gdyż wtedy na stosie istnieje zmienna lokalna o tej samej nazwie co zmienna globalna, ale dla kompa to dwie różne smile.gif Wszystko zależy od języka. Ale w php akurat w więszości przypadków takie zagranie jak pokazałem przechodzi, dopóki są spełnione pewne warunki. Ale to sam doczytaj o zasięgu widoczności zmiennych w PHP, jako lektura dodatkowa.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.