Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Pętla For
Ulysess
post
Post #1





Grupa: Zarejestrowani
Postów: 695
Pomógł: 65
Dołączył: 27.07.2009
Skąd: Y

Ostrzeżenie: (0%)
-----


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.  

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
Spawnm
post
Post #2





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




break;
Czytaj kursy .
Go to the top of the page
+Quote Post
Ulysess
post
Post #3





Grupa: Zarejestrowani
Postów: 695
Pomógł: 65
Dołączył: 27.07.2009
Skąd: Y

Ostrzeżenie: (0%)
-----


  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ę ...
Go to the top of the page
+Quote Post
thek
post
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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 );


Ten post edytował thek 25.10.2009, 13:58:22


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Ulysess
post
Post #5





Grupa: Zarejestrowani
Postów: 695
Pomógł: 65
Dołączył: 27.07.2009
Skąd: Y

Ostrzeżenie: (0%)
-----


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

Ten post edytował Ulysess 25.10.2009, 14:47:01
Go to the top of the page
+Quote Post
thek
post
Post #6





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.

Ten post edytował thek 25.10.2009, 22:52:30


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 09:56