System poziomów

0

Witam. Staram się napisać mały system poziomów (LVL). Miałoby to działać tak, że w tabeli np. users były by informacje o użytkowniku i pole exp, gdzie byłyby wyświetlane punkty doświadczenia (otrzymane. np za walkę) i potem w skrypcie PHP zamienić EXP na LEVEL (wg jakiegoś wzoru) i pokazać go użytkownikowi. Prosiłbym o rady i wskazówki jak się do tego zabrać, bo próbuję, próbuję i nie mogę tego rozkminić.

Z góry dzięki za pomoc, pozdrawiam.

0

Z czym dokładnie masz problem?

0

Mam problem bo nie mogę się ogólnie do tego zabrać. Jak powinna wyglądać struktura bazy danych, jak zmienić (jeśli mamy pole exp w tabeli) exp na level (wg jakiegoś wzoru). Ew. jak sprawdzić ile została expa do kolejnego lvla.

Pozdrawiam :)

0

Wiesz, zazwyczaj to w grach się chyba robi według tabelki expów - każdy lvl ma swój wymagany - i przy każdym dodawaniu expa sprawdane jest czy mamy już tyle ile trzeba na następny lvl...

Chociaż logarytm naturalny też byłby świetnym wyznacznikiem
poziom = floor(log(doswiadczenie));
jeśli wybierzesz logarytm, to doświadczenie na konkretny poziom możesz uzyskać w ten sposób:
wymagane_doswiadczenie = ceil(exp(poziom));

edit: pierwiastek trzeciego stopnia chyba byłby nawet lepszy do tego zamiast logarytmów :P

0
  • Zapis i odczyt danych z bazy

Jeśli masz zamiar pisać jakąś gierkę MMORPG, w którą tłukło by wielu graczy pamiętaj o tym, żeby zminimalizować ilość zapytań - po to, aby nie obciążać serwera.
Wyobraź sobie około 1000 użytkowników zalogowanych i grających w tym samym czasie.
Zapytań będziesz miał co najmniej 1000 na sekundę ;)
Uwierz mi żaden hosting nie lubi przeciążeń i szybko Cie odetnie.

W tym przypadku polecam Ci wczytywać dane przy starcie gry do sesji albo do plików cookies.
Potem zapisywać wszystkie dane do bazy po upływie jakiegoś czasu lub gdy user będzie chciał zapisać stan gry.
Co do tego kiedy zapisywać te dane trzeba poświęcić więcej czasu. W razie czego chętnie pomoge, ale przejdźmy dalej.

  • Baza danych

Dobrze, gdybyś dla szybkości działa jak i dla samego porządku pooddzielał konta gracza od ich właściwości, tzn. posiadać kilka tabel, np.:

tabela 'users': id int(6) PK, name varchar(50), pass varchar(32) // Do przechowywania loginów i zakodowanego hasła
tabela 'players': id int(6) PK, parent_id int(6), name varchar(50), type_id int(2), exp int(10), etc. // Do przechowywania inf o postaci w grze
tabela 'type': id int(2), name varchar(50) // Do przechowywania typów postaci, np: Paladyn, Warlock etc.

W ten sposób nad wszystkim zapanujesz. Administracja stanie się dużo łatwiejsza.

  • Działanie (bardzo uproszczone)
  1. Logowanie,
  2. Wczytanie danych z bazy do plików cookies lub sesji dla konkretnego użytkownika,
  3. Obsługiwanie zdarzeń postaci w grze,
  4. Zapis informacji z plików cookies lub sesji do bazy danych.
    Kroki 3 i 4 będą się non stop powtarzać - więc dobrze by było najpierw dobrze wszystko zaprojektować, a dopiero potem kodować gotowy plan. Nie zostawiaj sobie nic na potem.
    (Oczywiście krok 3 to nie jedna funkcja, a nie cały engine gry)

Jakbyś potrzebował żeby stworzyć jakąś bazę lub jakiś przykładowy kod odczytu i zapisu danych to daj znać. Chętnie pomogę.

0

@up

Hmm... Dzięki, ale miałem zamiar zrobić taką malutką gierkę (na początek), ale i tak Twoje rady są dla mnie bardzo cenne. Postaram się zrobić coś takiego, że jak się user zaloguje, to jego dane dot. postaci zapisze sobie w sesjach, ale kiedy potem je znów zapisać w bazie? Jak będzie się wylogowywał?

Ale na mój główny problem dalej nie znalazłem rozwiązania. Jak miałby wyglądać system poziomów doświadczenia w takiej grze.

Dzięki za pomoc, pozdrawiam. :)

0

pola w tabeli:
exp - ilość doświadczenia, domyślnie 0
exp_lvl - wymagana ilość doświadczenia na kolejny poziom, domyślnie np 1000
lvl - aktualny poziom gracza
skills - punkty umiejętności

zapytanie zwiększające poziom gracza o 1, ilość punktów umiejętności o 3 i ilość potrzebnego expa o 66% dla wszystkich graczy, którym stuknął lvl

update players
set exp = exp - exp_lvl ,
exp_lvl = exp_lvl * 1.66,
lvl = lvl + 1,
skills = skills + 3
where exp >= exp_lvl

0

Aris dzięki wielkie. Już chyba wiem jak to zrobić, ale załóżmy, że mamy takie coś:

Doświadczenie: 0 // początek gry
Doświadczenie potrzebne do następnego poziomu: 100
Poziom doświadczenia: 1

Teraz gdy nabiję np. doświadczenie i będę miał 102, to warunek "WHERE exp >= exp_lvl" zostanie spełniony i się zaktualizuję do takiej postaci:

Doświadczenie: 2 // (102 - 100)
Doświadczenie potrzebne do następnego poziomu: 166 (100 * 1.6)
Poziom doświadczenia: 2

I teraz jak widać, co każdy lvl, exp się zeruję i trzeba tylko wbić więcej doświadczenia. A ja chciałbym, żeby było tak, że jak mam te 102 expa, to żeby one nie było odejmowane tylko po prostu zwiększane było wymagane dośw. do następnego lvla (mam nadzieję, że zrozumiale napisałem :P).

Chodzi Mi o to, że mam 0 expa, potem wbijam i wbijam i mam 102, potem po UPDATE nie chce mieć od początku 0 tylko dalej od 102 expa, żeby np. na 100 lvlu to nie wyglądało tak:

Posiadasz: 0 doświadczenia
Do 101 poziomu wymagane jest 3 mln doświadczenia

Tylko

Posiadasz: 20 mln doświadczenia // już tyle ogółem wbite
Do 101 poziomu wymagane jest 23 mln doświadczenia

Tzn. że już mam 20 mln i muszę wbić kolejne 3 mln, ale ta wartość początkowa się nie zeruję.

0

to wywal linijkeę z expem..

update players
set exp_lvl = exp_lvl * 1.66,
lvl = lvl + 1,
skills = skills + 3
where exp >= exp_lvl

0

Dzięki wielkie Aris. Czasami myślenie trochę mi szwankuje ;D Szczególnie, gdy siedzisz w 30+ stopniowej temperaturze :)

Jak widać - wszystko działa b. dobrze: http://i27.tinypic.com/e01xth.png
Na razie chciałem to tylko wypróbować, ale może w niedalekiej przyszłości zrobię coś większego :)

Dzięki wszystkim za pomoc.

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