![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 245 Pomógł: 4 Dołączył: 22.01.2005 Ostrzeżenie: (0%) ![]() ![]() |
Witam. Pisząc silnik gry napotkałem problem. Otóż zazwyczaj po zabiciu potwora wypadają z niego jakieś przedmioty, załóżmy że np. jest 1% szansy że wypadnie jakiś drogocenny kamień ale 20% że jakiś średni miecz. Czy istnieje jakiś algorytm który jest w stanie wybrać co wypadło wg procentu szansy ?
Pozdrawiam |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 691 Pomógł: 0 Dołączył: 19.01.2005 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Robisz tablicę, na sto elementów... (można to zrobić jakąś jedną funkcją, nie pamiętam jaką). Potem rand(), jeśli wypadło 1, dostaje kamień; else { robisz tablicę na pięć elementów, wybierasz 1, jeśli wypadło na ten jeden jedyny - dostajesz miec }
Proste, pomyśl trochę... -------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 789 Pomógł: 41 Dołączył: 30.10.2003 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
A ja to rozwiązałem tak:
W komentarzu napisałem, że pobierasz z bazy danych przedmioty sortując je wg. procentu malejąco ![]() I wcale nie jest tutaj potrzebna tablica 100-elementowa ![]() |
|
|
![]()
Post
#4
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
IMO, przekombinowaliści.
1. Losujemy procent szans, np.: 40% a) Możemy dostać każdy przedmiot, który wymaga 40% b ) ... ale i każdy, który wymaga więcj, np.: 60%, 70%, ... c) ... no oczywiście nie możemy dostać tego, któremu trzeba 5%. 2. Resztę załatwia baza. Losuje ona jeden element, który wymaga szans większych, bądź równych tym które wylosowaliśmy. Czyli dostać możemy przedmiot, który wymaga przykładowych 40% ale i taki który wymaga 80%. Ja bym to widział tak. |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 150 Pomógł: 1 Dołączył: 23.01.2004 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Robisz tablicę, na sto elementów... (można to zrobić jakąś jedną funkcją, nie pamiętam jaką). Potem rand(), jeśli wypadło 1, dostaje kamień; else { robisz tablicę na pięć elementów, wybierasz 1, jeśli wypadło na ten jeden jedyny - dostajesz miec } Proste, pomyśl trochę... Jednocześnie dokupujesz kostki RAM do serwera ![]() -------------------- Słyszałem, że macie tutaj jakieś takie php... fajne to, dobre to jest?
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Cytat załóżmy że np. jest 1% szansy że wypadnie jakiś drogocenny kamień ale 20% że jakiś średni miecz I tak dalej? A procenty uzupelniaja sie do 100? -------------------- Nie lubię jednorożców.
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
W programowaniu jak w zyciu, czym prostrzy algorytm tym efektowniejszy.
-------------------- |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 245 Pomógł: 4 Dołączył: 22.01.2005 Ostrzeżenie: (0%) ![]() ![]() |
Hmm.. Pomysł mike_mecha wydaje mi się najprostszy
![]() ![]() Pozdrawiam |
|
|
![]() ![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 1 045 Pomógł: 5 Dołączył: 8.11.2004 Skąd: trójmiasto Ostrzeżenie: (0%) ![]() ![]() |
// wersja z możliwośćią wielokrotnego wyboru
szansa['miecz'] = 20; szansa['kamien'] = 1; itd foreach ($szansa as $nazwa => $wartosc) if ( $wartosc >= rand(1,100) ) WyrzućPrzedmiot[$nazwa]; |
|
|
![]()
Post
#10
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
Cytat(php programmer @ 2005-08-29 15:26:31) // wersja z możliwośćią wielokrotnego wyboru A po co zaraz puszczać pętlę ![]() U mnie taka możliwośc jest na końcu zapytania ![]()
Zmieniasz wartość w LIMIT, lub go usuwasz i masz wielokrotny wybór. |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 487 Pomógł: 7 Dołączył: 7.01.2004 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Cytat(mike_mech) W programowaniu jak w zyciu, czym prostrzy algorytm tym efektowniejszy. Chyba miałeś na myśli - w programowaniu jak w życiu, im prostszy skrypt tym efektywniejszy... "Efektowny" to chyba nie jest odpowiednie słowo w tym miejscu. -------------------- Łukasz Dywicki
Independent Java and open source software consultant. Blog - Java, OSGi, integracja oprogramowania.. |
|
|
![]()
Post
#12
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 717 Pomógł: 0 Dołączył: 12.06.2002 Skąd: Wolsztyn..... Studia: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
Cytat IMO, przekombinowaliści. IMO niedoceniles problemu ;] Cytat $objDB->query( 'SELECT * FROM items WHERE percentage >= ' . rand( 1, 100 ) . 'ORDER BY RAND() LIMIT 1' ); // i już mamy przedmiot ![]() Tylko, ze losowany niezgodnie z zasadami podanymi na poczatku. Po wylosowaniu jakiegos progu procentowego zostaja nam tylko rekordy z wiekszym prawdopodobienstwem wystapienia niz wylosowane.. i do tego momentu jest dobrze (no prawie..), bo sposrod tych elementow losujesz kolejny niestety juz na rownych prawach, czyli jesli wylosuje sie prog dajmy na to 30% to zarownio element majacy 31% jak i element majacy prawdopodobienstwo wystapienia rowne 50% beda mialy rowne szanse przy losowaniu a tak nie mialo byc. Robilem cos podobnego niedawno w pracy (losowanie wazone), zrobilem do tego procedure, ale mysql takich mozliwosci jeszcze w wersji produkcyjnej nie daje, wiec trzeba sobie radzic inaczej ![]() ![]() -------------------- Brak czasu :/
|
|
|
![]()
Post
#13
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
Cytat(FiDO @ 2005-08-30 09:55:30) IMO niedoceniles problemu ;] Masz racje. Po tym jak wypowiedziałem się tutaj zaczął mnie ten problem nurtować. I doszedłem do takich samych wniosków co Ty. Gdyby nie to drugie losowanie ( już na takich samych prawach ) nie byłó by tak źle. Ale wprowadzenie losowania ważonego wydaje się koniecznością. |
|
|
![]()
Post
#14
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 224 Pomógł: 40 Dołączył: 6.07.2004 Skąd: Wuppertal Ostrzeżenie: (0%) ![]() ![]() |
a co jeśli przedmiotów jest hm.... 10 000... dajmy na to 100 rodzajów chełmów, 1000 rodzajów mieczy, itp itd... (tak duzo po powiedzmy generuje dynamicznie)... procent tez jest skladany dynamicznie... zakladając ze srednie prawdopodobienstwo wynosci 50%... mamy 10 000 * 50 = 500 000.
Tworzymy taka tablice po to zeby wylosowac z niej 1 element ?hm... any other ideas? |
|
|
![]()
Post
#15
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 717 Pomógł: 0 Dołączył: 12.06.2002 Skąd: Wolsztyn..... Studia: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
Wtedy gorzej.. znalazlem takie cos: http://forums.devarticles.com/t8783/s.html
Niezbyt rozumiem na pierwszy rzut oka dlaczego to dziala, ale dziala.. i jest zdecydowanie bardziej wydajne i mniej pamieciozerne. -------------------- Brak czasu :/
|
|
|
![]()
Post
#16
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 224 Pomógł: 40 Dołączył: 6.07.2004 Skąd: Wuppertal Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 245 Pomógł: 4 Dołączył: 22.01.2005 Ostrzeżenie: (0%) ![]() ![]() |
Dobrze. To teraz następny problem który pojawił się podczas pisania skryptu który walczy z czymś
![]() Pozdrawiam |
|
|
![]()
Post
#18
|
|
![]() Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Rzuc K100 i jesli wynik bedzie mniejszy niz 70 to wygra walke. No chyba ze walka wyglada: cios za cios.
-------------------- Nie lubię jednorożców.
|
|
|
![]()
Post
#19
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 717 Pomógł: 0 Dołączył: 12.06.2002 Skąd: Wolsztyn..... Studia: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
Wylosowac liczbe z przedzialu 1-100, szanse na wylosowanie liczby mniejszej lub rownej 70 sa rowne mniej wiecej wlasnie 70%, dalej powalcz sam
![]() edit: ech.. nie zdazylem ;p -------------------- Brak czasu :/
|
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 195 Pomógł: 0 Dołączył: 13.04.2004 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Gdy przeczytałem problem zaczął mnie nurtować i wpadłem na takie rozwiązanie... nie jest najlepsze, gdyż dwukrotnie musimy wykonać pętle for, ale mam nadzieję że ci się do czegoś przda
![]()
Ten post edytował L_Devil 4.09.2005, 09:40:36 -------------------- Językiem którym najlepiej operują wszyscy programiści są przekleństwa.
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 02:19 |