Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Gra przeglądarkowa i walka
Forum PHP.pl > Forum > PHP
darkking
Witajcie !
Pisze własna grę przez przeglądarkę. Jednak natknąłem się na pewien problem. Chciałbym zrobić aby walka w grze nie byłą aż tak przewidywalna, tz. o wygranej nie mają decydować czynniki tj. obrona, atak itp. Chciałbym jakoś dodać do walki elementy losowe.
Czy znacie może jakieś algorytmy które się do tego przydadzą ? Jedyne co mi przychodzi do głowy to algorytm prawdopodobieństwa przy przewidywaniu ataków.
greycoffey
rand i algorytm szybszy: mt_rand
darkking
nie chodziło mi o losowanie, lecz o obliczenie prawdopodobieństwa wybrania danego ataku przez gracza biorąc pod uwagę cechy postaci (atrybuty). Czyli, jeśli gracz ma dużą szybkość ataku, zaatakuje szybkim ciosem, jeśli dużą siłę to prawdopodobnie będzie to najpierw silny cios, a później szybki.
krowal
...a prawdopodobieństwo obliczysz korzystając z rand() biggrin.gif

taki najprostszy algorytm:
  1. $sila = 100;
  2. $zrecznosc = 150;
  3. if (rand(0, $sila+$zrecznosc) > $sila){
  4. //szybki atak
  5. }else{
  6. //silny atak
  7. }
Piogola
To ty musisz stworzyć algorytm, który obliczy szansę ataku. Bierzesz pod uwagę wszystkie lub część umiejętności, ekwipunku i tworzysz odpowiedni algorytm.
darkking
Dziękuję bardzo za odpowiedzi smile.gif już się wziąłem za projektowanie tego "ustrojstwa" biggrin.gif
Kshyhoo
Kiedyś znalazłem w sieci takie cudo, może Ci się przyda:
  1. function bitwa($a_spy, $a_archer, $a_sword, $a_knight, $a_spear, $a_snob, $d_spy, $d_archer, $d_sword, $d_knight, $d_spear, $d_snob, $luck, $a_a_tech, $a_s_tech, $a_k_tech, $a_sp_tech, $d_a_tech, $d_s_tech, $d_k_tech, $d_sp_tech, $pal) {
  2. $luck+=100;
  3. $luck/=100;
  4.  
  5. $atak_zwiad=$a_spy;
  6. $atak_zwiad*=$luck;
  7. $bon=$pal*5+100;
  8. $bon/=100;
  9. $atak=$a_archer*(5+$a_a_tech*5)+$a_sword*(15+$a_s_tech*5)+$a_knight*(105+$a_k_tech*5)+$a_spear*(100+$a_sp_tech*5)+$a_snob*150;
  10.  
  11. $atak*=$luck;
  12. $a_suma=$a_spy+$a_archer+$a_sword+$a_knight+$a_spear+$a_snob;
  13. if($atak_zwiad==null){$atak_zwiad=1;}
  14. if($atak==null){$atak=1;}
  15.  
  16. $obrona_zwiad=$d_spy;
  17.  
  18. $obrona_vszwarcie=$d_archer*(90+$d_a_tech*5)+$d_sword*(60+$d_s_tech*5)+$d_knight*(20+$d_k_tech*5)+$d_spear*(20+$d_sp_tech*5)+$d_snob*50+$pal*100;
  19. $obrona_vszwarcie*=$bon;
  20. $obrona_vsdystans=$d_archer*(30+$d_a_tech*5)+$d_sword*(95+$d_s_tech*5)+$d_knight*(20+$d_k_tech*5)+$d_spear*(25+$d_sp_tech*5)+$d_snob*40+$pal*100;
  21. $obrona_vsdystans*=$bon;
  22. if($obrona_vszwarcie<0){$obrona_vszwarcie=0;}
  23. if($obrona_vsdystans<0){$obrona_vsdystans=0;}
  24.  
  25. $d_suma=$d_zwiad+$d_archer+$d_sword+$d_knight+$d_spear+$d_snob;
  26.  
  27. if($obrona_vszwarcie==null){$obrona_vszwarcie=1;}
  28. if($obrona_vsdystans==null){$obrona_vsdystans=1;}
  29.  
  30. if($obrona_zwiad<$atak_zwiad){
  31. $k=$obrona_zwiad/$atak_zwiad;
  32. $diff_k=1-($atak_zwiad-$obrona_zwiad)/$atak_zwiad;
  33. $a_spys=($a_spy*$k)*$diff_k;}
  34. else{$a_spys=$a_spy;}
  35.  
  36. $diff_z=$atak/$obrona_vszwarcie;
  37. $diff_d=$atak/$obrona_vsdystans;
  38. $t=0;
  39. if($diff_d>=1){$a_archers=$a_archer*($obrona_vsdystans/$atak); $t+=$a_archers;} else {$a_archers=$a_archer;}
  40. if($diff_z>=1){$a_swords=$a_sword*($obrona_vszwarcie/$atak); $t+=$a_swords;} else {$a_swords=$a_sword;}
  41. if($diff_z>=1){$a_knights=$a_knight*($obrona_vszwarcie/$atak); $t+=$a_knights;} else {$a_knights=$a_knight;}
  42. if($diff_d>=1){$a_spears=$a_spear*($obrona_vsdystans/$atak); $t+=$a_spears;} else {$a_spears=$a_spear;}
  43. if($diff_z>=1){$a_snobs=$a_snob*($obrona_vszwarcie/$atak); $t+=$a_snobs;} else {$a_snobs=$a_snob;}
  44. if($t>=$a_suma){$t=true;}
  45. if($atak>1){if($diff_d>=1||$t==true){$d_spys=$d_spy;} else {$d_spys=$d_spy*$diff_z;}}
  46. if($diff_z>=1||$t==true){$d_archers=$d_archer;} else {$d_archers=$d_archer*$diff_z;}
  47. if($diff_d>=1||$t==true){$d_swords=$d_sword;} else {$d_swords=$d_sword*$diff_d;}
  48. if($diff_d>=1||$t==true){$d_knights=$d_knight;} else {$d_knights=$d_knight*$diff_d;}
  49. if($diff_z>=1||$t==true){$d_spears=$d_spear;} else {$d_spears=$d_spear*$diff_z;}
  50. if($diff_d>=1||$t==true){$d_snobs=$d_snob;} else {$d_snobs=$d_snob*$diff_d;}
  51.  
  52.  
  53. $a_spys=round($a_spys);
  54. $d_spys=round($d_spys);
  55. $d_archers=round($d_archers);
  56. $d_swords=round($d_swords);
  57. $d_knights=round($d_knights);
  58. $d_spears=round($d_spears);
  59. $d_snobs=round($d_snobs);
  60. $a_archers=round($a_archers);
  61. $a_swords=round($a_swords);
  62. $a_knights=round($a_knights);
  63. $a_spears=round($a_spears);
  64. $a_snobs=round($a_snobs);
  65. if($a_spys>$a_spy){$a_spys=$a_spy;}
  66. if($a_archers>$a_archer){$a_archers=$a_archer;}
  67. if($a_swords>$a_sword){$a_swords=$a_sword;}
  68. if($a_knights>$a_knight){$a_knights=$a_knight;}
  69. if($a_spears>$a_spear){$a_spears=$a_spear;}
  70. if($d_spys>$d_spy){$d_spys=$d_spy;}
  71. if($d_archers>$d_archer){$d_archers=$d_archer;}
  72. if($d_swords>$d_sword){$d_swords=$d_sword;}
  73. if($d_knights>$d_knight){$d_knights=$d_knight;}
  74. if($d_spears>$d_spear){$d_spears=$d_spear;}
  75. $straty="$a_spys, $a_archers, $a_swords, $a_knights, $a_spears, $a_snobs, $d_spys, $d_archers, $d_swords, $d_knights, $d_spears, $d_snobs";
  76. return $straty;
  77. }
  78.  
  79. $straty=bitwa($rozk[5], $rozk[6], $rozk[7], $rozk[8], $rozk[9], $rozk[11], $village2[8], $village2[9], $village2[10], $village2[11], $village2[12], $village2[13], $luck, $tech[0], $tech[1], $tech[2], $tech[3], $village2[14], $village2[15], $village2[16], $village2[17], $village2[19]);
  80. $straty=explode(",",$straty);
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.