Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Gra - surowce...
Forum PHP.pl > Forum > PHP
grochla1995
Witam!

Pisz swoją własną grę (coś w stylu plemiona) i mam problem z dodawaniem dla usera okręśloną ilość surowców co godzinę.
Mój pomysł jest taki:
- gdy user dobrze się zaloguje to do bazy danych do pola "time" jest wysyłany aktualny czas:

  1. $time= time();
  2. mysql_query("UPDATE `uzytkownicy` SET `time` = '$time' WHERE `nick` = '$login' ") or die("Nie udalo mi sie uaktualnić rekordow");


Następnie tam gdzie ma się wyświetlić ilość surowców:
  1. $user = mysql_fetch_array(mysql_query("SELECT * FROM uzytkownicy WHERE `nick`='$nick' AND `haslo`='$haslo' LIMIT 1"));
  2. /// SUROWCE
  3. $drewno = $user[drewno];
  4. $kamien = $user[kamien];
  5. $zelazo = $user[zelazo];
  6. $time = $user[time];
  7. $czas = time();
  8. /// obliczniea
  9. $as = $czas - $time; // $as = aktualny czas - czas z bazy
  10. $ae = round($as/3600); // w $ae jest informacja ile godzin temu było ostatnie dodawanie surowców (3600 s. to 1 godz tongue.gif ) i zaokrągla do pełnej liczby..
  11.  
  12.  


I teraz chce napisać że jak $ae to bedzie np. 1 godzina to wysyła po 20 z każdego surowca
czyli kod sql:

  1. mysql_query("UPDATE `uzytkownicy` SET `drewno` = '$drewno', `kamien` = '$kamien', `zelazo` = '$zelazo' ,`time` = '$czas' WHERE `nick` = '$nick' ") OR die("Nie udalo mi sie uaktualnić surowców");



ale jak $ae bedzie wynosić 2 godziny to bedzie 2 razy wiecej z każdego surowca czyli po 40, jak 3godz. to po 60. Zawsze + 20.

Ma ktoś jakiś pomysł jak miał by ten skrypt wyglądać?

Z góry dziękuję!
H4eX
  1. 1. Jak się zaloguje:
  2. $czas = gmtime() + 3600;
  3. mysql_query("UPDATE `uzytkownicy` SET `time` = '$czas' WHERE `nick` = '$login' ") or die("Nie udalo mi sie uaktualnić rekordow");
  4.  
  5. 2.
  6. $id = "chyba wiesz co tu wpisac";
  7. $user = mysql_fetch_array(mysql_query("SELECT * FROM uzytkownicy WHERE id = '$id'"));
  8.  
  9. $czas2 = gmtime();
  10. if ($user["time"] >= $czas2) #sprawdza czy minęła godzina
  11. {
  12. tu wpisz polecenie dodawania surowców dla konkretnego usera i uktualnienie daty
  13. }


Trochę to nie logiczne, bo jak użytkownik się zaloguje to czas się zmieni, a jak za minutę znów się zaloguje? Więc lepiej tylko tą drugą część dawać, będzie dawało gdy minie godzina, ale użytkownik musi wejść na stronę by wykonał się skrypt.
grochla1995
hmm odpaliłem i: "Fatal error: Call to undefined function get_date_time() in D:\miasto.php on line 50"
Ale nie oto mi chodziło.
Znalazłem na tym forum gdzie był ten sam problem i podali kod php:


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


  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. ?>


Jak coś tu masz linka do tego postu: http://forum.php.pl/index.php?showtopic=93...rt=#entry467618 (ps. jak źle podałem linka to sorry ale się dopiero tutaj zarejestrowałem)

Tak mniej więcej miał by wyglądać ten mój skrypt, tylko moje pytanie jak to przerobic aby pasowało do moich danych?

Z góry dziękuję!

mayu11
Możesz odpalić crona i dodać tabele użytkownikowi ile mam dodawać co godzinę, a potem wykonać tylko skrypt co godzinę.

  1. mysql_query("UPDATE `uzytkownicy` SET `nazwa_pierwszego_surowca` = `nazwa_pierwszego_surowca` + `ile_dodawac_pierwszego_surowca`");


Przy większej ich ilości możesz to przejechać pętelką i arrayem.
Poczytaj o cronie, bo mi uratował życie ;]

Jeśli będziesz kupował serwer na webd.pl to masz crona wpakowanego w cpanel.

Tutaj masz kod, troszkę się z tym męczyłem jak jeszcze nie wiedziałem o co chodzi.
Kod
/usr/bin/lynx -source http://adres/dodaj_surowce.php

(Najlepiej jakoś głęboko, by nikt się nie dostał.) Dodaj też robots.txt na disallow, by nie było tego w googlach ^.^
Hoku
mayu11 - takie propozycje lepiej zachowaj dla siebie.

Crona odradzam w tym przypadku takie rzeczy w takich projektach rozwiązuje się trochę inaczej.
podczas skanowania, ataku, bądź aktywności gracza następuje aktualizacja danych surowców z obliczeniem czasu jaki upłynął od ostatniej aktualizacji co prawda większość gier nie robi tego co minute tylko oblicza przybliżoną wartość wyprodukowaną w tym czasie zwykle dla 1s następuje aktualizacja.
dlaczego tak a nie inaczej ?

WYDAJNOŚĆ
Gdy mamy np 1000(taka malutka gierka winksmiley.jpg duże i popularne gry mają około 16.000 graczy na serw) graczy i założymy że każdy może posiadać po 9 własnych osad dostajemy 9000 wywołań obliczeń co 1h. jeśli mamy 3 typy surowców otrzymujemy 27000 aktualizacji pól w bazie danych.

Metoda opisana wyżej ogranicza ilość aktualizacji dość ostro z przyczyn logicznych winksmiley.jpg musiało by się znaleźć 1000 graczy skanujących łącznie 9000 osad w ciągu tej samej sekundy - raczej nierealne tongue.gif


cron w tym przypadku to morderstwo maszyny, spowoduje lagi o pełnej godzinie.
gracze nie aktywni, urlopowicze itp generowali by dodatkowo nie potrzebną ilość zapytań, po co je wykonywać jak nie są potrzebne. Logiczne?
2 sprawa zakładając, że mamy 1000 graczy jaka jest szansa, że wszyscy są zalogowani i aktywni o tej samej godzinie?

co jest lepsze wykonanie 0-1000 aktualizacji na sekundę(300 skanów na raz - jakieś maniaki musiały by klikać tongue.gif ) czy 27000 na raz?


w takich projektach jeśli liczymy na jakiś sukces trzeba myśleć o maksymalnej optymalizacji pod względem wydajności.
z założenie surowce mają wydobywać się wyłącznie teoretycznie, a ich aktualizacja wyłącznie w chwili realnego zapotrzebowania.


Idąc dalej surowce w celu odciążenia bazy danych można pobrać z niej do sesji. W przypadku odświeżania przez użytkownika surowców(klika co 1s i czeka aż będzie miał te parę więcej co mu brakowało smile.gif ) i aktualizacja ich w sesji.
to tylko wyświetla. w przypadku rozbudowy budynków, skanów przeciwników bądź ataku wykonanie operacji na bazie.

należy pamiętać o optymalizacji kodu aplikacji i bazy danych wraz ze wzrostem aktywności/ rozmiarów bazy, jeśli tego nie zrobimy może okazać się, że nawet 2 dedyki 1na bazę nie będzie nam wystarczyć.

idąc dalej wypadało by blokować dostęp do aktualizowanego wiersza w celu nie nadpisania go podczas innej operacji winksmiley.jpg np. mamy 2 operacje w tym samym czasie np. atak wroga i próba ucieczki. Co się stanie gdy druga operacja zostanie wykonana podczas gdy pierwsza jeszcze trwa np. zalagowało winksmiley.jpg.

Tego typu projekty jeśli liczymy na jakikolwiek sukces powinny być pisane z głową i stosować się do praw Murphy'ego!

Co do autora radzę:
po 1 stworzyć dokładny model funkcjonowania gry, zależności itp. projektowanie jest bardzo ważne.
po 2 czy aktualizacja surowców tylko przy logowaniu to dobry wybór? a jak ktoś nie chce się wylogowywać co godzinę?
po 3 wiele osób zabiera się za podobne projekty, pisanie własnego OS itp. zazwyczaj jest to droga "z motyką na słońce". prawdopodobnie natrafisz na trudniejsze problemy, bądź nawet nie będziesz ich świadom.
Nie chodzi o to, że chciałbym zniechęcać takie osoby, ale pierw powinno się zdobyć dość sporą wiedzę z dziedziny zarówno programowania, optymalizacji jak i zabezpieczeń.
Demongod
Tak jak kolega hoku napisał optymilizacja przy tego typu projektach to podstawa.

1.Przyza logowaniu pobierz dane gracza do obiektu.
2.Wylicz obecny stan surowców .
3. Updajtuj w bazie czas ostatniej wizyty i surowce.
4. zSerializuj gracza do danych sesji.
5.Po kolejnym odświerzeniu deserializuj gracza i pokaż dane o surowcach wyliczone metoda tego obiektu.
6.Jeśli gracz podejmie jakąś akcje np. wybuduje budynek to wtedy wylicz stan surowców gracza i zubdajtuj go w bazie.

I zamiast przyrostu godzinowego polecam przyrost sekundowy np 0,33 jednostki na sekunde tongue.gif
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.