Autor Zpráva
Honza.P@
Profil
Ahoj.

Hledám někoho zkušenější, který by mi dokázal poradit se školním, závěrečným, projektem.

Jako projekt mám naprogramovat "primitivní" online hru, ale narazil jsem na jeden problém.

Mám stavební frontu (funguje jako takový cach, ale v DB), do které se mi uloží:
id_budovy
id_user
cas_dokonceni (v timestamp)

V Homepage mám funkci, která vezme id přihlášeného uživatele, koukne do db a pokud zjistí, že aktuální čas >= cas_dokonceni probehnou další funkce (update jiných db atd.) a dojde k smazání ze stavební fronty (dokončených).

Tento způsob je závislý na tom, že je uživatel přihlášen nebo přihlášený. -> To je špatně nebot pokud půjde o budovu, která dává suroviny, tak se budova vylepší až v době, kdy přijde a né po dostavení -> neodstane suroviny za lepší level.

Můj dotaz tedy zní:
Jak udělat, aby se to kontrolovalo průběžně a mnou popsaný průběh proběhl i bez toho, aby se uživatel přihlásil/byl přihlášen?
Keeehi
Profil
Honza.P@:
Udělá se to až po přihlášení. A pokud se budova mezi přihlášeními vylepší, zpětně dopočítáš ty surovniy.
původně 20/hodinu
nově 25/hodinu
čas dokončení 12:00
teď je 15:00
-> zpětně přidám 15 surovin = (čas_teď - čas_dokončení)*(surovin_nově-surovin_původně)

To samé i v případě snížení úrovně. Zpětně se odeberou suroviny.
Honza.P@
Profil
[#1]4 Keeehi: Taky možnost, ale pokud bych chtěl řešit přesun jednotek, tak to takhle nemůže jít :)
Keeehi
Profil
Honza.P@:
Ale všechno jde takto. Vždy se to zpětně dopočítává až když je to potřeba. Až když někdo něco chce (přihlásí se, zaútočí na někoho atd.) A to, že někdo něco chce je nějaký požadavek, a spouští se nějaký script, takže akorát na začátek stačí přidat to zaktualizování.
Honza.P@
Profil
Keeehi: Ale když se nad tim zamyslíš, tak u útoků to přeci tahle z podstaty nemůže jít.
Ano, funkční to bude, ale neplní to tak, jak by se u útoků očekávalo.

Takový model:
Odešlu útok v 14:30:00 a má dojít ve 14:45:00.
Ale když se přihlásim až za 24h, tak situace u obránce bude už úplně jiná.
Stejně tak např nebude obránce nikdy předem vědět, že na na něj někdo útočí, protože vlastně nikdy nevíš, kdy ten útok má opravdu dojít.
Keeehi
Profil
Honza.P@:
Ale jde to.

možnost 1 - obránce se mezi dojitím útoku k němu a mým přihlášením nepřihlásil.
- útočník se přihlásím v 14:30:00 +1 den
- zjistí se, že už útok proběhl 14:30:00
- k času 14:30 spočítám aktuální situaci obránce
- provedu výpočet souboje
- podle výsledku výpočtu odeberu obránci suroviny a útočníkovi je přidám (protože už se stihli jednotky vrátit)
-- pozn. Až se přihlásí obránce, bude se jeho zisk dopočítávat z času přihlášení - 14:45, protože už aktualizace proběhla

možnost 2 - obránce se přihlásí po dojití útoku ale před přihlášením útočníka
- přihlásí se třeba v 15:00 téhož dne
- zjistí se, že už útok proběhl 14:30:00
- k času 14:30 spočítám aktuální situaci obránce
- provedu výpočet souboje
- podle výsledku výpočtu odeberu obránci suroviny a útočníkovi je přidám (protože už se stihli jednotky vrátit)
- a od 14:30 to 15:00 přidám obránci suroviny, které se stihly za tu půl hodinu vygenerovat

možnost 3 - obránce se přihlásí před útokem
- nic se nemusí řešit, protože útok teprve proběhne, takže o tom obránce nemusí vědět



S procedurálním programováním které u tebe očekávám to bude celkem "zábava" ošetřovat všechny možnosti které mohou nastat. Při použití OOP by to mělo být mnohem jednodušší. Např. objekt Hráč by měl metodu aktualizuj_k(int $timestamp) která by k zadanému datu a času provedla aktualizaci celé hráčovy vesnice. Čas poslední aktualizace si vytáhne třeba z databáze, vypočte si rozdíl, provede aktualizaci a svým časem nahradí ten čas načtený z databáze.

Vlastně tím ale chci říct něco úplně jiného. Snažíš se vytvořit něco, na co tvé znalosti nestačí. Pokud jsi si toto téma vybral sám, pak jsi si ho vybral špatně, nebo jsi si stanovil velmi vysoké nároky. Pokud ti bylo přiděleno, zjisti si, co se po tobě vlastně všechno chce a nedělej si to zbytečně složitější. Třeba tento soubojový systém, kdy jednotky musejí být na cestě je zbytečně složitý. Dá se to udělat tak, že se útok provede ihned po odeslání. Tím se zbavíš asi 2 aktualizací. A i takovýto způsob soubojů se používá. Příkladem může být třeba webgame.cz
Honza.P@
Profil
Keeehi:
OOP je samozřejmostí :)
Tahle část není až tak o znalostech, ale o tom, jak ten proces vůbec pořešit. Což mi doted není pořádně jasné :)
Ale zkusim si nad tím zítra sednout a pořádně se nad tím zamyslet.

