Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]While - dodawanie
Forum PHP.pl > Forum > Przedszkole
Utilaft
Witam. Chcę zrobić, by wykonywało mi się działanie, dopóki nie wyjdzie 0.

Mam taki kod:
while($user1_walka <= 0) {

$user1_walka = $user_atak * 100/$user_zrecznosc + $user2_obrona + $user2_zycie;
$user2_walka = $user2_atak * 100/$user2_zrecznosc + $user_obrona + $user_zycie;

if($user1_walka <= 0) {
echo $user1_walka;

}

break;

}

No i nie wiem jak to zrobić za bardzo.
_Borys_
  1. while($user1_walka !== 0) {
  2.  
  3. $user1_walka = $user_atak * 100/$user_zrecznosc + $user2_obrona + $user2_zycie;
  4. $user2_walka = $user2_atak * 100/$user2_zrecznosc + $user_obrona + $user_zycie;
  5.  
  6. }
Utilaft
Znów całe CPU hostingu wezmę biggrin.gif skrypt się wykonuje w nieskonczonosc.
_Borys_
No dopóki nie będzie zera snitch.gif , o to przecież chodziło ?
Utilaft
No ale to za długo. Może jest lepsze rozwiązanie. Tworzę pseudo grę, taką klikankę, i tworzę system walki. Chcę, aby jakoś dzialanie się robiło, póki nie wyjdzie 0 (przeciwnik nie umrze)
_Borys_
to może
  1. while($user1_walka > 0) {
  2. $user1_walka = $user_atak * 100/$user_zrecznosc + $user2_obrona + $user2_zycie;
  3. $user2_walka = $user2_atak * 100/$user2_zrecznosc + $user_obrona + $user_zycie;
  4. }


wtedy również jak będzie minus to pętla się zakończy.
Przykład działania:
  1. $c = 1;
  2. while ($c > 0)
  3. {
  4. $c = rand(-1,10);
  5. echo $c . '<br />';
  6. }
Utilaft
Ten Twój 1 przykład nie działa, i ten mój

  1. while($user1_walka < 0 || $user2_walka < 0) {
  2. $user1_walka = 10/$user_atak * 100/$user_zrecznosc + $user2_obrona + $user2_zycie;
  3. $user2_walka = 10/$user2_atak * 100/$user2_zrecznosc + $user_obrona + $user_zycie;
  4.  
  5. }
  6.  
  7.  
  8. echo 'Zadałeś przeciwnikowi obrażeń: '.$user1_walka.'<br>';
  9. echo 'Przeciwnik zadał Ci obrażeń: '.$user2_walka.'<br>';


Po prostu nie wyświetla mi zadanych obrażeń (Wyniku z działania)
Gość
Nie wiem po co stosujesz tą pętlę while. Patrząc na kod powinien być warunek if jeśli wcześniej te zmienne są gdzieś ustawiane, bo w pętli zmienne $user1_walka i $user2_walka są ciągle w obliczane w ten sam sposób, mają tą samą wartość. Ewentualnie może chcesz w pętli odejmować lub dodawać? Ale wtedy nie instrukcja = tylko += lub -=
_Borys_
Cytat(Utilaft @ 5.02.2013, 22:10:35 ) *
Ten Twój 1 przykład nie działa, i ten mój


Napisałem > 0 a nie < 0
Pętla będzie się wykonywać póki wynik większy od zera.
Utilaft
Dupa, nie działa nic. Nie wyswietla
Damonsson
Zobacz mój post:

http://forum.php.pl/index.php?showtopic=19...st&p=939823

Przerób to sobie na pętle działającą, aż któryś będzie miał 0 i tyle.
Utilaft
  1. for($user1_walka > 0; $i <= 10; $i++) {
  2.  
  3. $user1_walka = 10/$user_atak * 100/$user_zrecznosc + $user2_obrona + $user2_zycie;
  4. $user2_walka = 10/$user2_atak * 100/$user2_zrecznosc + $user_obrona + $user_zycie;
  5. $i++;
  6. echo 'runda: '.$i.'<br />';
  7. echo $user1_walka.'<br />';
  8.  
  9. }

i to też:
  1. for($i = 0; $user1_walka > 0; $i++) {
  2.  
  3. $user1_walka = 10/$user_atak * 100/$user_zrecznosc + $user2_obrona + $user2_zycie;
  4. $user2_walka = 10/$user2_atak * 100/$user2_zrecznosc + $user_obrona + $user_zycie;
  5. $i++;
  6. echo 'runda: '.$i.'<br />';
  7. echo $user1_walka.'<br />';
  8.  
  9. }


Pętli for jeszcze nie przerabiałem, i nie bardzo wiem jak się do tego zabrać.
Damonsson
  1. <?php
  2.  
  3. $player1 = '100';
  4.  
  5. $player2 = '100';
  6.  
  7. $user_atak = '5';
  8. $user_zrecznosc = '5';
  9. $user_obrona = '5';
  10.  
  11. $user2_atak = '5';
  12. $user2_zrecznosc = '5';
  13. $user2_obrona = '5';
  14.  
  15. echo "Gracz 1 zaczyna ze $player1 życia <br/>";
  16.  
  17. echo "Gracz 2 zaczyna ze $player2 życia <br/><br/><br/>";
  18.  
  19. $i = 1;
  20. while(true) {
  21. //for(;;) {
  22. $player1 = $player1 - $user2_atak - $user2_zrecznosc + $user_obrona;
  23.  
  24. $player2 = $player2 - $user_atak - $user_zrecznosc + $user2_obrona;
  25.  
  26. if ($player1 <= 0 || $player2 <= 0) {
  27.  
  28. if ($player1 < $player2) {
  29.  
  30. echo "wygrał gracz 2, gracz 1 padł";
  31.  
  32. } elseif ($player1 > $player2) {
  33.  
  34. echo "wygrał gracz 1, gracz 2 padł";
  35.  
  36. } else {
  37. echo "Remis";
  38. }
  39.  
  40. break;
  41. }
  42. echo "Runda $i <br/>";
  43.  
  44. echo "Graczowi 1 zostało $player1 życia <br/>";
  45.  
  46. echo "Graczowi 2 zostało $player2 życia <br/><br/><br/>";
  47. $i++;
  48. }
  49. ?>


Czy while, czy for to mało istotne.
Utilaft
Życia mam przypisane już z mysqla. Zaraz przetestuje


Przegrales› walke™. Przeciwnik zniszczyl cie ™.Graczowi 1 zostal‚o -100 życia
Graczowi 2 zostal‚o 1950 źycia
Zyskales›: 200 doswiadczenia
Nick: Utilaft2
Nick: Utilaft

Nie ważne jaki będzie atak i hp. czasami nawet graczowi 2 zostaje więcej żyć niż ma w bazie.

Wcześniej było złe działanie
Ma być takie:
$user1_walka = $user2_zycie - $user_atak - $user_zrecznosc + $user2_obrona;
$user2_walka = $user_zycie - $user2_atak - $user2_zrecznosc + $user_obrona;

Ale skrypt wykonuje się w nieskonczonosc.
Damonsson
Weź przerzuć się na układanie kwietników czy coś w czym może się spełnisz, dostałeś od każdego przykładowe kody, ode mnie GOTOWIEC, w którym wystarczy sobie pozmieniać parametry na własne i jeszcze masz problem.
Utilaft
Uwierz mi że tak zrobiłem.

Ale..

1. Twój kod działa, ale z tymi parametrami co dałeś, z moimi nie działa. Skrypt się wykonuje w nieskonczonosc.

2. To samo w innych.
sazian
Cytat(Utilaft @ 5.02.2013, 22:10:35 ) *
Ten Twój 1 przykład nie działa, i ten mój

  1. while($user1_walka < 0 || $user2_walka < 0) {
  2. $user1_walka = 10/$user_atak * 100/$user_zrecznosc + $user2_obrona + $user2_zycie;
  3. $user2_walka = 10/$user2_atak * 100/$user2_zrecznosc + $user_obrona + $user_zycie;
  4.  
  5. }

pomijam fakt że sam algorytm liczący jest dosyć dziwny - czym większy atak tym mniejsze obrażenia

to jest pętla nieskończona ponieważ nie modyfikujesz $user1_walka ani $user2_walka
to znaczy "modyfikujesz" ale w każdym przebiegu masz to samo ponieważ nie zmieniasz wartości żadnej ze zmiennych $user_atak $user_zrecznosc $user_obrona $user_zycie ....
czyli jeśli w pierwszym przejściu masz wynik $user1_walka = 100 a $user2_walka = 200 to w milionowym przejściu pętli dalej masz $user1_walka = 100 i $user2_walka = 200
Utilaft
Czyli jak mam to rozwiązać?
sazian
dobra weź kartkę papieru
i napisz
$user_atak=5;
$user_zrecznosc=10;
$user_obrona = 5;
$user_zycie=50;

$user2_atak=8;
$user2_zrecznosc=4;
$user2_obrona = 3;
$user2_zycie=60;

i rozpisz sobie klika pierwszych przejść pętli
czyli
przejście 1:
$user1_walka = ...
$user2_walka=...
sprawdź czy $user1_walka < 0 || $user2_walka < 0

przejście 2:
....

ile wynosi $user1_walka oraz $user2_walka po przejściu 1 a ile po przejściu 3 ?

Utilaft
Ok, poradziłem sobie. Może trochę na około ale jest.

  1.  
  2. //1 tura
  3. $user1_walka1 = $user2_atak - $user2_zrecznosc + $user_obrona;
  4. $user2_walka1 = $user_atak - $user_zrecznosc + $user2_obrona;
  5. //2 tura
  6. $user1_walka2 = $user1_walka1 - $user2_atak - $user2_zrecznosc + $user_obrona;
  7. $user2_walka2 = $user1_walka1 - $user_atak - $user_zrecznosc + $user2_obrona;
  8. //3 tura
  9. $user1_walka3 = $user1_walka2 - $user2_atak - $user2_zrecznosc + $user_obrona;
  10. $user2_walka3 = $user1_walka2 - $user_atak - $user_zrecznosc + $user2_obrona;
  11. //4 tura
  12. $user1_walka4 = $user1_walka3 - $user2_atak - $user2_zrecznosc + $user_obrona;
  13. $user2_walka4 = $user1_walka3 - $user_atak - $user_zrecznosc + $user2_obrona;
  14. //5 tura
  15. $user1_walka5 = $user1_walka4 - $user2_atak - $user2_zrecznosc + $user_obrona;
  16. $user2_walka5 = $user1_walka4 - $user_atak - $user_zrecznosc + $user2_obrona;
  17. //6 tura
  18. $user1_walka6 = $user1_walka5 - $user2_atak - $user2_zrecznosc + $user_obrona;
  19. $user2_walka6 = $user1_walka5 - $user_atak - $user_zrecznosc + $user2_obrona;
  20. //7 tura
  21. $user1_walka7 = $user1_walka6 - $user2_atak - $user2_zrecznosc + $user_obrona;
  22. $user2_walka7 = $user1_walka6 - $user_atak - $user_zrecznosc + $user2_obrona;
  23. //8 tura
  24. $user1_walka8 = $user1_walka7 - $user2_atak - $user2_zrecznosc + $user_obrona;
  25. $user2_walka8 = $user1_walka7 - $user_atak - $user_zrecznosc + $user2_obrona;
  26. //9 tura
  27. $user1_walka9 = $user1_walka8 - $user2_atak - $user2_zrecznosc + $user_obrona;
  28. $user2_walka9 = $user1_walka8 - $user_atak - $user_zrecznosc + $user2_obrona;
  29. //10 tura
  30. $user1_walka10 = $user1_walka9 - $user2_atak - $user2_zrecznosc + $user_obrona;
  31. $user2_walka10 = $user1_walka9 - $user_atak - $user_zrecznosc + $user2_obrona;
  32.  
Damonsson
Jak już się wczułeś, to rozpisz sobie dla 100 tur wink.gif
Utilaft
Hehe. Nie robił bym tego, gdybym nie wiedział co robię. Mianowicie walka będzie zawsze na 10 tur ; )
sazian
o boże facepalmxd.gif

pisząc o rozpisaniu tego na kartce miałem nadzieję że zauważysz że $user1_walka oraz $user2_walka są stałe we wszystkich przejściach pętli ale to chyba było zbyt skomplikowane

  1. while($user1_walka > 0 && $user2_walka > 0 )
  2. {
  3. $user1_walka = $user1_walka - $user2_atak - $user2_zrecznosc + $user_obrona;
  4. $user2_walka = $user2_walka - $user_atak - $user_zrecznosc + $user2_obrona;
  5.  
  6. }
  7.  

lub z limitem do dziesięciu
  1. for($i=1;$i<=10;$i++ )
  2. {
  3. $user1_walka = $user1_walka - $user2_atak - $user2_zrecznosc + $user_obrona;
  4. $user2_walka = $user2_walka - $user_atak - $user_zrecznosc + $user2_obrona;
  5. if($user1_walka < 0 || $user2_walka < 0)
  6. {
  7. break;
  8. }
  9. }
Utilaft
@up. Dzięki za kod. No właśnie zauważyłem że cały czas się to samo robiło, dlatego zrobiłem taki kod. Tą pętle for też próbowałem.
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.