Autor Zpráva
Kaštan
Profil *
Čau lidi. Chtěl jsem si vytvořit takovou textovou hru (něco ve stylu gamebook) pouze pro sebe a pár kámošů a potřebuju pomoct, nebo najít lepší řešení.
Živá ukázka
Nějak se mi to nedaří dobře sestavit a říkám, si jestli to celé nedělám špatně. Z ukázky asi každý pochopí, o co mi šlo. Prostě bude nějaký text a k němu nějaké možnosti a na základě toho, se zobrazí další text a k němu zase další možnosti podle toho co si vybral předtím. Ideální by pro mě bylo, aby to nemusela být mřížka 2x2, ale občas i 3-5 možností a jindy zase třeba jen jedna.
Díky za každou radu.
Kajman
Profil
Je důležité, jak na to místo přišel? Tedy si pamatovat zvolené kroky? Jestli ne, stačí jednoduchá tabulka stavů. S tím že volbou se dostanete do jiného stavu.

var stavy = {
    "uvod": {
        "text": "Stojíš na křižovatce",
        "moznosti": [{
                "popis": "Jít doleva",
                "stav": "vlevo"
        },
        {
            "popis": "Jít doprava",
            "stav": "vpravo"
        }
        ]
    },
    "vlevo": {
        "text": "Šel jsi doleva",
        "moznosti": [{
                "popis": "pokračovat v cestě do leva",
                "stav": "vlevodal"
        },
        {
            "popis": "Vrátit se a jít do prava",
            "stav": "vpravo"
        }
        ]
    },
    "vpravo": {
        "text": "Šel jsi doprava",
        "moznosti": [{
                "popis": "Pokračovat v cestě doprava",
                "stav": "vpravodal"
        },
        {
            "popis": "vrátit se a jít doleva",
            "stav": "vlevo"
        }
        ]
    },
    "vlevodal": {
        "text": "Pokračoval jsi doleva"
    },
    "vpravodal": {
        "text": "Pokračoval jsi doprava"
    }
};
Keeehi
Profil
Je důležité si přitom uvědomit že stavy jsou opravdu stavy a ne akce, jak by se možná mohlo zdát z názvů vlevo, vpravo. On to sice Kajman nazývá stavy, protože teorie za tím se nazývá stavový automat. Jelikož se ty ale pohybuješ po mapě, tak stavem se rozumějí místa na té mapě. Tudíž reálně se ty stavy budou jmenovat palouk, hospoda, jeskyně atp. Ne že by se žádné místo nemohlo teoreticky jmenovat vlevo, ale asi by to bylo hodně matoucí, kdybys přišel do místa vlevo někde třeba ze spoda.
Popis je tedy nějaká akce, kterou hráč na tom místě (stavu) udělá a stav je pak místo (jiný stav) na které ho ta akce dostane.

Ovšem předpokládám, že jen tak chodit po mapě asi není úplná zábava. Takže asi něco budeš chtít na těch místech i dělat. Například otevřít v jeskyni bednu. Ovšem tady se to lehce komplikuje. Ono to místo úplně nemá paměť. Takže kdybys odešel do hospody a zase se vrátil, najdeš truhlu v jeskyni zase neotevřenou. Což bys asi nechtěl. Dalo by se to vyřešit tak, že bys měl dva stavy: jeskyně a jeskyně_s_otevřenou_bednou. A akce otevření bedny by tě přesunula do toho stavu jeskyně_s_otevřenou_bednou. Bohužel nastává další problém, pokud z tohoto stavu odejdeš a nějak by ses dostal do hospody, ta tě zase zavede do jeskyně a ne jeskyně_s_otevřenou_truhlou. Což se dá vyřešit jen tak, že se do stavu hospoda už nikdy nevrátíš. Pokud bys ale chtěl mít možnost do hospody přijít musel bys vytvořit stav hospoda_po_otevření_truhly_v_jeskyni a pohybovat se jen mezi nimi. Prostě do světa před akcí otevření truhly se už nesmíš vrátit i kdyby měl být zbytek světa úplně stejný. Musel bys vytvořit jeho kopii a pohybovat se v něm. Problém s tím je, že se přidala jedna událost a virtuální mapu jsme museli zdvojnásobit. Přidání další události tu novou velikost zase zdvojnásobí. Velikost mapy tedy roste rychlostí 2^n kde n je počet událostí. Řekněme že máme malinkou mapu s deseti místy kam jít a deseti udalostmi na tech místech. Jenom! Tak ten maličký projektík by vygeneroval přes 10 000 stavů. Takže tudy cesta určitě nevede.
Co je ale možnost, je mít pro každé místo vlastní stavový automat, který bude určovat, jak místo vypadá.
var foo = {
    "jeskyně": {
        "zavřená_truhla": {
            "moznosti": [{
                "popis": "Otevřít truhlu",
                "stav": "otevřená_truhla"
            }]
        },
        "otevřená_truhla": {
            "moznosti": [{
                "popis": "Zavřít truhlu",
                "stav": "zavřená_truhla"
            }]
        }
    }  
     
No a pak si budeš jen někde pamatovat že nějaké místo je v nějakém stavu.

Ještě dodám, že pokud nekdo bude na nějakém místě na mapě, tak jeho aktuální možnosti se budou skládat z možností co má k pohybu na mapě + možností co mu nabízí aktuální stav místa.

Záměrně v textu používám někde názvy z teorie a někde ne. Myslím ale že to pomáhá srozumitelnosti. Protože na závěr stavy automatu mají vlastní stavové automaty a mluvit o stavu stavu by asi nebylo nejlepší. Pokud to však i přes to nebude pochopitelné, pokusím se to případně popsat jinak.
Kaštan
Profil *
Nevím a nedaří se mi, ani jedno řešení implementovat do Vue.js. Tu tabulku stavů mám mít odděleně, nebo ji mám dát do 'data:', nebo si kvůli tomu musím vytvořit komponentu?
Kajman
Profil
Tak nemusíte přece použivat vue.js, když v něm neumíte dělat ani si přečíst dokumentaci. Můžete si to napsat jen v javascriptu, dle potřeby. Třeba půjde něco ve stylu
textová hra - živá ukázka
Kaštan
Profil *
Kajman:
Děkuji za pomoc. Začal jsem v tom mít guláš. Vue jsem si vybral, protože jsem koukal na Youtube kanál Yabko a připadalo mi nejlehčí. Chtěl bych si udělat naskok a přihlasit na školu. Je mi 14. Myslel jsem si, že udělat něco podobného je snadné, ale teď když vidím, jak má být výsledek, tak to až tak snadné není. Jako teď už to chápu a dovedu to editovat nebo pokračovat, ale samotný bych to napsat nedokázal. Přijde mi, že je to už dost pokročilé a dost toho ještě neumím. Jelikož hra nejde ukládat, rozdělím ji na několik kapitol třeba po 20. Přidám tam hody kostkou atd. Něco jako Dračí Doupě.
Myslím, že formou hry a zábavy se toho naučím asi nejvíc.


Jinak moje původní myšlenka byla, že to celé udělám pouze přes odkazy a každá nová pasáž bude mít samostatnou html stránku. Jenže pak mě napadlo, že tam chci mít hudbu na pozadí. A aby se pořád nemusela zapínat dokola při přechodu, tak by se to muselo řešit přes iframe. No a nakonec na mě právě skočilo video od Yabko a vue mi začalo připadat jako správná volba.
Kajman
Profil
Pro uložení hry stačí dát do localStorage aktuální místnost. Případně i ty stavy místností (otevřená, zavřená truhla). Klidně to může být pokaždé ve funkci, kde se mění místnost a stav místnosti.

Nebo místo těch dvaceti bloků vypsat uživateli heslo, jak se do nově otevřeného bloku dostane.

Každopádně u tohoto řešení může každý vidět v kódu všechny místnosti, ti šikovní si pak mohou upravit místnosti nebo pravidla pro házení kostkou a podvádět tak. Když by to měla být hra po veřejnost, lepší by byla i spolupráce se serverem, který by ajaxem vracel jen informace z jedné chtěné místnosti.
Kaštan
Profil *
Kajman:
Nedaří se mi zprovoznit, aby v-for dovedlo vypisovat html. Je to vůbec možné? do v-html jde dát pouze moznost.popis.
Popis dané lokace nezobrazuje html, ale vypíše to jako prostý text.
Kajman
Profil
Pokud chcete používat vue.js, tak si k němu přečtěte návod
vuejs.org/v2/guide/syntax.html#Raw-HTML

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

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

0