Zdravim,
Ako by ste riesili nasledujuci problem: chcem naprogramovat trenovanie jednotiek ako napr. v hre Travian t.j. uzivatel si naklika jednotky a tie sa s postupom casu vytvaraju (seriovo - teda za sebou). Napadlo ma viacero rieseni, jedno z nich som naprogramoval ale zda sa mi zbytocne komplikovane. Nechcem to tu pisat aby som Vas neovplyvnil. Staci ked mi napisete nejaky teoreticky rozbor.
Dakujem.
§5 Používání pomocných programů
Používání skriptů a robotů, které automatizují činnosti (jako stavění nebo posílání jednotek) či mění hrací plochu (například Greasemonkeyskripty), je zakázáno. Travian se smí hrát jen v obvyklém internetovém prohlížeči. Dále jsou zakázané všechny skripty a programy, které server silně zatěžují.
<HTML>Kit: otázka je, zda je to tazatelův případ. Já jsem dotaz pochopil tak, že tazatel vytváří onlajnovou hru a chce v ní mít popisovanou fičuru.
Cuchi: Jednotky "vyrobím" najednou, ale nastavím jim čas, kdy začnou být aktivní. Při různých přehledech atd. se budou zobrazovat jen ty aktivní jednotky. To by bylo moje řešení. Má dvě výhody:
1) je geniálně jednoduché
2) vymyslel jsem ho já
má ale i 2 nevýhody:
1) obtížnější identifikace existujících jednotek - ale v podstatě je třeba pouze do všech příslušných dotazů přidat jen podmínku na čas aktivace
2) nutno řešit situace, kdy dojde ke zničení výrobny, nebo naopak k jejímu posílení atd. (ale i to se dá)</HTML>
Ok ale dostavam sa tu znova k problemu: uzivatel bude mat moznost odstranovat jednotky z fronty, potom by sa vsetky casy nasledujucich jednotiek museli prepisat minus cas vyrobenia jednotky.
<HTML>To není takový problém. Víš, jak dlouho trvá výroba té odstraněné jednotky - rozlišíš:
1) jednotka se ještě nezačala vyrábět - zrušíš ji a posuneš časy aktivací o tu dobu zpět všem nevyrobeným jednotkám (takže jednoduchý update s jednoduchým where).
2) jednotka se už vyráběla - patrně budeme ty další chtít vyrobit od začátku, takže zjistíme, kolik času zbývalo do vyrobení té vyřazené jednotky. tu zrušíme a o ten čas snížíme ostatním nevyrobeným jednotkám tu aktivaci.</HTML>
Ok teraz uz mozem povedat ako som to mal urobene:
- pridame jednotky do fronty a priradime im start time a end time (casy kedy sa ma jednotka zacat trenovat a skoncit).
- Kazda dalsia jednotka ma start time = end time predoslej
- Ak sa jendotka vytrenuje "made" parameter sa nastavi na log. 1 a tym padom vypadava z fronty
takto to ide dalej, problem bol vsak v uprave fronty a myslel som si ze je na to nejake lepsie riesenie ale zrejme som sa mylil, tvoje a moje riesenie sa velmi nelisi
<HTML>Ta řešení jsou identická, akorát ty si zavádíš pár pomocných proměnných/sloupců. Ono to jinak normálně nejde, pokud teda nemáš server řídící hru = vlastní perzistentní program používající vícevláknové programování.</HTML>
akce = trenovani
misto = 5 (hala trening lukostrelcu)
trvani treninku = 5 min
poradi v hale = 11
level = 5 (jednotky)
SELECT * FROM jednotky ... WHERE misto=5 ORDER BY poradi ASC LIMIT 5
dostanes prvnich 5 jednotek, ktere se budou ukazovat v hale
SELECT poradi FROM jednotky ... WHERE misto=5 ORDER BY poradi DESC LIMIT 1
dostanes posledni cislo poradove cislo, ktere je volne. kvuli pridani. Za predpokladu, ze hraje 1 hrac, muzes tento dotaz provest pro seriove pridani 1x. V opacnem pripade pred kazdym pridanim.
kdyz neco smazes, nic se nedeje, prvni dotaz vybere usporadane podle cisla. vynechane cislo mu nevadi.
Nevim, k cemu je dobry start time :)
Nemůžu si pomoct, ale připadá mi zbytečné mít v tabulce řádek pro každou jednotku... :-?
A jak těm jednotkám budeš dávat další atributy?
<HTML>Jo, já předpokládal, že jde o hru, kde každý hráč má několik jednotek.</HTML>
Já předpokládál, že každý hráč má několik set jednotek. (Podle jedne z prvních vět "ako napr. v hre Travian"..)
A ty bys chtěl všechny jednotky nacpat do jednoho záznamu databáze?
=Kit=
Řádek pro každý druh jednotky - např. "jezdci","pěchota",.. Jeden sloupec by byl "počet". Ve velkém počtu se ztratí, jestli nějaká jednotka přežila těsně nebo bez zranění.
Freeze (dreamer.kvalitne.cz)
Ten princip, co jsem navrhl by se dal resit pro warcraft, kde si to klikas po jednom. Samozrejme pri tisicovych poctech resis sloupcem pocet celou polozku jako jednu jednotku. Jen vzorcem prepocitas kolik se stihne vytrenovat.
typ = pesi
lev1_cas = 3
lev2_cas = 5
lev3_cas = 5
lev4_cas = 5
lev5_cas = 5
level1 = 200
level2 = 23
level3 = 3
level4 = 1
level5 = 0
totez pro naklady (zlato, jidlo) a pod.
Na koniec som to urobil tak ako som zo zaciatku planoval a ako mi navrhoval Nípal. Script som si zoptimalizoval a vylepsil a teraz bezi uz v poriadku vsetko ako ma. Dakujem vsetkym za odpovede.