Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: PHP MYSQL fronta příkazů

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Pepa Mochr Vladik:20.3.2018 14:18

Ahoj, začal sem se zajímat o PHP a práci s databází. Nějak nemůžu přijít na to, jak funguje něco jako fronta příkazů i když uživatel není online. Nevím jak to popsat tak to uvedu na příkladu.
Browser hra typu travian,divoké kmeny...
uživatel zadá stavbu domu, který bude hotový za 10 minut. Spustí se odpočet, až skončí provede se příkaz. POkud jsem u hraní online dovedu si představit jak to funguje.
ale když dám stavět dům a odejdu, tak jsem v pasti.
Podle logického myšlení musí "něco" bežet na serveru a dělat tyto úkony, které jsou ve "frontě" a postupně zadávat do DB po uplynutí času.
Mohli byste mě prosím navést správným směrem? díky :)

 
Odpovědět
20.3.2018 14:18
Avatar
Odpovídá na Pepa Mochr Vladik
Martin Konečný (pavelco1998):20.3.2018 14:37

Ahoj, zrovna třeba na stavění budov jde udělat takový malý trik, a to ten, že si uložíš datum začátku stavby, počet sekund (nebo jiný interval), jak dlouho se budova staví, a když klikneš na stránce na něco, tak se jen zjistí, zda "začátek stavby + počet sekund < aktuální čas" - pokud ano, pak se stavba dokončí. Tedy reálně se dokončení stavby v databázi neprovede přesně těch 10 minut po začátku, ale kdykoliv po 10 minutách, kdy si tu stránku zobrazíš.
Je někdy samozřejmě problém v tom, že když např. budova něco produkuje, tak je potřeba ještě od aktuálního času odečíst čas dokončení stavby, a ten rozdílný čas rovnou použít k produkci :D Na příkladu:

Stavíš budovu, která ti generuje obilí. Za každou 1 hodinu se ti vygeneruje 100 obilí.
Budovu začneš stavět ve 20:00, trvá 1 hodinu (tedy do 21:00). Na stránku přijdeš ale až ve 23:00. V ten moment se zjistí, že datum dokončení stavby je nižší než aktuální čas, takže se provede dokončení stavby. Navíc ale 23 - 21 = 2 hodiny navíc, tedy je zároveň potřeba vygenerovat 2 * 100 obilí :D

Editováno 20.3.2018 14:38
Nahoru Odpovědět
20.3.2018 14:37
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Pepa Mochr Vladik
Martin Konečný (pavelco1998):20.3.2018 14:44

Ještě navíc může vzniknout problém, že když ta konkrétní budova nějak souvisí i s jinými hráči, třeba že si stavíš nějakou další úroveň opevnění a nějaký hráč na tebe chce zaútočit, tak se ta kontrola dokončení stavby musí provést i před tím samotným útokem - tedy ani nemusíš být online ty, ale stačí, aby na tebe někdo provedl útok. Takže to někdy může být trochu složitější, ale stále si myslím, že je to obvykle lepší řešení (pro ušetření náročnosti aplikace), než každých 5 minut pouštět nějaký CRON a kontrolovat všechny možné záznamy.

Nahoru Odpovědět
20.3.2018 14:44
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Pepa Mochr Vladik:20.3.2018 14:47

no tento system me taky napadl. zapsat cas zacatku a cas konce a pri dalším přihlášení to zkontrolovat. ale nebude právě fungovat ta "návštěva" jiného hráče, když by třeba útočil.
CRON -- neznám , prozkoumám, třeba to bude to správné nakopnutí, díky.

 
Nahoru Odpovědět
20.3.2018 14:47
Avatar
Odpovídá na Pepa Mochr Vladik
Martin Konečný (pavelco1998):20.3.2018 15:09

Proč by nefungovala? Pokud mám nějakou interakci s jiným hráčem, musím znát jeho unikátní identifikátor (obvykle ID). Tedy před tím, než se provede útok, tak dokončím stavbu toho hráče, na kterého chci zaútočit.

Nahoru Odpovědět
20.3.2018 15:09
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Pepa Mochr Vladik:21.3.2018 6:24

no ale nejak nevim kdyz bych treba stavel armadu. dam frontu 100 vojacku, behem doby "budovani" me napadne protihrac... udelal bych si tabulku fronta kde budu mit zacatek vystavby a konec.
protihrac prijde ke me, a zase jsme tam kde na zacatku, co kdyz se behem utoku odhlasi?
me ta mproste chybi nejakej realtime prvek, kterej to vsechno ridi a kontroluje.

 
Nahoru Odpovědět
21.3.2018 6:24
Avatar
Jakub Hýža
Člen
Avatar
Jakub Hýža:21.3.2018 6:56

V případě útoku zapíšeš do databáze čas začátku a trvání. Poté co se hráč který vyslal útok vrátí tak dopočítáš zda ve chvíli kdy armáda dorazila k cíli byla dána budova (třeba věž) postavena a podle toho vypočítáš zda byl útok úspěšný a přičteš kořist.

Editováno 21.3.2018 6:57
Nahoru Odpovědět
21.3.2018 6:56
Sleep(); Eat();. Code(); Repeat();
Avatar
Pepa Mochr Vladik:21.3.2018 9:44

takze budu mit neco jako verejnou tabulku kam se budou zapisovat vsechny cekaci akce. kdyz hrac prijde na navstevu k nekomu jinymu, projedu databazi, podle ID hrace najdu "co stavi" , spocitam rozdil a pak udelam utok?
musim se and tim zamyslet vic, asi to neni tak jednoduchy. zkusim projit zdrojove kody travianu i kdyz to je asi moc slozity, treba to pochopim

 
Nahoru Odpovědět
21.3.2018 9:44
Avatar
Ondřej Crha
Člen
Avatar
Ondřej Crha:25.3.2018 14:52

Ještě bych zmínil způsob, kdy stavba má pevně stanovené datum "platnosti". Pokud hráč začne stavět něco, co má být dokončeno za 10 minut, platnost se nastaví na getDate()+10min. Při návštěvě/útoku se zjišťuje, které stavby mají platnost menší než getDate().

 
Nahoru Odpovědět
25.3.2018 14:52
Avatar
Roman Havránek:26.3.2018 11:19

Jednoduché.. -> Dejme tomu že zadáš stavbu hlavní budovy v 11:00 (délka stavby je 5min). Do $délkastavby = GetDate() + $dobastavby;
Odešleš do databáze konec stavby a při dalším obnovení nebo kliknutí na cokoli, se zeptáš zda zapsané v dat tj. $konecstavby <= GetDate(); nebo taky 11:05 <= aktuálníčas (tzn. že v 11:05:01 podmínka pustí kladnou větev).
Pokud to takto není, tak mne opravte.
Kdyžtak mě napiš na FB, poradím s čímkoli kolem PHP.

Nahoru Odpovědět
26.3.2018 11:19
sleep();
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.