Chodzi mi o cos co jest w grach typu travian czy plemiona czy ogame
Tam maja jakies surowce które rosną wraz z upływem czasu
Nie chce by ona zmienialy sie w czasie rzeczywistym ale przykładowo tak:
Mam sobie konto zaczynam od 3 surowców w kazdym mam 0 na poczatku
wzrost na godzine to 60 punktow na kazdy surowiec czyli wzrasta on co minute o 1.
Czyli za kazdym razem jak odswieze strone to najpierw skrypt ma obliczyc ile powinienem miec surowca
i teraz bierze stan poprzedni czyli [0] pobiera tez ile mam na godzine miec wzrostu np [60] i trzeba pobrac
czas od ostatniego zapisu poprzedniego stanu. Co by mi dalo tak. Obecnie mam 0 po 10 minutach odswiezylem
czyli WZROST / 3600 (sekund) = wzrost na sekunde. Jak ostatni zapis byl 600 sekund temu to teraz
powinienm miec ( 60 / 3600 ) * 600 = 10 punktow w ciagu 10 minut. Czy to jest dobre rozwiazanie tak za kazdym razem
po odswiezeniuz zapisywac te dane do rekordu uzytkownika ? czy powinno byc to inaczej ?
ja myślałem, że jestem nawalony :)
:) dzis sobota, kazdy moze byc nawalony :D
Zapisz sobie w bazie datę ostatniej zmiany, wartości surowców, a potem po prostu przy odświeżeniu strony policz ile narosnąć powinno od czasu zapisanego w bazie. Ktoś już o to pytał.
Tak wlasnie zrobie bo nie widze innej mozliwosci a na bieŻąco no to lipa by byla.
masterO napisał(a)
Czy to jest dobre rozwiazanie tak za kazdym razem
po odswiezeniuz zapisywac te dane do rekordu uzytkownika ? czy powinno byc to inaczej ?
Odnosząc się do tego co napisałem wyżej, tak. Nie ma sensu Crona zaprzęgać do uaktualniania surowców kilku tysiącom graczy co sekunde.
A myślisz że na serwie sa jakies dodatkowe programy wykonujące jakieś operacje czy wszystko jest na zasadzie obliczen i wysweitlane dla konkretnego gracza podczas odczytu danych? bo to chyba wydajniejsze niz dokonywac calyczas obliczen. Tylko nie chodzi mi np o graczy ale o powiedzmy losowe zdarzenia pojawiajace sie hmm w grze. Np jak ktos nie gra i opuszcza osady to ze tam automatycznie dochodzi wojsko czy cos. Czyli tak jakby komputer gral od strony serwera.
masterO napisał(a)
A myślisz że na serwie sa jakies dodatkowe programy wykonujące jakieś operacje czy wszystko jest na zasadzie obliczen i wysweitlane dla konkretnego gracza podczas odczytu danych? bo to chyba wydajniejsze niz dokonywac calyczas obliczen. Tylko nie chodzi mi np o graczy ale o powiedzmy losowe zdarzenia pojawiajace sie hmm w grze. Np jak ktos nie gra i opuszcza osady to ze tam automatycznie dochodzi wojsko czy cos. Czyli tak jakby komputer gral od strony serwera.
Nie wiem jak to jest w jakiś Plemionach zrobionych, ale myślę że w takich wypadkach wyniki wojen są od razu przewidywane albo obliczane na bieżąco. Nie ma co z tego robić nie wiadomo czego.
a propoS obliczania wlasnie do tego tematu daze i zaloze go w tytule dajac cz.2 jeśłi mialbys ochote wyrazic tam swoje zdanie bede wdzieczny
Demonical Monk napisał(a)
Nie wiem jak to jest w jakiś Plemionach zrobionych, ale myślę że w takich wypadkach wyniki wojen są od razu przewidywane albo obliczane na bieżąco. Nie ma co z tego robić nie wiadomo czego.
Myślę, że nie wyliczają tego na bieżąco, bo byłoby to zbyt obciążające dla serwera. Mają raczej wcześniej przygotowaną tabelę z wszystkimi możliwymi wynikami wojen i w razie potrzeby po prostu jest wybierany odpowiedni rekord. Pojedynczy select z bazy jest szybszy niż wyliczenia, to coś jak hurtownia danych.
Nie ma zadnej tabeli wynikow bo wojna zalezy od ilosci ludzi jakich poslesz i jest to obliczane na biezaco przy wykonaniu chyba danego zdarzenia. Tylko jesli atakujesz wioske sterowana przez komputer to on wlasnie musi co sekunde sprawdzac i wykonywac swoja kolejke i traktowac sie tak jakby mial np 1000 osad. ale dodatkowo musi byc aktualizacja kolejek kazdego gracza bo weryfikowany jest ranking na podstawie zbieranych punktow z rozbudowy co znaczy ze jak sie nie zaloguejsz ale twoja budowa trwa i zostanie skonczona to wynik w rankingu bedzie podwyzszony.
Przyrost surówki w zależności od poziomu rozbudowy. Wiadomo, że nie możemy wpisywać danych o ile chcemy zwiększyć surowca dla danego sposobu. Dlatego pierwsze w tabeli co zostalo umieszczone to:
$START_VALUE = $row[1]; //wartosc poczatkowa od jakiej zaczynamy np 60 / h
$INCREAST = $row[2]; //o ile procent wzrasta kazdy poziom w stosunku do poprzedniego : 116%
$MAX_LEVEL = $row[3]; //maksymalny poziom rozbudowy np : 30
//wartosc poczatkoa przyrowanan do zmiennej
$Counting = $START_VALUE;
//wysweitla wynik (przyklad)
for ($i = 1; $i <= $MAX_LEVEL; $i++) {
//pokaz wynik
echo $i . " | " . $Counting . "<br>";
//count what will be next value lvl(n) = lvl(n-1) * $INCREAST / 100 %
$Counting = ROUND( $Counting * $INCREAST / 100 );
}
Na tym przykladzie bedzie wyświetlony poniższy wynik:
1 | 60
2 | 70
3 | 81
4 | 94
5 | 109
6 | 126
7 | 146
8 | 169
9 | 196
10 | 227
11 | 263
12 | 305
13 | 354
14 | 411
15 | 477
16 | 553
17 | 641
18 | 744
19 | 863
20 | 1001
21 | 1161
22 | 1347
23 | 1563
24 | 1813
25 | 2103
26 | 2439
27 | 2829
28 | 3282
29 | 3807
30 | 4416
Tylko czy to dobre rozwiazanie ? Może zastosować jakąś funkcję logarytmiczną ?
Albo jak to zrobić by na koncu np bylo 4500 zaczynalo się od 60 i zeby logarytmicznie
to wzrastało tak że im wiekszy poziom tym większy przyrost.
Tak samo mozna by zrobic koszt rozbudowy ilepotrzeba danego surowca. Czyli opiszemy na samym poczatku
kopalnie kamieni.
id_mine_stone - identyfikator (int)
start_value - wartosc poczatkowa (int)
increase - wartosc przyrostu % produkcji na kazdy poziom (int)
max_level - maksymalny poziom rozbudowy (int)
req_stone - poziom kamienia (int) np 40
req_wood - poziom drewna (int) np 60
req_gold - poziom zlota (int) np 30
wypadaloby tez dac pole o ile ma wzrosnac kazdy surowiec o kolejny poziom rozbudowy
req_increse - i tu nie wiem jaki wstawic moze 110 (%) ? nie wiem
Tylko ze przyrost ostatni np 110 % da nam przyrost poczatkowy np 50 a przy poziomie 30 to bedzie 799.
A mi zalezy zeby na poczatkowym bylo np 30 a na koncowym 35.200 (przyklad) i nie wiem jak to zrobic najlepiej
DLa poczatkujacych: Pytanie dlaczego nie mogę wpisać recznie dla każdego poziomu wymaganych surowców oraz
poziomu produkcji może się nasunąć a odpowiedz na nie powinna być. Nie można tego uczynić gdyż jeżeli bedziemy chcieli przyspieszyć szybkość gry no 2 razy to wystraczy ponożyć wartości początkowe X 2 a przy wpisaniu na sztywno takich danyc
nie byloby możliwości (znaczy byłaby skryptem kopiując dane z tabelek i wpisywać powiekszone przez ile tam chcemy) ale nie o to chodzi przecież.
Ja bym przy rozpoczęciu jakiejś wojny od razu sobie do tabeli zapisał wyniki kolejnych rund i prezentował userowi. Jak zmienią sie jakieś wartości początkowe - np. przybędzie nowe wojsko to liczymy od nowa tury które jeszcze się nie wydarzyły.
Ale do wojen to jeszcze daleko :) najpierw trzeba opracowac algorytm wymagan surowcow na kolejne poziomy. rycerzy itd to dopiero potem :D co do tabeli wojennej to tylko algorytm obliczen bo tak prezentowac wyniki to nie wiem jak to sobie wyobrazic. Moze podaj jakis przyklad Demonik
Dobra decyzja sadu ostatecznego mozna wyporwadzic wzory na dana budowle ale wtedy by sprawdzić stan np poziomu 4 danej budowli i tak trzeba wyliczyc. a to generuje niepotrzebne rozkazy. Dlatego kazdy budynek musi byc opisany dokladnie poziom po poziomie. Gdy juz bedziemy mieli opisane wymagania obiektu w tabeli mozemy ta tabele skalowac. Mnozyc razy 100 i wtedy mamy szybkosc gry razy 100. Dlatego zabieram sie za dokonczenie tabeli surowcow. (Kazdy budynek bedzie opisany w oddzielnej tabeli.)