Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Zapętlenie
Forum PHP.pl > Forum > Przedszkole
Lethys
Pisze skrypt walki dwóch kont :


  1. <?php
  2. $mypower = rand($pistolet[dmin],$pistolet[dmax])+$stat[hp]/10+$stat[strzelanie];
  3. $edefense = rand($pistolet2[dmin],$pistolet2[dmax])+$enemy[hp]/10+$enemy[refleks];
  4. $mydef = rand($pistolet[dmin],$pistolet[dmax])+$stat[hp]/10+$stat[refleks];
  5. $epower = rand($pistolet2[dmin],$pistolet2[dmax])+$enemy[hp]/10+$enemy[strzelanie];
  6.  
  7. if ($stat[miasto] != $enemy[miasto] or $stat[page] != $enemy[page]){
  8.  
  9. print "Aby walczyć z przeciwnikiem musisz być w tym samym mieście oraz w tym samym pomieszczeniu co przeciwnik.";
  10. echo '<br><br><h1><center><a href=' . $stat[miasto] . '.php>wróć do miasta</a><h1></center>';
  11.  
  12.  
  13. }else{
  14. print "<center><b>$stat[user] vs $enemy[user]</b><br>";
  15. print "<center><br><img border=\"0\" src=\"$stat[avatar]\" width=\"80\" height=\"80\">";
  16. print " <b>VS</b> ";
  17. print "<img border=\"0\" src=\"$enemy[avatar]\" width=\"80\" height=\"80\"></center><br><br>";
  18.  
  19. $mojehp = ' . stat[hp] . ';
  20. $ehp = ' . enemy[hp] . ';
  21.  
  22. while ($mojehp==0 or $ehp==0){
  23. $los = rand(1,4);
  24. If ($los = 1 or $los = 2){
  25. $sila = 2;
  26. mysql_query("update players set hp=hp-$sila where id=$enemy[id]");
  27. print "<img src=\"images/good.jpg\">Strzelasz do <b>$enemy[user]</b>, zadejesz mu $sila obrażeń [pozostało $enemy[hp] życia]<br>";
  28. }
  29. }else{
  30. $sila = 2;
  31. mysql_query("update players set hp=hp-$sila where id=$stat[id]");
  32. print "<img src=\"images/bad.jpg\"><b>$enemy[user]</b> strzela do Ciebie i zadej Ci $sila obrażeń [pozostało $stat[hp] życia]<br>";
  33. }
  34. }
  35. }
  36. ?>


Ten skrypt powinien z kazda petla losowac kto uderzy i odejmowac 2 HP. Problem jest taki że atakuje zawsze tylko jeden gracz oraz nic nie odejmuje graczowi zycia.

Czyli user 1 atakuje 1000 razy usera 2 zadajac 2 pkt ograzen a ciagle przeciwnik ma 100 hp i walka sie nie konczy.
nospor
Ile razy można to przerabiać...
Sprawdź jak dokładnie wygląda zapytanie
echo "update players set hp=hp-$sila where id=$enemy[id]";
sprawdź czy się dobrze wykonuje - mysql_error().

O tym wszystkim masz napisane w temacie:
Temat: Jak poprawnie zada pytanie
który już ci dawałem do przestudiowania. Naprawdę podane tam informacje nie są naszym wybrykiem natury a przydatnymi informacjami w rozwiązywaniu banalnych problemów

edit:
while ($mojehp==0 or $ehp==0){
oznacza to, że pętla będzie się wykonywała dopóki twoje hp lub przeciwnika będzie równe zero - dziwny warunek.
Na dodatek, w pętli nigdzie nie zmieniasz tych wartości, więc jesli raz ci wejdzie w tę pętlę to z niej nie wyjdzie. Analizujesz czasami to co piszesz?

edit2:
$mojehp = ' . stat[hp] . ';
$ehp = ' . enemy[hp] . ';
A co to ma byc? przeciez przypisujesz tutaj tekst '. stat[hp] . ' a nie wartość $stat[hp]. Nic dziwnego ze masz spełniony warunek
while ($mojehp==0 or $ehp==0){
smile.gif Tekst w porównaniu do 0 daje 0
thek
Po pierwsze: A pętla while nie trwa do czasu aż warunek przestaje być prawdziwy? winksmiley.jpg Jak więc while( $hp_moje == 0 || $hp_wroga == 0) ma być choć raz zrobione, skoro na dzień dobry ma FALSE? Jak dla mnie raczej while( $hp_moje > 0 && $hp_wroga > 0), bo wtedy przerwie w chwili gdy życie jednego spadnie do 0 lub niżej. To istotne zwłaszcza tym bardziej, że masz dynamiczne wartości ataku i obrony(!).

Po drugie: po co zarżynać bazę robiąc każdą akcję po kolei do niej? Prościej i o niebo wydajniej jest zapisywać wszystkie akcje/łupy/obrażenia w postaci tablicy, potem ją serializować i zapisać do bazy. Zwróć uwagę... Najpierw zapis wszystkiego do tablicy w PHP, a dopiero na koniec wrzucenie tego do bazy. Co lepsze? Zapis całej akcji w jednym rekordzie, czy kombinowanie z wieloma rekordami, których bez problemów może być kilkadziesiąt. Zwróć uwagę na wydajność. Obliczenia po stronie php są szybkie i całość ograniczy do nich+zapis do bazy 1 rekordu. Z drugiej strony kilkadziesiąt zapisów do bazy i brak w tej chwili zapisu stanu. Po prostu zamiast odejmować w PHP, robisz to w bazie. Gwoździe wbijasz za pomocą trzonka piły do drewna. Niby też można, tylko po co?

Po trzecie: wspomniane przez nospora zapomniane zmienianie wartości punktów hp obu graczy. To, że żaden z graczy nie walczy to efekt właśnie braku odejmowania i dodatkowo tego, że nawet nie wchodzi do pętli co opisałem w punkcie pierwszym.
nospor
Cytat
Po pierwsze: A pętla while nie trwa do czasu aż warunek przestaje być prawdziwy? Jak więc while( $hp_moje == 0 || $hp_wroga == 0) ma być choć raz zrobione, skoro na dzień dobry ma FALSE? Jak dla mnie raczej while( $hp_moje > 0 && $hp_wroga > 0), bo wtedy przerwie w chwili gdy życie jednego spadnie do 0 lub niżej. To istotne zwłaszcza tym bardziej, że masz dynamiczne wartości ataku i obrony(!).

Cytat
Po trzecie: wspomniane przez nospora zapomniane zmienianie wartości punktów hp obu graczy. To, że żaden z graczy nie walczy to efekt właśnie braku odejmowania i dodatkowo tego, że nawet nie wchodzi do pętli co opisałem w punkcie pierwszym.

@thek przeczytaj jeszcze raz moje edity z poprzedniego posta a zrozumiesz, że własnie mu wchodzi w pętle i nie chce wyjść winksmiley.jpg
thek
Jak może wejść w pętlę, skoro warunek w while jest nieprawidłowy? Ja rozumiem do-while i wykonanie się jednokrotne, bo wtedy OK. Ale powiedz jakim cudem przy jego warunku mogło do pętli wejść. Jedyne co to gdy chociaż jedna z nich była niezadeklarowana przed nią i php domyślnie ją utworzył oraz zainicjował zerem, bo wtedy spełniłby się warunek równości z 0. Innej możliwości nie widzę.

Aaaaa... Teraz widzę ten tekst zamiast zmiennych w Twoim edit2 smile.gif Czyli niezainicjowane zmienne stają się zerami co ja opisałem jako podejrzenie. Swoją drogą odejmowanie życia graczom z użyciem bazy jest jak dla mnie poronione winksmiley.jpg Gdyby to chociaż było w formie zapisu rekordu by potem raport wygenerować to jeszcze jakoś rozumiem, ale tak jak teraz to jest z deczka bezsensowne.
nospor
Cytat
Czyli niezainicjowane zmienne stają się zerami
Ależ nie, zmienne są zainicjowane. Ino że tekstem:
$mojehp = ' . stat[hp] . ';
A sam wiesz jak wygląda przyrównanie tekstu do 0 winksmiley.jpg

edit: to też jest ciekawe:
If ($los = 1 or $los = 2){
smile.gif

@Lethys jesteś na forum tyle lat... mógłbyś już naprawdę znać podstawy języka php...
Lethys
Obecnie mój skrypt wygląda tak :

  1. $hp_moje = $stat[hp];
  2. print "moje życie $hp_moje<br>";
  3. $hp_wroga = $enemy[hp];
  4. print "życie przeciwnika $hp_wroga";
  5.  
  6. // sprawdzam czy życie nie jest wartością 0, jest 100 czyli wszystko ok
  7.  
  8. while($hp_moje > 0 && $hp_wroga > 0){
  9.  
  10. // walka ma trwać do momentu kiedy jeden z graczy będzie miał 0 hp
  11.  
  12. $los = rand(1,4);
  13. //losowanie kto pierwszy uderzy
  14. If ($los = 1 or $los = 2){
  15.  
  16. // losowana siła uderzenia
  17. $sila = rand(1,5);
  18.  
  19. // powinno odjąć graczowi z życia wartość wylosowanej siły, nie odejmuje oraz nie zwraca żadnego błędu
  20. mysql_query("update players set hp=hp-$sila where id=$enemy[id]") or mysql_error();
  21. print "<img src=\"images/good.jpg\">Strzelasz do <b>$enemy[user]</b>, zadejesz mu $sila obrażeń [pozostało $enemy[hp] życia]<br>";
  22.  
  23. // to samo tylko w przypadku kiedy przeciwnik pierwszy atakuje
  24. }elseif ($los = 3 or $los = 4){
  25. $sila = rand(1,5);
  26. mysql_query("update players set hp=hp-$sila where id=$stat[id]") or mysql_error();
  27. print "<img src=\"images/bad.jpg\"><b>$enemy[user]</b> strzela do Ciebie i zadej Ci $sila obrażeń [pozostało $stat[hp] życia]<br>";
  28. }
  29. }


dla mnie wszystko jest tutaj jasne czarne na białym a mimo to skrypt nie działa sad.gif

W praktyce wygląda to tak :

Cytat
Strzelasz do lolek, zadejesz mu 2 obrażeń [pozostało 100 życia]
Strzelasz do lolek, zadejesz mu 3 obrażeń [pozostało 100 życia]
Strzelasz do lolek, zadejesz mu 3 obrażeń [pozostało 100 życia]
Strzelasz do lolek, zadejesz mu 5 obrażeń [pozostało 100 życia]
Strzelasz do lolek, zadejesz mu 5 obrażeń [pozostało 100 życia]
Strzelasz do lolek, zadejesz mu 4 obrażeń [pozostało 100 życia]
Strzelasz do lolek, zadejesz mu 5 obrażeń [pozostało 100 życia]
Strzelasz do lolek, zadejesz mu 4 obrażeń [pozostało 100 życia]....
i tak bez końca



Jest ktoś w stanie mi pomóc z tym skryptem ?

Z góry dziękuje
nospor
1)nie:or mysql_error();
a: or die(mysql_error());

2) $hp_moje > 0 && $hp_wroga > 0
@Lethys czy ty naprawdę myslisz ze te dwie zmienne same się zmniejszą? Ty ich nigdzie nie zmniejszasz...nigdzie....
Lethys
Dzięki nospor smile.gif

zrobiłem to tak :

  1. while($hp_moje > 0 && $hp_wroga > 0){
  2. $los = rand(1,4);
  3. If ($los = 1 or $los = 2){
  4. $sila = rand(1,5);
  5. $hp_wroga = $hp_wroga - $sila;
  6. mysql_query("update players set hp=hp-$sila where id=$enemy[id]") or die(mysql_error());
  7. print "<img src=\"images/good.jpg\">Strzelasz do <b>$enemy[user]</b>, zadejesz mu $sila obrażeń [pozostało $hp_wroga życia]<br>";
  8. }elseif ($los = 3 or $los = 4){
  9. $sila = rand(1,5);
  10. $hp_moje = $hp_moje - $sila;
  11. mysql_query("update players set hp=hp-$sila where id=$stat[id]") or die(mysql_error());
  12. print "<img src=\"images/bad.jpg\"><b>$enemy[user]</b> strzela do Ciebie i zadej Ci $sila obrażeń [pozostało $hp_moje życia]<br>";
  13. }
  14. }
  15. }


I teoretycznie działa, tylko właśnie jest kolejny problem.

W pętli nie losuje kto będzie atakować tylko wyświetla.

Cytat
Strzelasz do lolek, zadejesz mu 2 obrażeń [pozostało 98 życia]
Strzelasz do lolek, zadejesz mu 5 obrażeń [pozostało 93 życia]
Strzelasz do lolek, zadejesz mu 4 obrażeń [pozostało 89 życia]
Strzelasz do lolek, zadejesz mu 4 obrażeń [pozostało 85 życia]
Strzelasz do lolek, zadejesz mu 1 obrażeń [pozostało 84 życia]
Strzelasz do lolek, zadejesz mu 1 obrażeń [pozostało 83 życia]
Strzelasz do lolek, zadejesz mu 1 obrażeń [pozostało 82 życia]
Strzelasz do lolek, zadejesz mu 2 obrażeń [pozostało 80 życia]
...


przecież w kodzie mam zaraz na początku pętli zrobione losowanie.

nospor
poczytaj jaka jest roznica miedzy = a ==
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.