Děkuji za názor :)
Keeehi
Profil
Honza.P@:
Tak v tom případě to nebude až tak složité.
Jde o to, že když se má vykonat nějaká akce, tak se před ní provedou aktualizace objektů kterých se to týká. Každý ten objekt zná čas svojí poslední aktualizace a z rozdílů časů si dopočte aktualizaci.

Při přihlášení (bez jakýchkoliv útoků)
  - zaktualizuji k aktuálnímu času

+ pokud byl útok a jsem útočník
  - zaktualizuji protivníka k času útoku
  - odečtu protivníkovi kořist

+ poud už je po návratu
  - přičtu kořist

+ pokud byl útok a byl jsem obránce
  - odečtu si kořist


- je potřeba ohlídat pokud je více útoků jak ode mě tak na mě, aby se to aktualizovalo ve správném pořadí
Pokud já pošlu útok a někdo pošle útok na mě tak je rozdíl, jestli v čase útoku na mě se mi už můj útok vrátil (větší počet jednotek i surovin) či nikoliv.
Je tedy dobré neaktualizovat hned, ale ukládat si aktualizace všech objektů, kterých se to týká, seřadit si je od nejstarší po nejmladší a provádět je v tomto pořadí.
Honza.P@
Profil
Keeehi:
Jsem rád, že si ochotný o tom semnou diskutovat. Dost mi to pomáhá ;)

TED UŽ SPÍŠ TEORETICKY:
Nevim, jak je to řešeno na webgame.cz, ale zkoušel si hrát někdy travia_n... divokékmeny.. ikariam ...atd?
Tam to řešení musí být už úplně jiné ne? Přicházející útok vidí i obránce přesně na vteřinu.
webgame.cz je tvůj?
Keeehi
Profil
Honza.P@:
Webgame není můj a je to už hodně stará hra. Uvedl jsem ji jako příklad jiného soubojového systému ne tebou zmiňované hry. U webgame, nemusí armáda chodit tam a zpátky ale útok se provede okamžitě.

Tam to řešení musí být už úplně jiné ne? Přicházející útok vidí i obránce přesně na vteřinu.
Zobrazení času je zase úplně jiný "problém", který s předchozím nesouvisí. Když mám v databázi uloženo, v kolik má přijít nějaký útok, není přece problém tuto informaci obránci zobrazit. A ještě menší problém je mu tu informaci nezobrazit ;-)
Alphard
Profil
Honza.P@:
Tato problematika je poměrně složitá, minimálně některé hry, které zmiňujete, vyvíjely určitě celé týmy programátorů docela dlouhou dobu.
Keeehi vám ukazuje přístup dopočítávání údajů ve chvíli, kdy je to potřeba. Zároveň nepochybuji, že v backendu běží program (to už možná ani nebude jen cron načítající http požadavky), který uklízí a předpřipravuje nová data. Databáze se bude muset držet v nějakém konzistentním a aspoň částečně aktuálním stavu i bez přihlášení, kvůli návaznosti na aliance, statistiky apod.

Je to školní projekt na střední, nebo na vysokou? Co přesně je v zadání, doufejte, že vám bude stačit to, co popisuje Keeehi, jinak vám to nezávidím.
Honza.P@
Profil
Keeehi:
Stim zobrazením máš pravdu :)

Alphard:
To je mi samozřejmě jasné, že to nedělal jeden člověk :)

Je to na VŠ. Snad to bude stačit, ale pro jistotu se v pondělí zeptám na pár věcí zadavatele.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: