Diskuze: Průběh souboje - ukládání do databáze

PHP PHP Průběh souboje - ukládání do databáze American English version English version

Avatar
Martin Konečný (pavelco1998):

Ahoj,

dejme tomu, že dělám souboj dvou protivníků v jedné RPG hře. Souboj probíhá ve stylu jednotlivých kol, kde se pokaždé určí, jaké poškození hráč způsobí. Poškození ovlivní několik různých faktorů a popis každého kola se poté objeví ve zprávě o souboji.

Potřebuji od vás zkušenějších radu - mám do databáze ukládat každé kolo zvlášť, nebo to průběžně ukládat do proměnné a tu pak hodit do jednoho řádku?

Počet kol může být až do 100 (v pozdějších fází možná dokonce i více). To znamená min. 100 insertů do DB, a to pouze průběh souboje (o dalších asi deseti query dotazech nemluvím). Pracují s MySQL databází (InnoDB), která, pokud si správně pamatuji, není v insertech úplně nejrychlejší.

Jen bych ještě chtěl dodat, že v jednu chvíli může probíhat více soubojů, takže se celý počet insertů znásobí n krát v závislosti na počtu.

Edit: Mám pocit, že už jsem to někdy někde řešil. Pokud to bylo zde, tak se omlouvám.

Díky moc.

Editováno 10.8.2013 12:36
 
Odpovědět 10.8.2013 12:36
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Martin Konečný (pavelco1998)
David Čápka:

To přeci záleží na tom jestli chceš mít údaje o jednotlivých kolech nebo ne, jak to máme vědět? :)

Nahoru Odpovědět 10.8.2013 12:53
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Martin Konečný (pavelco1998):

Cituji: "Poškození ovlivní několik různých faktorů a popis každého kola se poté objeví ve zprávě o souboji."
Chci dát hráči vědět o detailním průběhu souboje, čili i o každém kolu. Varianta "co kolo, to insert" je podle mě lepší, ale nejsem expert na databáze a nevím, jak by to mohlo být zatěžující.

 
Nahoru Odpovědět 10.8.2013 13:02
Avatar
Kit
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Kit:

Může hráč ovlivnit, zda bude další kolo nebo prchne?

Samozřejmě insert. Jestli ho databáze provede nebo jen udělá update záleží jen na ní.

Editováno 10.8.2013 13:12
Nahoru Odpovědět 10.8.2013 13:08
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Martin Konečný (pavelco1998)
David Čápka:

Stále jsi mi neodpověděl. Že aplikace zobrazí nějaké zprávy o souboji neimplikuje, že je bude také ukládat. Mohla by jen uložit výsledek souboje, ne průběh. Inserty nemusíš dělat postupně, ale najednou (jedním dotazem) až zápas skončí, takže to pak pomalé nebude.

Nahoru Odpovědět 10.8.2013 13:12
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na Kit
Martin Konečný (pavelco1998):

Hráč prchnout nemůže. Další kolo proběhne jen v případě, že oba soupeři mají vyšší život než 0.

 
Nahoru Odpovědět 10.8.2013 13:16
Avatar
Odpovídá na David Čápka
Martin Konečný (pavelco1998):

Tím máš na mysli, abych si ukládal do pole průběh souboje a na konci provedl INSERT v tomto smyslu?

INSERT INTO table (col1, col2)
VALUES (val1, val2), (val1, val2), (val1, val2)
 
Nahoru Odpovědět 10.8.2013 13:18
Avatar
Kit
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Kit:

A co když jsou dva souboje současně?

Jaká je časová prodleva mezi jednotlivými koly?

Nahoru Odpovědět 10.8.2013 13:23
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Martin Konečný (pavelco1998):

Souboj probíhá pomocí nekonečného cyklu, který se přeruší v případě, že život jednoho ze soupeřů klesne na nulu.
Když bude chtít hráč na někoho zaútočit, klikne na tlačítko, PHP vygeneruje souboj a stránka se hned přesměruje.

 
Nahoru Odpovědět 10.8.2013 13:27
Avatar
Kit
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Kit:

To znamená, že hráč nevidí průběh souboje ale až výsledek?

Nahoru Odpovědět 10.8.2013 13:33
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Martin Konečný (pavelco1998):

V podstatě ano, uvidí až výsledek. Po vygenerování souboje se stránka přesměruje na stránku se zprávami, kde hráč uvidí, jak souboj probíhal. Ale v době generování souboje hráč nic neuvidí.

 
Nahoru Odpovědět 10.8.2013 13:42
Avatar
Kit
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Kit:

Tak ten souboj udělej přímo v databázi. Jeden SQL dotaz, který zavolá vloženou proceduru. Bude to i rychlé.

Nahoru Odpovědět 10.8.2013 13:46
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Martin Konečný (pavelco1998):

Obávám se, že tak daleko mé znalosti nesahají.

 
Nahoru Odpovědět 10.8.2013 14:01
Avatar
Kit
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Kit:

Je to programování jako každé jiné. Procedura je uložena přímo v databázi v přeloženém stavu. Jenom jí dodáš, kdo s kým válčí.

Nahoru Odpovědět 10.8.2013 15:01
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Martin Konečný (pavelco1998):

Teď to zkouším a je pravda, že je to jednoduché. Jen mi to oproti PHP přijde docela nepřehledné.

Pokud to chápu správně, pak nejvhodnější bude předat pouze ID soupeřů a procedura si vše potřebné najde sama a provede souboj. Znamená to, že pak bude stačit zavolat něco takového:

$q = $pdo->prepare("CALL fight (?, ?)");
$q->execute(array($attackerID, $defenderID));

Edit:
Mohl by ses, prosím, podívat, zda na to jdu správně?

DELIMITER $$
CREATE PROCEDURE fight(attackerID INT, defenderID INT)
BEGIN
        SELECT `damage`, `health` INTO @a_damage, @a_health FROM attribute WHERE user_id = attackerID;
        SELECT `damage`, `health` INTO @d_damage, @d_health FROM attribute WHERE user_id = defenderID;
        SET @winner = "attacker";

        loop_fight: LOOP
                SET @d_health = @d_health - @a_damage;
                INSERT INTO fight_lap (id, attacker_health, defender_health) VALUES (NULL, @a_health, @d_health);
                IF @d_health <= 1 THEN
                        LEAVE loop_fight;
                END IF;

                SET @a_health = @a_health - @d_damage;
                INSERT INTO fight_lap (id, attacker_health, defender_health) VALUES (NULL, @a_health, @d_health);
                IF @a_health <= 1 THEN
                        SET @winner = "defender";
                        LEAVE loop_fight;
                END IF;
        END LOOP;
END; $$
DELIMITER;
Editováno 10.8.2013 15:15
 
Nahoru Odpovědět  +1 10.8.2013 15:14
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Martin Konečný (pavelco1998)
David Čápka:

Přijde mi lepší napsat si tu logiku hezky objektově v PHPčku, SQL na tohle není dělané a vždy to bude nepřehledné. Na konci jen zavoláš jeden dotaz s pár inserty jak jsi napsat nahoře.

Nahoru Odpovědět  -1 10.8.2013 15:46
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

OOP není všelék. Business logika v databázi být může. Relační databáze nejsou jen skladištěm dat. Použitím OOP by se to dost zpomalilo. Kompilace několika set SQL dotazů je mnohem náročnější než kompilace jednoho.

Nahoru Odpovědět 10.8.2013 16:38
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Kit:

Vypadá to dost dobře. Možná ještě lépe než v OOP. Máš to docela přehledné.

Nahoru Odpovědět 10.8.2013 16:44
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na David Čápka
Martin Konečný (pavelco1998):

Díky. Zkusím to napsat v SQL verzi a uvidím, jak to půjde. Koneckonců se naučím něco nového. :-)

 
Nahoru Odpovědět 10.8.2013 17:57
Avatar
Odpovídá na Kit
Martin Konečný (pavelco1998):

