![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 62 Pomógł: 2 Dołączył: 29.12.2006 Skąd: Polska, gliwice Ostrzeżenie: (0%) ![]() ![]() |
pisze gre w php i mysql i chcialbym poznac najprostrzy sposob rozwiazania mojego problemu:
otoz chce zeby kazdemu uzytkownikowi co minute dodawala sie jakas wartosc (automatycznie) do danego wiersza w tabeli z danymi (np. drewno +5 co minute) sry za chaotyczne pisanie prosze o szybka odpowiedz |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Przyjaciele php.pl Postów: 1 224 Pomógł: 40 Dołączył: 6.07.2004 Skąd: Wuppertal Ostrzeżenie: (0%) ![]() ![]() |
musisz uzyc narzędzia 'cron'.
robisz skrypt w phpie, w nim zwykłe zapytanie update ... drewno = drewno + 5 a cronem stawiasz by uruchamiał co 5 minut ten skrypt, i po problemie. |
|
|
![]()
Post
#3
|
|
Grupa: Przyjaciele php.pl Postów: 463 Pomógł: 49 Dołączył: 27.12.2007 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
tez się nad tym problemem zastanawiałem (tez kiedyś miałem zamiar zrobić grę) i doszedłem do wniosku ze pomysł z cron'em nie jest za bardzo wydajny ponieważ wywoływać ten sam skrypt co 5 minut i znając życie ten skrypt nie będzie zawierał jednego zapytania do bazy doliczając do tego wszystkich userów hmm raczej bym tego nie polecał
Przepraszam ze nie zmiaescilem innego rozwiazania ale jeszcze na nie wpadlem chcialem przedstawic sowje zdanie pozdrawiam |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 603 Pomógł: 131 Dołączył: 24.07.2007 Skąd: Górny Śląsk Ostrzeżenie: (0%) ![]() ![]() |
Ja bym to zrobił tak:
Mam zapisane w bazie danych kiedy user ostatnio widział ile ma drewna (czasDrewna) oraz ile wtedy tego drewna miał. User loguje się 2. raz (tzn chodzi mi o to, że powinien zobaczyć już zaktualizowaną wartość drewna) to sprawdzam czy to 'logowanie' ma miejsce 5 minut lub więcej od czasuDrewna. Jeśli tak to obliczam (nie chce mi się teraz myśleć, ale nie powinno być najmniejszego problemu, żeby to obliczyć) ile powinien mieć tego drewna więcej od czasu kiedy widział je ostatnio. Po obliczeniu aktualizujemy ilość drewna w bazie oraz czas kiedy to było. PS. Jest tu tylko trochę do przemyślenia z czasem: jeśli np. od ostatniego widzenia drewna do nast. minęło 5min i 12 sek. to zamiast dodawać 5,jakieś_grosze_po_przecinku to wg mnie lepiej dać 5 i do czasu zapisanego w bazie dodać tylko to 5 minut. PS2. Mam nadzieję, że pomogłem:) Pzdr. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 62 Pomógł: 2 Dołączył: 29.12.2006 Skąd: Polska, gliwice Ostrzeżenie: (0%) ![]() ![]() |
Z tym ostatnim widzeniem drewna jest ciezko a dodawane drewno nie będzie sprawiedliwe.
Za dużo kombinujemy. Ale jak robią to w innych grach?? Np. Ogame, plemiona?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) z góry dziękuję PS. Chciałbym też żeby ilość produkowanego drewna była zależna od poziomu mojego tartaku (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Dajcie jakieś rady! Szczególnie rady Ekspertów |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 162 Pomógł: 26 Dołączył: 19.01.2007 Ostrzeżenie: (0%) ![]() ![]() |
Rozwiązanie z zapamiętywaniem czasu jest najprostsze, nie obciąża praktycznie bazy. W swoim projekcie używam takiego zapytania:
gdzie: czas_surowce to czas ostatniego "widzenia" surowców przyrost_metal - przyrost w jednostkach na sekundę Myślę że analogicznie jest w oGame i innych |
|
|
![]() ![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 62 Pomógł: 2 Dołączył: 29.12.2006 Skąd: Polska, gliwice Ostrzeżenie: (0%) ![]() ![]() |
Jeszcze 2 pytania:
rozumiem ze mam dopisac warunek where z id? przyrost_metal to kolumna? czas_surowce ma miec typ Date? thx za pomoc! Ten post edytował empuszek 31.12.2007, 20:24:27 |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 603 Pomógł: 131 Dołączył: 24.07.2007 Skąd: Górny Śląsk Ostrzeżenie: (0%) ![]() ![]() |
Z tym ostatnim widzeniem drewna jest ciezko a dodawane drewno nie będzie sprawiedliwe.[...] Jak to nie bedzie sprawiedliwie? Wszystko bedzie ok. A co do tego czasu widzenia drewna to nie ma najmniejszego problemu. Wystarczy w kazdym miejscu, gdzie user widzi stan drewna wywoływac funkcję. A w tej funkcji zrobic to sprawdzanie czy uplynelo to 5 minut, w niej także dodawać drewno (jesli minelo to 5 minut lub więcej) . A co do uzależnienia ilosci dodawanego drewna w zależności od stanu np. tartaku to tak bym przykładowo zmodyfikował ten wzór: stan_metal =stan_metal +(TIMESTAMPDIFF(SECOND,czas_surowce,NOW())*(przyrost_metal*(5+poziom_tartaku))) ,.... PS. No widzisz sam, że to moje rozwiazaniejest dobre:) Ten post edytował lord_t 1.01.2008, 01:47:02 |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 162 Pomógł: 26 Dołączył: 19.01.2007 Ostrzeżenie: (0%) ![]() ![]() |
przyrost_metal to kolumna. Wartość w niej zapisana jest obliczana ze wzoru który uwzględnia poziom kopalni.
czas_surowce jest typu Date. Wydaje mi się że warunek where nie jest konieczny - stan surowców będzie aktalizowany dla wszystkich graczy. Jedynym ograniczeniem może być różnica czasu wykonywania zapytania dla jednego/wszystkich graczy. Trzeba by to było sprawdzić. Jeżeli chcesz aby gracze na urlopie nie mieli wydobycia wóczas musisz to umieścić w WHERE |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 62 Pomógł: 2 Dołączył: 29.12.2006 Skąd: Polska, gliwice Ostrzeżenie: (0%) ![]() ![]() |
Dziękuję, rozwiązaliście mój problem, teraz surowce bdb się dodają i jest git;
PAPA PS> czas_surowce nie powinien być typu DATETIME? U mnie chodzi na Datetime; |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 162 Pomógł: 26 Dołączył: 19.01.2007 Ostrzeżenie: (0%) ![]() ![]() |
Racja. Pisząc date miałem na myśli datetime U mnie też działa na timestamp
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 62 Pomógł: 2 Dołączył: 29.12.2006 Skąd: Polska, gliwice Ostrzeżenie: (0%) ![]() ![]() |
Następny problem:
chce żeby przyrost nie był aż tak duży jak 1drewno/1sek. przy_metal będzie musiał mieć typ FLOAT ale stan_metal nie akceptuje ułamkow i sie wiesza. stan_metal może być float? Czy w Timestampdiff interwał mozna ustawic na 5 sek? |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 162 Pomógł: 26 Dołączył: 19.01.2007 Ostrzeżenie: (0%) ![]() ![]() |
Myślę że lepiej jest to zrobić na liczbach całkowitych. stan_metal powinien być nawet BIGINT. Funkcja TIMESTAMPDIFF(SECOND,x,y) zwraca różnicę czasu między dwiema datami w sekundach. Możesz spróbować zmienić SECOND na minuty lub godziny. Ale lepiej jest:
wówczas przyrost jest w jednostkach na godzinę. |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 62 Pomógł: 2 Dołączył: 29.12.2006 Skąd: Polska, gliwice Ostrzeżenie: (0%) ![]() ![]() |
jeśli stan_metal to INT lub BIGINT to dodawane do niego ułamki z powstałego przy_metal/3600 zawieszą stan_metal poniewaz INT nie przyjmuje ułamków
|
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 162 Pomógł: 26 Dołączył: 19.01.2007 Ostrzeżenie: (0%) ![]() ![]() |
Nie dodawaj ułamków. Zaokrąglaj dodawane wartości do INT. Aby uniknąć gubienia częci ułamkowych można zmodyfikować czas_surowce=NOW() na taki czas w którym podstawiana do stanu wartość była dokładnie równa zaokrąglonej. Można też modyfikować stan jak najrzadziej wystarczy tylko przy logowaniu oraz przy rozbudowaniu kopalni o kolejny poziom. Aby wyświetlić aktualny stan przy odświeżaniu strony użyj wzoru podanego przeze mnie na początku. Odradzałbym użycie typu FLOAT.
|
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 62 Pomógł: 2 Dołączył: 29.12.2006 Skąd: Polska, gliwice Ostrzeżenie: (0%) ![]() ![]() |
a jak to zaokrąglić?
|
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 19 Pomógł: 1 Dołączył: 10.07.2006 Ostrzeżenie: (0%) ![]() ![]() |
Ja też borykałem się z podobnymi problemami przy tworzeniu gry i rozwiązałem to tak, że w każym pliku na początku dołączałem plik update.php.
W pliku update znajdowało się zapytanie które z mysql pobierało czas ostatniej aktualizacji (była to osobna tabela z różnymi pierdołami i tam też to się znajdowało) i potem następowało dodawanie surowca tyle ile potrzeba oraz zmiana daty aktualizacji na NOW(). Działało to tak, że gdy nikogo nie było online liczba surowca się nie zmieniała ale gdy ktoś się pojawił było to na bierząco aktualizowane. |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 62 Pomógł: 2 Dołączył: 29.12.2006 Skąd: Polska, gliwice Ostrzeżenie: (0%) ![]() ![]() |
heh, o tym to wiem ale jak zaokrąglić liczbę typu float z poziomu MYSQL.....
spójrz do góry |
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 19 Pomógł: 1 Dołączył: 10.07.2006 Ostrzeżenie: (0%) ![]() ![]() |
Niewiem jak w mysql ale w php funkcje do zaokrąglania to:
round() - zaokrąglanie normalne floor() - zaokr. w dół ceil() - zaokr. w górę http://dev.mysql.com/doc/refman/5.0/en/mat...-functions.html |
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 08:53 |