Skocz do zawartości

Algorytm czasu


MMP

Rekomendowane odpowiedzi

Mam pewien teoretyczny(narazie) problem związany z planowaną w grze obsługi czasu. Mianowicie chce udostępnić dla każdego miasta inny przelicznik czasu( tak jak mamy czas Gregoriański i Joński ), Niestety nie mam pojęcia jak wykonywać w czasie rzeczywistym interakcje między miastami. Przyjmując mamy miasta A, B, C. Każde z nich ma inaczej obliczany czas np.

Miasto A:

1 Minuta = 564sekundy

1 Godzina = 983minut

1 Doba = 57 godzin

1 Tydzień = 3 dni

1 Miesiąc = X dni( każdy miesiąc będzie mógł mieć inną ilość tygodnii )

1 Rok = 15 miesięcy

Miasto B:

1 Minuta = 54sekundy

1 Godzina = 93minut

1 Doba = 5 godzin

1 Tydzień = 30 dni

1 Miesiąc = X dni( każdy miesiąc będzie mógł mieć inną ilość tygodnii )

1 Rok = 7 miesięcy

Miasto C:

1 Minuta = 58sekundy

1 Godzina = 33minut

1 Doba = 50 godzin

1 Tydzień = 12 dni

1 Miesiąc = X dni( każdy miesiąc będzie mógł mieć inną ilość tygodnii )

1 Rok = 3 miesięcy

I teraz Miasto A kupuje w Mieście B drewno. Zapłata za produkt ma nastąpić np. 15dni od doknania zakupu w czasie Miasta A. I teraz:

a) Jak napisać algorytm by obliczyć date w innym mieście

:) Jak przenieść wirtualny czas na nasz by operacje mogły zostać wykonane np. w CRON-ie

Ilość miast to X, więc potrzeba czegoś orginalnego by zadziałało zawsze. Ma ktoś jakiś pomysł? :D

stopka usunieta z wpoodu wirusa na stronie docelowej

Odnośnik do komentarza
Udostępnij na innych stronach

Problem dziwaczny ale : ja bym sprobowal tak:

Ustalasz czas bezwzgledny (zalozenie : sekunda (albo najmniejszy kwant czasu wszedzie taki sam) )

Data w miescie X okreslasz jako czas ktory uplynal od czasu 0 (czas 0 taki samdla kazdego miasta)

Czas bezwzgledny w miescie X bedzie Rok*Ile Dni W roku*Ile Godzin W Dniu*....

Majac czas bezwzgledny mozesz policzyc czas wg kalendarze miasta Y.

rok=int(T(Y)/(Ile sekund w roku));

reszta bardziej skomplikowanie trzeba kombinowac.

Odnośnik do komentarza
Udostępnij na innych stronach

Czyli to by było rozwiązanie jakie stosuje się w zegarze biosa. Tyle że tutaj trza by naliczać milisekundami. Przyjmując tak jak w czasie rzeczywistym że jedna 1 sekunda to 100 milisekund. Potem trza by ustawić punkt odniesienia wyznaczy podczas instalacji gry( time() * 100 ) i od tego punktu naliczać od nowa czas, tyle że w milisekundach w grze. A potem odjać od czasu instalacji gry i podzielić przez 100? Moje głowa...

Dobrze kombinuje bo na kartce trudno coś takiego zapisać i obliczeniamy sprawdzić czy działa.

stopka usunieta z wpoodu wirusa na stronie docelowej

Odnośnik do komentarza
Udostępnij na innych stronach

Varchar(255) potrafi zmieścić 255znaków :)

napisac funkcje czasAB

No właśnie nie, bo miast będzie X i każde miasto będzie mogło mieć inny czas, więc trza by napisać tak na oko hmm ... dużo funkcji do obliczania :)

stopka usunieta z wpoodu wirusa na stronie docelowej

Odnośnik do komentarza
Udostępnij na innych stronach

IMHO papieros podal niezle rozwiazanie. Wybierasz najmniejszy kwant czasu (prawdopodobnie sekunde) i na podstawie uplywu tego czasu obliczasz (ale tylko dla prezentacji) czas danego miasta.

Zauwaz, ze wlasnie tak, prawdopodobnie nieswiadomie, zrobiles w pierwszym poscie, przyjmujac podstawowa, uniwersalna i niepodzielna jednostke czasu (sekunda).

Oficjalna strona serii Football Manager ( FM 2005, FM 2006 ) - CM Revolution

Forza MLKS Woźniki Śląskie!

Odnośnik do komentarza
Udostępnij na innych stronach

Generalnie zgadzam się z powyższym -- myślałbym o najmniejszej wspólnej jednostce czasu jako podstawie obliczeń. Zostałbym też przy integerach iu longach jeśli to możliwe ;)

Teraz trzeba jeszcze wymyślić przelicznik między wybranym kwantem czasu (np. sekunda) i wybraną jednostką czasu rzeczywistego (np. sekunda, milisekunda... dodam tutaj, że wspomniany CRON ma dokładność 1 minuty jeśli się nie myle... hmmm :P ).