Také díky. Ještě bych se rád zeptal, zda nevadí vytváření hodně proměnných a provádění hodně výpočtů. Jde o to, že to, jaké hráč způsobí poškození, ovlivní cca 7 faktorů s tím, že se všechny faktory ještě přepočítávají na procentuální šanci (např. kritický útok, blokování, úhyb apod.).

Zatím se vytváří 27 proměnných pro jednoho hráče, čili 54 proměnných jen pro oba soupeře. Z toho 8 proměnných pracuje s funkcí RAND().

 
Nahoru Odpovědět 10.8.2013 17:58
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

A říkám snad, že ano? Je opravdu hloupost dělat tohle v databázi, jedná se o simulaci, k tomu jsou určené objekty. Stored procedures jsou mocným nástrojem, ale určitě ne na tohle, kdy se ukládá jen výstup nějakého procesu, nedochází tedy k zpomalení databáze.

Nahoru Odpovědět  ±0 10.8.2013 18:17
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Kit:

Nevadí to. Jenom je to takové podivné. Podle mne tu hru děláš příliš komplexní.

Nemusíš to všechno cpát do jedné procedury.

Nahoru Odpovědět 10.8.2013 19:08
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Ten tvůj způsob zatíží a zpomalí tu databázi mnohem víc.

Nahoru Odpovědět 10.8.2013 19:24
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Tím, že uložím hotový výsledek? To ani ne. Má tak jednoduchou logiku že to více nejde a cituji tebe: " Podle mne tu hru děláš příliš komplexní.". Nechci vidět, jak bude v tom GOTO paskvilu vypadat až to bude opravdu komplexní.

Nahoru Odpovědět 10.8.2013 19:28
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
jan.vencl
Redaktor
Avatar
jan.vencl:

co pozměnit nějak návrh průběhu souboje co třeba nějaká rekurzivní funkce? která by si předávala pole s datama a pak uložit výsledek jen na konci kdo vyhrál atd atd

 
Nahoru Odpovědět 10.8.2013 20:46
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Abys ten výsledek spočítal, musíš nejprve z databáze ty parametry vytáhnout a to je hodně velká zátěž, pokud jich má tolik. Taháš pak data mezi PHP a DB jak kočka koťata.

Nahoru Odpovědět 10.8.2013 21:06
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Kit:

Ten cyklus můžeš zjednodušit tak, že při každém běhu prohodíš role.

Nahoru Odpovědět 10.8.2013 21:08
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Až ten LOOP paskvil nahradí WHILE @health > 0, tak už to nebude vypadat tak hrozně.

Nahoru Odpovědět  +1 10.8.2013 21:14
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Michael Olšavský:

Na co ty nepoužíváš SQL. Přijde mi, že 98% tvých rad je něco jako: "Proč používat tenhle jazyk, když to jde přes databázy...". Popř. když hájíš nějaký jazyk, oháníš se maticemi a nebo do každého sql kódu házíš triggery. :-D V SQL se nevyznám na takové úrovni, ale rohodně není všemocná. Je to dotazovací jazyk, tak proč tam dávat výpočetní funkce? Chci jen vysvětlení a argumentaci. Netvrdím, že nemáš pravdu. ;-) Každopádně pokud opravdu chce zaznamenávat každé kolo, bude to rychlejší.

Editováno 10.8.2013 21:16
 
Nahoru Odpovědět 10.8.2013 21:15
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michael Olšavský
Kit:

Ty výpočty vůbec nejsou složité, dají se napsat do jednoho selectu. Ani nejsou výpočetně náročné a navíc tyto operace SQL zvládá lépe než PHP.

Základním argumentem je co nejjednoduší a co nejméně početná komunikace mezi vrstvami aplikace, ale i třeba mezi objekty. Tedy princip zapouzdření a izolovanosti.

Nahoru Odpovědět 10.8.2013 21:39
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Martin Konečný (pavelco1998):

Nenašel jsem nic, co by cyklus přerušilo, žádný ekvivalent k break. Proto mi přišlo nejvhodnější použít slovo LOOP, se kterým to jde snadno.

Edit: Pardon, kecám nesmysly. Potřebuji ukončit cyklus podle jedné nebo druhé podmínky, ale nedošlo mi, že to jde.
Možná by se sem měla přidat i možnost smazání vlastního příspěvku, ať pak nejsem za blbce. :-)

Editováno 10.8.2013 21:42
 
Nahoru Odpovědět 10.8.2013 21:40
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michael Olšavský
Kit:

SQL není jen dotazovací jazyk. To je jen jedna část ze čtyř.

Nahoru Odpovědět  +1 10.8.2013 21:41
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Kit:

Zkus prohazovat útočníka a obránce.

Nahoru Odpovědět 10.8.2013 21:42
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Martin Konečný (pavelco1998):

Jo jo, díky za nápad, to by mi rovnou mělo vyřešit i další problém.

 
Nahoru Odpovědět 10.8.2013 21:45
Avatar
Honza Bittner
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Honza Bittner:

Jestli děláš hru jako shakes and fidget, gladiatus atp. tak nač potřebuješ ukládat průběh jednotlivých kol do databáze ?

Podle mně by bylo lepší ... hráč klikne na zaútočit na hráče BLABLA, přejde se na jinou stránku abc.cz/utok/blabla kde se provede výpočet a následně se provede animace kolo po kole souboje, nebo můžeš přeskočit na konečný výsledek.

Databázi do toho zatáhneš jen tak, že odečteš body či peníze apod. co hráč získá/ztratí...

Vážně nevidím důvod proč bys měl zaznamanávat průbehy jednotlivých kol ...

Nahoru Odpovědět 10.8.2013 21:53
Ptejte se mě na cokoli na https://github.com/HoBi/ama a followujte mě na Twitteru https://twitter.com/tenhobi. :-)
Avatar
Odpovídá na Honza Bittner
Martin Konečný (pavelco1998):

Abys měl přehled o souboji i poté, co ho provedeš. A kdo ví, co se s těmi daty dá ještě dělat, přinejmenším nějaké statistiky, které by hráči určitě uvítali (a to mluvím z vlastní herní zkušenosti).

Kdysi jsem to takhle měl, že se uložilo prakticky jen to, kdo vyhrál a kolik jsi získal, ale průběžné ukládání je, alespoň pro mě, mnohem vhodnější.

 
Nahoru Odpovědět 10.8.2013 21:57
Avatar
Honza Bittner
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Honza Bittner:

K čemu ti to bude ? Na konci zápasu vyhodnotíš celkové poškození, ubrané věci, získané věci atp.

Nejvyšší poškození porovnáš se současným a kdyžtak změníš a tak to uděláš podobně s dalšíma statistikama ... přičteš bod k vítězství/porážce atp.

Nahoru Odpovědět 10.8.2013 22:15
Ptejte se mě na cokoli na https://github.com/HoBi/ama a followujte mě na Twitteru https://twitter.com/tenhobi. :-)
Avatar
David Hynek
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
David Hynek:

trochu jsem nepochopil způsob, který jsi zvolil.
Neznám princip tvé hry, ale jestli jsem pochopil:
co kolo to cca jeden záznam do DB, jeden hráč, sto kol. Sto hráčů deset tisíc záznamů...

není to tak trochu zbytečné hromadění informací?

Spíš bych to viděl na podrobnější popis hráče, od záznamu zdraví, síly a pod.

Nahoru Odpovědět  +3 10.8.2013 22:16
Čím víc vím, tím víc věcí nevím.
Avatar
Odpovídá na David Hynek
Martin Konečný (pavelco1998):

Právě proto jsem se na začátku ptal, zda každé kolo má být jeden insert.

 
Nahoru Odpovědět 10.8.2013 22:24
Avatar
David Hynek
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
David Hynek:

Záleží na tom, co od toho chceš.
Bral bych to ve více rovinách. Zaznamenávat vývoj postavy je určitě potřebné, ale tam bych to zredukoval na záznam kdy dosáhl dalšího levelu, kdy koho porazil. Pak nějaký inventář který se bude také asi dost měnit.
A pak ten boj. A u toho bych si asi vystačil jen s tím, že bych updatoval data.

Podle funkce v DB soudím, že o programování něco víš a nerad bych tě svedl z tvé cesty. Je to na tobě :)

To že ti radím, ještě neznamená, že mám pravdu :)

Nahoru Odpovědět  +1 10.8.2013 22:36
Čím víc vím, tím víc věcí nevím.
Avatar
Odpovídá na Honza Bittner
Martin Konečný (pavelco1998):

A když budu chtít vidět, jak probíhala jednotlivá kola, tak to jinak než za pomocí insertů udělat nemohu, ne? Kdybych chtěl například vidět, do kterého kola jsme si se soupeřem byli rovni, a od kterého šly mé šance na výhru výrazně dolu. Výsledky soubojů nebudou tak jasně předem určené, proto bych chtěl dopřát detailní výpis.

Editováno 10.8.2013 22:40
 
Nahoru Odpovědět  +2 10.8.2013 22:38
Avatar
Odpovídá na David Hynek
Martin Konečný (pavelco1998):

Rád si vyslechnu každý názor, nápad a kritiku. Sice už nějakou dobu programuji, ale vím, že v tom pořád nejsem dobrý - a právě proto jsem založil tohle téma. :-)

 
Nahoru Odpovědět 10.8.2013 22:39
Avatar
David Hynek
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
David Hynek:

ale stejně bych to raději dal do dvou vrstev a oddělil statistku od samotné hry.

Nahoru Odpovědět 10.8.2013 22:40
Čím víc vím, tím víc věcí nevím.
Avatar
Honza Bittner
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Honza Bittner:

Když chceš udělat detailní výpis tak si ho udělej (nejdřív vypočítáš souboj a poté si to z informací vytáhni), ale nic neukládej do databáze, jsou to zbytečnosti...

Hráč ho chce vidět jen jednou, pak ho zajímá jen vítězství/prohra...

Editováno 10.8.2013 23:37
Nahoru Odpovědět 10.8.2013 23:36
Ptejte se mě na cokoli na https://github.com/HoBi/ama a followujte mě na Twitteru https://twitter.com/tenhobi. :-)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Kit:

Kompletní statistiku, pokud podle ní nebudeš vyhledávat, můžeš také do DB uložit jako jeden string v JSON nebo XML. Tím se to hodně zjedoduší.

Nahoru Odpovědět 11.8.2013 9:38
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Martin Konečný (pavelco1998):

Nevím, jestli tou statistikou máš na mysli to, co já, ale pokud ne, tak bych JSON formátem tedy mohl uložit klidně i detaily souboje (kolo po kolu). V PHP bych to pak dekódoval pomocí json_decode() a dostal bych pole, které bych pak jen prošel a vypsal detaily.

 
Nahoru Odpovědět 11.8.2013 10:25
Avatar
Honza Bittner
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Honza Bittner:

Jako vážně nechápu proč pořád chceš ukládat celý zápas - 100 kol - do databáze, tam pak budeš mít strašně hodně záznamů a úplně zbytečných

Prostě budeš mít :

stránka 1 : vybereš si hráče na kterého zaútočíš -> klik -> odkaz na stranku 2

stránka 2 : výpočet souboje, vytáhnutí dat do statistiky(max úder atp.) + animaci souboje, zkontrolování ocenění (max úder, přidat 1 k vítězství/prohře), změna peněz/předmětů

do databáze si tedy uložíš jen maximálně záznam že jsi měl zápas a prohra/vítězství a případně si přeuložíš ocenění...

jako mít tam při 1000 soubojů denně 100,000 zápisů je zbytečnost ...

Nahoru Odpovědět 11.8.2013 10:33
Ptejte se mě na cokoli na https://github.com/HoBi/ama a followujte mě na Twitteru https://twitter.com/tenhobi. :-)
Avatar
Odpovídá na Honza Bittner
Martin Konečný (pavelco1998):

Při JSON formátu by tam bylo tolik záznamů, kolik by bylo soubojů. Možná se budeš divit, ale hodně hráčů zajímají detaily souboje i potom, co se provede.

 
Nahoru Odpovědět 11.8.2013 10:40
Avatar
Honza Bittner
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Honza Bittner:

nevidím důvod proč by to chtěli, ale je to tvá hra, tvá věc

mě teda nezajímá, že jsem před měsícem v souboji udeřil silou 550 ...

Editováno 11.8.2013 10:41
Nahoru Odpovědět 11.8.2013 10:40
Ptejte se mě na cokoli na https://github.com/HoBi/ama a followujte mě na Twitteru https://twitter.com/tenhobi. :-)
Avatar
Odpovídá na Honza Bittner
Martin Konečný (pavelco1998):

OK, jestli mi s tím nemáš jak pomoci, tak bych byl nerad, aby se to tu zaspamovalo. Díky.

 
Nahoru Odpovědět  ±0 11.8.2013 10:43
Avatar
Kit
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Kit:

Přesně. JSON se hodí nejen pro ukládání polí, ale i celých struktur. Pokud v něm nebudeš potřebovat hledat fulltextem, tak to ani nebude porušení 1NF.

Nahoru Odpovědět 11.8.2013 11:07
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michael Olšavský
Kit:

V databázích se dnes řeší třeba i takové záležitosti, jako jsou např. kolize a průniky polygonů, statistická analýza dat apod. Jen webaři dělají z SQL databází obyčejný KVS. Zabíjejí tak jejich schopnosti a výkon.

Nahoru Odpovědět 11.8.2013 11:14
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Porušení normální formy to je, když bude chtít přidat nějaký atribut k souboji, tak má problém. Teoreticky je všechno v pořádku, prakticky se někdy rozhodně něco změnit a bude mít velký problém. Tento způsob ukládání dat silně nedoporučuji.

Nahoru Odpovědět 11.8.2013 11:15
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Pokud kompletní zprávu ze souboje budu považovat za atomickou (jak tady všichni navrhujeme), tak to porušením 1NF není.

Nahoru Odpovědět 11.8.2013 11:20
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

To je pravda, ale ona atomická není :) Pokud je ten postup souboje důležitý, měl by se normálně ukládat jako řádky, vybrat pár řádků podle klíče není nic hrozného. Pokud se do db něco ukládá serializované, asi na těch datech moc nezáleží, půjde je jen špatně editovat a je otázka zda jsou vůbec potřeba. IMHO když se tohle dělá, tak je někde chyba v návrhu.

Nahoru Odpovědět  +1 11.8.2013 11:25
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

Jinak celá ta myšlenka ukládání postupu boje je dobré cvičení, ale prakticky nesmysl, jak tu již zaznělo. Ty informace jsou prakticky k ničemu.

Nahoru Odpovědět  +1 11.8.2013 11:26
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Jiří Gracík
Redaktor
Avatar
Jiří Gracík:

Zas takový nesmysl to není, jestli to dobře chápu, tak se to k těm 100 kolům téměř nedostane, je možný že protivník umře třeba ve třetím, občas, když to bude vyrovnané tak třeba v patnáctém (takhle to je běžně u her, ale nevím k čemu těch 100 kol, to je zbytečně moc). Pokud by to bylo kolem těch deseti kol, pak si to velká část hráčů bude chtít přečíst. Už třeba jen proto, že se z toho dají zjistit principy hry, důležitost různých atributů, nejvýhodnější jednotky, zbraně a tak dále :)

Editováno 11.8.2013 11:31
Nahoru Odpovědět  +2 11.8.2013 11:30
Creating websites is awesome till you see the result in another browser ...
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Nebyla zde ani zmínka o editaci reportu ze souboje, o přidávání atributů také ne. Články do DB také nedáváš po odstavcích, ale ukládáš je vcelku.

Nahoru Odpovědět 11.8.2013 11:32
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Martin Konečný (pavelco1998):

Hmm, jak tak vidím, tak asi celé detaily ukládat nebudu. Maximálně dát možnost hráči, aby si zprávu uložil - to by se převedlo do JSON a uložilo do DB, v jiném případě by se to jen jednou vypsalo a pak by ve zprávě byly jen základní informace (vítěz, odměna, celkové způsobené poškození atp.).

Takhle by problém nebyl ani s tím, kdybych třeba přidal nový atribut. Uložená zpráva o souboji by byla jen kopií toho, co se stalo před updatem hry.

Výsledek by byl takový, že by se nehromadily zbytečně nepoužitelné informace, ale zároveň by byla možnost se na ten výsledek podívat i jindy.
Mně se tohle zdá jako docela rozumné řešení, co myslíte?

 
Nahoru Odpovědět  +2 11.8.2013 11:33
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Jiří Gracík
David Čápka:

Pokud to bude realtime boj, tak se mu to ukáže z paměti. Tam to má nějaký smysl, člověk na to čeká atd. Pokud to není realtime, tak mi průběh nepřijde moc důležitý.

Nahoru Odpovědět 11.8.2013 11:33
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Martin Konečný (pavelco1998)
David Čápka:

To je snad ještě horší než předtím. Proč budeš ukládat do DB zprávu v JSON, kde je kdo vyhrál? Zpráva je normální řádek, vítěz je normální sloupec.

Nahoru Odpovědět 11.8.2013 11:35
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Martin Konečný (pavelco1998):

Když budu chtít vědět, kdo vyhrál, podívám se na zprávu o souboji, která přijde vždy. Když si budu chtít uložit kopii detailů, bude mě zajímat pouze průběh souboje. V nejhorším případě se to dá poznat i z toho výpisu, kdo vyhrál (= ten, kdo dal poslední ránu).

 
Nahoru Odpovědět 11.8.2013 11:40
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Je vidět, že jsi tu jeho hru zatím nehrál. Už jsem ji zkoušel a vím o co v ní jde. Martin Konečný (pavelco1998) potřebuje jen vygenerovat zprávu ze souboje tak, aby si ji oba soupeři mohli kdykoli přečíst. Po přečtení ji zpravidla vymažou, ale někteří si ji budou chtít ponechat.

Nahoru Odpovědět 11.8.2013 11:42
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

A to nějak odporuje tomu jak funguje řádek v databázi?

Nahoru Odpovědět 11.8.2013 11:51
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Zabiják na tebe vystřelil z kuše, ale minul. Udeřil jsi ho mečem, ale ochránila ho zlatá přilba. Zabiják na tebe zaútočil kopím, zasáhl tě a ubral ti 6 životů. Vystřelil jsi na něj z luku, ...

Už tušíš, o co tady jde?

Nahoru Odpovědět  +1 11.8.2013 11:52
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Tohle ale není JSON :) Pokud tam chce mít tohle, tak je to ok. Předtím sjme se bavili o logu dat v JSONu.

Nahoru Odpovědět 11.8.2013 11:53
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Třeba nechce úplně ztratit strukturu a chce si zachovat možnost další případné analýzy bez nunosti parsování. Tohle je jen text, který uvidí hráč.

Nahoru Odpovědět 11.8.2013 12:00
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:

Pokud ten tvůj text uložím do JSONu, bude to poměrně složité. Když potom rozšíří způsob boje, bude potřebovat změnit ten formát. Skončí to tak, že bude udržovat zpětnou kompatibilitu se starými logy nebo je bude parsovat a updatovat, obojí je nešikovné. Pokud si uloží řádky textového výstupu, tak proti tomu řešení nic nemám a je správné.

Nahoru Odpovědět 11.8.2013 12:08
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Pokud ty záznamy bude chtít poslat klientovi přes AJAX, tak se naopak JSON docela hodí. A pokud po najetí myší na "zlatou přilbu" bude chtít v bublině zobrazit její schopnosti, je nějaká struktura nutná. Ale až u klienta.

Parsování a updatování JSONu je velmi jednoduché v PHP i v JS.

Nahoru Odpovědět 11.8.2013 14:00
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
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 69 zpráv z 69.