Diskuze: Prosím o zjednodušení.
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 15 zpráv z 15.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Když to tak vidím, tak bych hlavně řekl – MVC!
http://www.itnetwork.cz/…architektury
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).
Výhoda v PHP je, že lze dynamicky skládat skoro cokoliv
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)
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.
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.
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š.
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.?
Když to zjednoduším, tak hra se bude skládat ze 3 základních procesů..
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 )
----------------------------------->
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.
Čí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 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 ). 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ů.
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 . Zatím mě to baví, tak proč si nehrát
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á
)
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.
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ě
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š
Zobrazeno 15 zpráv z 15.