System Walki

0

Witam, piszę dość rozbudowany Combat System w PHP. Mamy dwóch walczących z konkretnymi statystykami (zręczność, celność, siła, itp.). Za pomocą algorytmu obliczyłem szansę na trafienie Walczącego nr. 1. Załóżmy że jego szansa na trafienie to 40%, a walka ma 10 rund. Jak, w pętli, uwzględnić kiedy gracz trafi, a kiedy nie, tak aby na 10 rund, 40% razy trafił (czyli aby trafił 4 razy)?

Próbowałem zrobić to tak:
40% to 40/100, czyli 4/10, a to jest 2/5. Wywoływałem w środku pętli funkcję rand(2, 5), a następnie warunek:

if(rand(2,5) == 2) {
// uderzył
} else {
// chybił
}

jednak to raczej się nie sprawdza. Krótko mówiąc, daje zły efekt.

Jak mogę to rozwiązać ten problem? Nic nie przychodzi mi do głowy, oprócz tego aby zapisać w zmiennej że gracz ma trafić cztery razy (40% z 10), a następnie nakazać by pierwsze cztery okrążenia pętli były trafne, a pozostałe nie. Nie wyglądałoby to jednak profesjonalnie, dlatego zależy mi na innym rozwiązaniu.

Z góry dziękuję za pomoc, Alegres =)

0
if (rand(1, 100) <= $szansa) {
// trafił
} else {
// chybił
}

Gdzie $szansa oznacza, ile procent masz szansy na trafienie. W wypadku $szansa == 0, zero będzie poza zbiorem wartości rand. Dla $szansa == 1 kwestia trafienia to 1 przypadek na 100. Dla $szansa == 2 trafienie odbywa się w 2 przypadkach na 100, etc.

0

Jeżeli to nie ma być prawdziwa szansa 40% na trafienie, czyli równie dobrze możesz w walce w ogóle nie trafić albo trafić za każdym razem, to wybierz rozwiązanie, które masz wyżej.

Ale jeżeli chcesz, żeby za każdym mając 40% szansę trafiał 4 razy na 10:

$chance = 40; // % szans na trafienie
$rounds = 12; // ilość walk

$fights = range(1, $rounds);
shuffle($fights);
$fights = array_slice($fights, 0, $chance / 100 * $rounds);
sort($fights);

print_r($fights);

W masz numery rund, w których trafisz.

0

Bardzo dziękuję Rev, tak właśnie zrobię. Za pierwszą odpowiedź również dziękuję, jednak funkcja rand() jest mało skuteczna. Problem rozwiązany ;)

2

Nie jest mało skuteczna, tylko nie umiesz jej używać.

0

Dlatego bardzo proszę, wytłumacz mi jak ją odpowiednio użyć. Takie rozwiązanie byłoby zdecydowanie najlepsze, gdyż w bardzo prosty sposób mógłbym dodać szansę na podwójne trafienie oraz szansę na trafienie krytyczne.

0

Powyżej wkleiłem prawidłowy snippet, poprzednie Twoje użycie było absurdalne, bo poprosiłeś o liczbę z przedziału <2, 5> i porównałeś z dwójką. W praktyce jest jeden przypadek na trzy możliwe na uzyskanie takiej sytuacji, czyli szansa 33%. Faktycznie wtedy założenia nie były spełnione.

0

Przepraszam, muszę się wyspać. Faktycznie zaproponowany przez ciebie rand może rozwiązać sprawę. Bardzo dziękuję.

0

Tyle że twoja propozycja sprawia, że czasem trafi 5 razy, czasem 6, czasem 7, a czasem 1 =(

0

Tezca~ tyle że skoro obliczyłem już za pomocą algorytmu, który bierze pod uwagę statystyki dwóch ścierających się ze sobą graczy, to nie chciałbym, aby przez zbieg okoliczność zawodnik który ma 50% szans na trafienie przegrał z zawodnikiem mającym 30% szans na trafienie.

0

Pooglądaj amerykańskie filmy, tam zawsze główny_zły jest nie do zabicia, ale wyjątkowo potyka się i przewraca w najlepszym momencie w wyniku czego przegrywa walkę z chudym fajtłapą głównym bohaterem :>.

Czasami po prostu tak jest że wygrywa gorszy (a przy dwóch równych sobie, raz wygrywa jeden a raz drugi).
Ale jeśli naprawdę zależy Ci na tym żeby gra była deterministyczna... Oczywiście, można i sposobem Reva.

0

Okej, napisałem stuobrotową pętlę i faktycznie, jest to dość sprawiedliwe losowanie szans na trafienie. Krótko mówiąc, sprawdzi się. Bardzo dziękuję.

0
Demonical Monk napisał(a)

Powyżej wkleiłem prawidłowy snippet, poprzednie Twoje użycie było absurdalne, bo poprosiłeś o liczbę z przedziału <2, 5> i porównałeś z dwójką. W praktyce jest jeden przypadek na trzy możliwe na uzyskanie takiej sytuacji, czyli szansa 33%. Faktycznie wtedy założenia nie były spełnione.

przedzial <2,5> to liczby 2,3,4,5, czyli 1 przypadek na 4 -> 25% szans a nie 33% ...

0
domisPL napisał(a)
Demonical Monk napisał(a)

Powyżej wkleiłem prawidłowy snippet, poprzednie Twoje użycie było absurdalne, bo poprosiłeś o liczbę z przedziału <2, 5> i porównałeś z dwójką. W praktyce jest jeden przypadek na trzy możliwe na uzyskanie takiej sytuacji, czyli szansa 33%. Faktycznie wtedy założenia nie były spełnione.

przedzial <2,5> to liczby 2,3,4,5, czyli 1 przypadek na 4 -> 25% szans a nie 33% ...

Fakt, pomyłka, ale to wciąż nie daje oczekiwanej szansy...

1 użytkowników online, w tym zalogowanych: 0, gości: 1