Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Zapętlenie
Lethys
post
Post #1





Grupa: Zarejestrowani
Postów: 642
Pomógł: 2
Dołączył: 9.03.2006

Ostrzeżenie: (30%)
XX---


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
Post #2





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




Po pierwsze: A pętla while nie trwa do czasu aż warunek przestaje być prawdziwy? (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post

Posty w temacie


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: 16.10.2025 - 08:45