Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Naliczanie punktów w grze typu MMOSG
Forum PHP.pl > Forum > PHP
andrew747
Witam,
Ostatnio zabrałem się za tworzenie gry MMOSG(np. travian)... Całkiem sprawnie mi to idzie, ale natrafiłem na mały problem... Otóż w grze potrzebuję zamieścić skrypt, który naliczałby liczbę surowców na godzinę(np. Drewno 33 na godzinę) nawet jeśli przeglądarka byłaby wyłączona... Może ktoś wie jak to zrobić questionmark.gif Bardzo proszę o odpowiedź...
Moli
Możesz zrobić to na dwa sposoby. Pierwszy to cron (poczytaj w necie jak nie wiesz co to), drugi sposó to zapisywanie daty ostatniego logowania i przy wejściu pobieranie ilość godzin jaka mineła od ostatniego logowania i mnożenie przez liczbę surowców.
andrew747
No dobra... zaraz poszukam... Wielkie dzięki smile.gif
Synapsa
CRON NIE!!Obciąża serwer a można zrobić to w prosty sposób.
W tabeli z surowcami trzeba sobie zrobić pare pól więcej,tj.
surowiecH - czyli dany surowiec na godzinę,robisz tyle ile masz surowców.
lastUpdate - czas kiedy ostatnio gracz widział swoje surowce.
I teraz uaktualnianie odbywa się w następujący sposób.
Muszisz od czasu aktualnego odjąć czas z pola "lastUpdate",masz ileś tam sekund.
Teraz surowiecH dzielisz na 3600,żeby powstał surowiec na sekunde.
No i teraz mnożysz ilość danego surowca na sekunde przez ilość sekund.

Ofc przy każdej akcji na stronie muszisz updatować pole "lastUpdate"
andrew747
Ooo... tongue.gif No to biore sie do roboty... haha.gif Jeszcze raz wielkie dzięki smile.gif
franki01
Tylko pola z aktualnymi ilosciami surowcow powinny byc typu dziesietnego (DOUBLE, itp), zeby dokladnie dodawac ilosc surowcow. Gdyby to bylo INTEGER, to przy zaokrąglaniu ktos moglby dostawac wiecej/mniej surowcow na godzine niz powinien, a przy DOUBLE są duzo mniejsze niedokladnosci. Na stronie oczywiscie te liczby powinny zostac zaokrąglone.

EDIT:
A czas najlepiej jakby byl przechowywany w milisekundach, zeby jeszcze bardziej tą dokladnosc zwiekszyc. Kiedys robilem taka grę i wiem, że czasami naprawde duze są te odchylenia od zakladanego godzinnego wydobycia.
andrew747
Mam pytanko.... a mógłbyś udostępnić fragment tej gry z surowcami ? tongue.gif
franki01
Za opłatą mogę smile.gif Też kiedyś się męczyłem, ale doszedłem do optymalnego rozwiązania. Pole z czasem w mikrosekundach niech bedzie typu VARCHAR(50) (nazwane potem `last_update`), a z surowcami DOUBLE (`pole_z_surowcami`) i powinny tam byc trzymane surowe wartosci z funkcji microtime" title="Zobacz w manualu PHP" target="_manual. Zeby z tego zrobić coś użytecznego należy odpowiednio tym się posłużyć. Może pomóc taka funkcja:

  1. <?php
  2. function convert_microtime($str)
  3. {
  4. $e = explode(' ', $str);
  5. $time = $e[0] + $e[1];
  6. return $time;
  7. }
  8. ?>

Potem należy zrobić coś takiego:

  1. <?php
  2. $czas_od_ostatniego_odswiezenia = convert_microtime(microtime()) - convert_microtime($wartosc_microtime_z_bazy_danych);
  3. $ilosc_godzin = $czas_od_ostatniego_odswiezenia / 3600;
  4. $nowa_ilosc_surowcow = $stara_ilosc + $ilosc_godzin * $godzinne_wydobycie;
  5. ?>

Po takim czyms już wiadomo ile surowców bedzie. Do bazy należy zapisać to mniej więcej tak:

  1. UPDATE `tabela_userow` SET `last_update`='microtime()', `pole_z_surowcami`='round($nowa_ilosc_surowcow, 2)' WHERE `user_id`='$id'


I tak dość dużo napisałem, więc chyba nie będziesz miał problemów. Pisane z palca, ale raczej nie ma błędów.
SMYS
Cytat(andrew747 @ 4.05.2008, 09:23:08 ) *
Ooo... tongue.gif No to biore sie do roboty... haha.gif Jeszcze raz wielkie dzięki smile.gif


Nie jest to niestety takie oczywiste, pisząc podobną gre (cos jak OGame) pojawiło się więcej problemów, na przykładzie:

Wersja optymistyczna:
12:00 - włączam grę, widze swoje surowce, zamykam i ide na miasto
18:00 - wracam z miasta, włączam gre, update'ują się surowce i widze nowy stan i jest super

Wersja pesymistyczna:
12:00 - włączam gre, widze stan surowców, klikam update'jt farmy do 2lvl, który potrwa do 15:00 czyli od 15:00 surowców co minute bedzie przybywać o 1/3 więcej niż przed 15:00, ide na miasto winksmiley.jpg
14:00 - nie ma mnie przy kompie a tu mnie napadli, zabrali 1/2 surowców, czyli te co miałem o 12:00 + te co narosły w 2h
15:00 - farma zaczyna produkować więcej surowców
17:00 - znowu mnie napadli i zabrali 1/2 tego co mi zostało po 14:00 z tym, że od 15:00 narastało więcej, a więc międz 14:00 - 15:00 narosło X, między 15:00 - 17:00 narosło Y
18:00 - wracam do domu, włączam gre i widze...

i jak pomyślę, że jutro napadną mnie 20 razy to odechciewa mi się grać winksmiley.jpg
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.