Diskuze: Lekárnička
V předchozím kvízu, Online test znalostí GameMakeru, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 33 zpráv z 33.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí GameMakeru, jsme si ověřili nabyté zkušenosti z kurzu.
Když tam není středník tak ta lékarnička nejde sebrat a nepřičte to
životy
Vtip?
Aktuálně máš:
pokud je hodnota proměnné global.zivot větší než 50, pak k ní přičti 50...
Je to ale blbost - protože se to vždy řeší tak, že lákarnička přičítá podle velikosti - malá, velká - každopádně nějakou konstatní hodniotu - a pokud je situace, že neumíráš, ale jsi zraněn - a lékárnička by ti přesáhla limit maximálních životů, doplníš je jen na max - ne o konstantu - takže buď použiješ něco jako Math.Min, nebo to uděláš takto:
global.zivot += 50
if (global.zivot > max)
global.zivot = max;
Myslím si, že původní požadavek je doplnit životy do 100, nejvýše však o 50.
global.zivot = min(global.zivot + 50, 100);
Jen pro zajímavost - pod min je podmínka - co? Jakože - to je ale velká
zkratka...
Neznám syntaxi GM ani jeho knihovny, nikdy jsem v něm nedělal. Jestli je
to min()
nebo Math.min()
je mi vcelku jedno, napsal
jsem jen princip.
Operátor +=
, /=
jsou v objektovém programování
dost nebezpečné, protože občas dělají i to, co nechceme. Zvykl jsem si i
na jazyk, ve kterém se obsah proměnných nedá modifikovat.
eh v čem je += nebezpečné? možná leda tím že je nebezpečně krátké nic jiného mě nenapadá
Viz včerejší převod do izometrického zobrazování. David Hartinger tam před převodem vydělil původní souřadnice. Pokud by ty původní souřadnice potřeboval i někde jinde, třeba v jiné metodě, asi by se divil. Zásadou je, aby metoda měla co nejméně postranních efektů.
Netýká se to tohoto případu. Je však chybou, pokud obsah proměnné modifikuješ dvakrát místo jednou.
Napadlo mě vzít tvůj zápis
global.zivot += 50;
if (global.zivot > max)
global.zivot = max;
a trochu mu upravit okolní podmínky. Řekněme, že programátor bude
chtít ušetřit místo a tak dekladuje global.zivot
typu
byte
, který je použitelný pro interval -128..127
.
Proč ne? Životy budou přece v rozsahu 0..100
, tak to stačí.
Hráč bude mít při hře 80 životů a dotkne se lékárny. Hodnota se
navýší o 50, tedy na 130. Jenže to už dojde k přetečení a do proměnné
se uloží hodnota -126. Následující podmínka nebude splněna a korekce se
neprovede. Zdravý hráč při kontaktu s lékárnou chcípne.
Což by se ovšem nestalo, kdyby byla nejprv podmínka a pak změna.
Samotný zápis += s tím zas tak moc nemá do činění, ne?
V daném případě ne. Jsou situace, kdy je naopak použití += žádoucí. Například pokud je += přetíženo na příkaz ADD do objektu nebo databáze. V tom případě by příklad musel vypadat takto:
global.zivot += 50;
Samotné omezení by bylo v setteru. Podle mne by to bylo nejlepší řešení i v této situaci, ale určitě bych tyto dva přístupy nekombinoval.
Jak to s tím souvisí? To se podělá tak jako tak - když to bude byte:
global.zivot = min(-126, 100);
Tak proč to vůbec napadáš? Přeci nebudu debil, a když si dám ten typ byte, tak zvolím jiný postup...
Vysvětli mi, proč používat byte na životy... To rovnou můžeš psát v
0 a 1...
Já to nenapadám. Jen jsem na tvůj algoritmus nasadil jiné (trochu
extrémní) okolní podmínky. Ty jsi funkci min()
nepoužil.
Pokud nedeklaruješ proměnné uvnitř metody, musíš s podobnými zhovadilostmi počítat. Proto je lepší to dát přímo do setteru a přetížit +=, viz výše.
Ukázal jsem, že selhala - vyšlo by z ní záporné číslo - takže jsi napadl mé i tvé řešení... Osobně bych vůbec nedělal v GM - a osobně bych se nezabýval hrami - ale také to sem nepíši... A osobně bych nepoužíval globální proměnné... Kdybych se tu zabýval všemi možnostmi, tak bych se...
Myslím si, že původní požadavek je doplnit životy do 100, nejvýše však o 50.
global.zivot = min(global.zivot + 50, 100);
V případě byte vyjde záporné číslo...
Napadlo mě vzít tvůj zápis
global.zivot += 50;
if (global.zivot > max)
global.zivot = max;
a trochu mu upravit okolní podmínky. Řekněme, že programátor bude chtít ušetřit místo a tak dekladuje global.zivot typu byte, který je použitelný pro interval -128..127. Proč ne? Životy budou přece v rozsahu 0..100, tak to stačí. Hráč bude mít při hře 80 životů a dotkne se lékárny. Hodnota se navýší o 50, tedy na 130. Jenže to už dojde k přetečení a do proměnné se uloží hodnota -126. Následující podmínka nebude splněna a korekce se neprovede. Zdravý hráč při kontaktu s lékárnou chcípne.
Takže k čemu jsi to psal??
Asi už se to posunulo hodně mimo rámec původního dotazu.
GM neumí byte, proměnná global.zivot je sporná sama o sobě
a přetěžování v GM nelze nijak určovat.
Autor dotazu poděkoval a s tím bych to zabalil.
Co psal Kit mi přišlo zajímavé, ale dohadovat se tu skrz to nemusíme.
Ber to trochu s rezervou, protože v C# se operátor +=
přetížit nedá a zřejmě ani v GM ne.
Já stejně nikdy nepochopil potřebu přetěžovat - nebyl jsem v situaci, kdy by nestačilo vytvořit si metodu a tu volat...
V PHP se přetěžování občas hodí:
$a1 = array('jablka' => 8, 'hrusky' => 5);
$a2 = array('jablka' => 6, 'svestky' => 2);
var_dump($a1 + $a2); // array('jablka' => 8, 'hrusky' => 5, 'svestky' => 2)
V C# a Javě se zase běžně přetěžuje "+" u řetězců nebo metoda toString() u objektů.
Ještě, že já v PHP neprogramuji... Vlastně jednou v začátcích mé
kariéry
, jsem studoval
přetížení výpisu z pole - ale nikdy bych to již nevyměnil za LINQ... A
LINQ je vlastně dobrý nástroj pro obdobu ToString - ovšem s vlastním
nastavením logiky...
Musíš si zažádat o redaktorská práva a dáš jí do kategorie devbookátor jako ukázkovou hru.
Zobrazeno 33 zpráv z 33.