Dla przykładu możemy założyć, że 2 wirtualne sekundy = 1 prawdziwa sekunda (to jest na oko największy wspólny dzielnik twoich minut). Teraz wydaje mi się wystarczy dla każdego miasta (jako zmienne w obiekcie miasta albo w formie dwuwymiarowej tabeli generowanej dla wszystkich miast) przechowywać "przeliczniki" czasu, typu

czasy["A"]["m"] = 282
czasy["A"]["h"] = 277206 // = 983 * 282
czasy["A"]["d"] = 15800742 // = 57 * 983 * 282
// itd., dla miesięcy, jeśli ta komplikacja jest istotna, 15 osobnych wartości, po jednej dla miesiąca?
.
.
.
czasy["B"]["m"] = 27
czasy["B"]["h"] = 2511
.
.
.
czasy["C"]["m"] = 29
.
.
.
czasy["X"]["m"] = 135
czasy["X"]["h"] = ...

Przy obliczeniach można teraz najpierw czas miasta A przeliczyć na czas rzeczywisty i potem na czas miasta B. Wydarzenia zaplanowane przeliczać dla danego miasta i kolejkować w jednostkach czasu rzeczywistego.

I na sam koniec:

1 sekunda to 100 milisekund
Z tym się zgodzić nie mogę ;)
Odnośnik do komentarza
Udostępnij na innych stronach

W porzednich moich postach wkradło się troche błędów, musiałem sobie coś źle policzyć. Naszczęscie przeanalizowałem sobie wszystko na biologii noi chyba wkońcu wyszło mi dobrze.

Najważniejszą rzeczą są sekundy, nic nie może być poniżej jednej sekundy ponieważ komputery zawsze używają do obliczania czasu tylko i wyłącznie sekundy. Z tego co mam teraz w zeszycie z biologii widze żę, potrzebuje określić od kiedy zaczynamy naliczanie w czasie rzeczywistym.

Czas rzeczywisty: 21.02.06, zamieniamy to na sekundy i zapisujemy

Teraz potrzebujemy czas teraźniejszy w grze i jest to

01.01.01 -> Pierwszy dzień gry, zamieniamy to też na sekundy jako że ta jednostka czasu jest wspólna.

Teraz mamy dzień:

05.06.06 -> Również zamieniamy na sekundy

Teraz by obliczyć czas w świecie rzeczywistym musze podzielić 05.06.06 przez sekundowy rok w grze i dodać do czasu startu( 21.02.06 ). Dobrze?

Niestety ten sposób jest dość długi jeśli przyjdzie że miast jest 10 i każde ma inny czas. Spowodowało by to nadmiar danych w bazie do obliczania. Może są jeszcze jakieś sposoby?

stopka usunieta z wpoodu wirusa na stronie docelowej

Odnośnik do komentarza
Udostępnij na innych stronach

Erbit ale microtime nic mi nie da bo już zwykłe time() poda mi wartość w sekundach. Ja teraz potrzebuje jakiegoś wzoru którym można obliczyć szybko daty w różnych miastach ale tak bym nie musiał umieszczać dużej ilości danych w bazie. Jeżeli nic nie wymyśle to najlepszą metodą by było przeliczenie czasu miasta A na czas teraźniejszy a potem na czas miasta B.

stopka usunieta z wpoodu wirusa na stronie docelowej

Odnośnik do komentarza
Udostępnij na innych stronach

najlepszą metodą by było przeliczenie czasu miasta A na czas teraźniejszy a potem na czas miasta B.
Czas miasta A i B musi być jednakowy
Ustalasz czas bezwzgledny (zalozenie : sekunda (albo najmniejszy kwant czasu wszedzie taki sam) )
przeliczania dokonujesz wyłącznie w celu zobrazowania tego czasu graczowi według jego kalendarza.

Nie znam się na pozycjonowaniu, ja tu tylko zużywam transfer i miejsce w sql.

Roman Kluska ujawnia: nadchodzi INFLACYJNY ARMAGEDON!

 

Wielki Elektronik

Odnośnik do komentarza
Udostępnij na innych stronach

Nie rozumiem dlaczego wydaje ci sie ze musisz trzymac duzo danych - trzymasz tylko kalendarze miast

(tego nie przeskoczysz bo i jak).

Zalozmy ,ze czas mierzymy w sekundach od dzis od godziny 0:00:00 (to bedzie czas wyjsciowy)za N dni rzeczywistych bedziemy mieli czas okreslony jako integer T=N*24*60*60

Jesli w miescie X mamy :

minuta trwa M sekund

godzina trwa G minut

dzien ma D godzin

miesiac ma M dni (jesli zmienne to trudniej ale do wykombinowania)

To w miescie X minie ID=(int)(T/(M*G*D)) dni

(int)(T/(G*M)) godzin

(int)(T/M) minut

i oczywiscie T sekund

miesiac = (int)(ID/M) itd,itp

gdzie : (int) zaokraglenie do calkowitych w dol

dla ulatwienia przyjmij sobie ze godzina 0 jest wspolna dla wszystkich miast i jest to powiedzmy 1 stycznia 0 roku (jak miesiace jak zwal tak zwal

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności