Avatar
katrincsak
Člen
Avatar
katrincsak:

Zdravím,

pomůže mi někdo jak tohle napsat co nejlépe? Je jasné, že vše se znásobí tak minimálně na 100x a více. Posílám v pastebin odkazy kvůli odřádkování a přehlednosti.

  • Rád bych našel nějaké lepší řešení.
  • Zároveň aby bylo co nejjednodušší na zpracování bez větší zátěže.
  • Bylo by dobré to vše načítat z DB něják?

(Všechny 3 navazují krásně na sebe 1 za druhým a druhý za třetím)

  1. http://pastebin.com/V22CU39i
  2. http://pastebin.com/JvSzmz4A
  3. http://pastebin.com/cJ6vG62Y

Co to přesně dělá nebo má?

Náhodně se generují dotazy kam se hráč chce vydat.

  1. Fáze -> Hory, řeky, jeskyně atp.. (Cesta)
  2. Fáze -> Co tam vidí? Domek, chatu, truhlu, strom atp (Co vidíš)
  3. Fáze -> Kopneš to? Půjdeš dovnitř atp.. (Akce)
  4. Fáze -> Výsledek (Ten ještě není)

Defakto bych rád objektově (což se snažím) přidával předměty, objekty, světy do hry v klikací formě. Každému tomu předmětu přidal akci a nějaký popis..

Vše mi funguje, přesně jak potřebuji (není to dodělané ale o to nejde) Potřebuji pomoct s tím jak by jste tohle řešili případně vy a jak to zjednodušit.

  • Není snad potřeba zde psát kod, stačí mi to nějak popsat a cokoliv rád dovysvětlím.

Děkuji všem co si s tímto dají trochu času.

Editováno 2.5.2015 0:02
 
Odpovědět 2.5.2015 0:01
Avatar
Filip Pýrek
Redaktor
Avatar
Odpovídá na katrincsak
Filip Pýrek:

Když to tak vidím, tak bych hlavně řekl – MVC!
http://www.itnetwork.cz/…architektury

Nahoru Odpovědět 2.5.2015 0:17
„The best way to predict the future is to invent it.“ — Alan Kay
Avatar
katrincsak
Člen
Avatar
katrincsak:
  • Na to se určitě také mohu lépe podívat ;-)
  • První soubor zatím obsahuje více v jednom. Jiné věci mám rozdělené např. SQL dotazy atp.. Což zde je mám tady, zatím úmyslně.
 
Nahoru Odpovědět 2.5.2015 0:28
Avatar
Odpovídá na katrincsak
Martin Konečný (pavelco1998):

To, co chceš udělat, neni nic jednoduchýho. Záleží, jak moc komplexní to chceš mít. Pokud ty akce nebudou příliš složitý, šlo by si udělat funkce, např.

function otevrit($kdo, $co)
{
  // akce
}

function sebrat($kdo, $co)
{
  // akce
}

function kopnout($kdo, $koho)
{
  // akce
}

// atd.

ty funkce by ti pokryly jednotlivé akce popsané ve třídě MapaObjektAkce.
Pak bys mohl tyto funkce dynamicky volat, např.

$id = 123;  // ID hráče
$player = new Player($id);
$opponent = new NPC();
$action = $_POST["action"];  // tam by byly ty akce jako zabit, mluvit apod.

call_user_func_array($action, array($player, $opponent));

Jak jsem psal, záleží na tom, jak složitý to chceš mít. Pokud bys dokázal ty funkce napsat tak, aby to dělalo to, co chceš, pak by prostředí hry šlo udělat velmi snadno (v podstatě bys jen v nějakém poli (třeba) popsal, co kde je a co kde jde dělat a potom bys pouze dynamicky volal ty funkce).

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 2.5.2015 0:34
Avatar
Martin Konečný (pavelco1998):

Výhoda v PHP je, že lze dynamicky skládat skoro cokoliv :D
Mohl bys dynamicky vytvořit i nějaký objekt podle toho, kde se zrovna hráč nachází. Například bys měl lokaci Les, ve který by byl NPC vlk. Z DB bys pak vytáhnul klíč (tomu by odpovídal i název třídy).

$locationId = 123;
$npcKey = Database::fetchSingle("SELECT key FROM npc WHERE locationId = $locationId");

// $npcKey nyní obsahuje wolf
$className = ucfirst($npcKey);  // $className = Wolf

$npc = new $className();

call_user_func_array("attack", array($player, $npc));  // hráč by nyní zaútočil na vlka (funkce by dostala objekt třídy Wolf)
Editováno 2.5.2015 0:39
 
Nahoru Odpovědět  +2 2.5.2015 0:39
Avatar
katrincsak
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
katrincsak:

Martin Konečný (pavelco1998)
Mám v plánu to pak ještě rozšířit a možná o něco více komplexní, ale minimálně by mohlo být tohle o něco lepší. Od tebe ty rady jsou vždycky fajn. Zítra(dnes) to zkusím.

  • ID tolik neřeším, již se jedná o přihlášeného uživatele s právy. Zatím samozřejmě bez zápisu a jakéhokoliv uložení.
  • Jak by jsi ještě řešil kontrolu před dokončením celé té série? Aktuálně to ukládám do session. Jakmile se vrátí zpátky, nebo vymaže session, nebo půjde na jiný PC, tak musí začít znovu nebo by v případě špatného výsledku mohl proces obejít. Já to řešil zápisem do DB ukládáním procesu. Takže před každým dalším výsledkem/dotazem jsem se ptal DB "jaký číslo procesu máš?" + uložil předchozí. Ale jiné řešení asi logicky není, než data fyzicky někam uložit a možná rychlejší než toto ukládat do txt.
  • Rozhodně i tak uvítám více názorů ;-)
 
Nahoru Odpovědět 2.5.2015 1:01
Avatar
Odpovídá na katrincsak
Denis Homolík (Alfonz):

Místo aby jsi celý ten postup ukládal do sessionu, bude lepší když si tam uložíš jen id a pomocí něj ukládat do databáze.

Nahoru Odpovědět 2.5.2015 7:47
Vše je možné, dokud si to myslíte!
Avatar
katrincsak
Člen
Avatar
Odpovídá na Denis Homolík (Alfonz)
katrincsak:

Možná jinou možnost mít nebudu, ale nejedná se jen o insert, ale i o select, který později může být náročnější. Každá linie musí mít i ověření. Ale to bych mohl ukládat spíše až od dané akce. "Když už tě napadnou, tak se nevrátíš v čase" ale pakliže budeš např. u stromu, tak se defakto klidně vrátit můžeš.

 
Nahoru Odpovědět 2.5.2015 9:33
Avatar
Odpovídá na katrincsak
Martin Konečný (pavelco1998):

Máš tu hru ve stylu, že hráč jednou začne, v průběhu hry se dostává někam dále v ději a nějak to skončí? Nebo takovou tu nekonečnou klikačku, jak je v browser hrách? Že si uděláš postavu a donekonečna můžeš dostávat úkoly, zabíjet příšery, dělat levely apod.?

 
Nahoru Odpovědět 2.5.2015 11:50
Avatar
katrincsak
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
katrincsak:

Martin Konečný (pavelco1998)

Když to zjednoduším, tak hra se bude skládat ze 3 základních procesů..

  1. Hrdina (PVE).
  2. Vesnice (PVP i PVE)
  3. PVP (Útoky vesnice na jiné atp) (Mohu přirovnat např. k Divokým kmenům)..

Hrdina bude chodit na výpravy (Což je to proč jsem založil toto vlákno) a bude na výpravě získávat řekněme vše co bude potřeba a co bude moct obstarat hrdina. Aby to nebylo jen kliknutí a čekání, tak nás napadlo to udělat v této možná částečně originální formě. Vzhledem k tomu, že se do toho již učím jQuery a JavaScript, lze očekávat i později nějakou interaktivitu. Když se povede udělat zajímavý příběh na výpravy a hodně možností, tak to může být zajímavé.

Ve vesnici se bude stavět, budovat, zlepšovat možnosti i třeba urychlovat "imaginární" pohyb + vytváření jednotek a nějakých dalších výhod proti spoluhráčům..

Pro pochopení a představu mohu přirovnat směs divokých kmenů a hry Shake and Fight. Obě hry jsou defakto klikací a nejsou vůbec špatné (i když na SaF nic nevidím, ale hrajou to :D)

----------------------------------->
Koukal jsem na ten script, chvíli mi trvalo pochopit pravý význam, ale jestli jsem to pochopil dobře, tak jsi v MapaObjektAkce.php jen moje "IF" vyměnil za funkce a přidal k nim ($kdo, $co) ? Takže v aktuálním scriptu budu mít stále stejný počet řádků? (Já jen jestli jsem to pochopil dobře)? Každopádně i tak jsi mi otevřel další logičnost a využití případně pole a POST hodit do proměnné, to mě ani nenapadlo.

 
Nahoru Odpovědět 2.5.2015 12:40
Avatar
Odpovídá na katrincsak
Martin Konečný (pavelco1998):

Čím víc složitostí do toho scriptu budeš dávat, tím víc podmínek tam budeš mít, a později v tom bude strašný chaos :D V aktuálním scriptu to možná vyjde na stejný počet řádků, ale když si ty akce nějak zautomatizuješ (použiješ funkce, které pak budeš volat s jinými parametry), ušetříš si milion pozdějších podmínek, protože to ty funkce udělají uvnitř a vrátí ti určitý výsledek.
Ono se to takhle špatně vysvětluje, podle mě je tohle pro OOP jako dělaný, ale ten návrh jednoduchý nebude. Stačí nějaká chyba a celý systém se ti může rozsypat (tzn. že budeš muset obcházet špatný návrh a vznikne z toho dost nepřehledný kód).

Abych pravdu řekl - pokud nemáš s OOP delší zkušenost, tak bych takový projekt nedělal (vlastní zkušenost :D). Procedurálně je to sebevražda (pokud to nemá dělat jen pár přímočarých akcí) a s OOP to bude chtít mít dobře navrženou strukturu objektů.

 
Nahoru Odpovědět 2.5.2015 13:03
Avatar
katrincsak
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
katrincsak:

Podobně jsem to měl na mysli jak jsi teď vysvětlil. Aktuálně to nic nezmenší, ale pro další vývoj to může být už velký rozdíl. S něčím podobným jsem i někde daleko v duchu počítal, ale i když se tohle zdá být jednoduché, tak mi chvíli trvalo než jsem vymyslel tu logiku celého procesu.

S OOP relativně začínám (což asi sám dokážeš odhadnout jak dlouho). Sebevrahy jsem nikdy nechápal, ale v tomto směru mám občas sebevražedné sklony a rád překonávám své možnosti i když cesta je složitá.

Chci se pokusit co nejlépe provést automatický výběr jakéhokoliv procesu ve výpravě. Zároveň, tak aby bylo možné data nasypat do DB a vše pošlape jak hodinky :D. Zatím mě to baví, tak proč si nehrát ;-)

Editováno 2.5.2015 13:14
 
Nahoru Odpovědět 2.5.2015 13:14
Avatar
Lukáš Červený:

Ještě máš možnost vytvořit metody jako umiKopnout, umiKousnot, umiLezt a muzeBytKopnut, muzeBytKousnut a muzeBytVylezen (ta čeština zní hrozně, ale nic lepšího mě nenapadá :D )
Pak si vytvoříš pro každý předmět třídu a v ní implementuješ zmíněné metody. Takže bys k nim mohl přistupovat třeba takhle:

$objekt = new Clovek();
$objekt->umiKopnout() // vraci true
$objekt->muzeBytVylezen() // vraci false

No a pak je můžeš docela výhodně použít v podmínce:

$objekt = new Clovek();
$objekt2 = new Strom();
if($objekt->umiLezt() && $objekt2->muzeBytVylezen()) $objekt->vylez($objekt2);

Kontrolu pak můžeš integrovat přímo do metody a akci provést v bloku try ... catch:

class Clovek
{
  public function umiLezt()
  {
    return true;
  }
  ...
  public function vylez($kam)
  {
    if(!$kam->muzeBytVylezen())
    {
      throw new AkceException("na objekt nejde vylezt");
    }
    else
    {
      // lezu
      $kam->vylezlNaTebe($this); // odezva cile
    }
  }
}

$objekt = new Clovek();
$objekt2 = new Strom();
if($objekt->umiLezt())
{
  try
  {
    $objekt->vylez($objekt2);
  }
  catch(AkceException $e)
  {
    // nepovedlo se to
  }
}

Zmíněné metody samozřejmě můžeš přesunout do různých abstraktních tříd a rozhraní z těch pak dědit a implementovat, aby sis ušetřil práci a zvýraznil logiku aplikace.

 
Nahoru Odpovědět  +1 3.5.2015 0:17
Avatar
katrincsak
Člen
Avatar
Odpovídá na Lukáš Červený
katrincsak:

Mnohokrát děkuji za další návrh i toto je pro mě dobrou inspirací i když to možná nesplňuje přesně moje požadavky, ale rozhodně dobrý nápad. Co se týká češtiny/názvů tak jsi to aspoň popsal tak jak je to zcela jasné, takže pohoda.

Ještě využiji oba nápady na změnu, ale na konec těch možností automaticky nebude tolik. Rozhodl jsem se, si nakreslit mapu na čtverečkovaný papír. Každý čtvereček bude obsahovat kus mapy. Pomocí formuláře a "name" ve kterém bude 1, 2, 3 atp.. Tedy něco jako souřadnice, budu přesně vědět jak popsat příběh celé mapy. Jediné co bude probíhat automaticky a zcela náhodně, tak potkání příšery, truhla, předmět nebo jiné nevysvětlitelné náhody...zakopnutí atp.. :) Takže to na konec bude mnohem lepší.

Jen si říkám bude v dnešní době bavit někoho bojování a průchod mapou imaginárně? Sice to bude možná s pěkným příběhem, ale i tak? Je pravdou, že to nebude jedinou věcí hry. Je to jenom vylepšení čekajícího systému.. Kliknu a musím čekat 20 minut atp.. Což tohle umožní hrát třeba i 24h denně :-)

 
Nahoru Odpovědět 4.5.2015 10:19
Avatar
hanpari
Redaktor
Avatar
Odpovídá na katrincsak
hanpari:

Co třeba toto :)

$methodOne = function ()
{
        echo "I am  doing one.".PHP_EOL;
};


$methodTwo = function ()
{
        echo "I am doing two.".PHP_EOL;
};

class Composite
{
        function addMethod($name, $method)
        {
                $this->{$name} = $method;
        }

        public function __call($name, $arguments)
        {
                return call_user_func($this->{$name}, $arguments);
        }
}


$one = new Composite();
$one -> addMethod("method1", $methodOne);
$one -> method1();
$one -> addMethod("method2", $methodTwo);
$one -> method2();

Je to trochu pokročilejší a určitě ne dokonalé, ale je to zajímavá technika. Napsal jsem to narychlo, možná by to šlo inteligentněji, ale spíš mi šlo o to ti ukázat možný způsob jak využít closures :)
Můžeš si namíchat třídu, jak potřebuješ :)

Editováno 4.5.2015 13:52
 
Nahoru Odpovědět  +1 4.5.2015 13:51
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 15 zpráv z 15.