Ahojte, dnes som si sadol k noťásku a po pár hodinách z toho vyliezlo toto.
Chcel by som len poukázať na fakt, že ešte len dnes som otvoril 1x perl.
Zaujíma ma Váš názor => čo by sa dalo spraviť inak a lepšie, rýchlejšie a pod... lebo také veci sa v príručkách moc nepíšu.
Keďže sa jedná o program, čo beží v terminály, ako by som mohol dosiahnuť to, že po odohraní prvej hry sa mi okno zmaže a nanovo sa veci vypíšu (kôli úhľadosti)
tak rezervy tam určítě jsou a všechny odstranit naráz by byl téměř nadliský úkol :)
především dobrý textový editor (popř. IDE)goto
se v takovéto podobě používá jen ve vyjimečných případech, místo toho raději použij smyčku např.while
dále si přidej na druhý řádek
use strict;
a to tě před všechny proměnné donutí přidatmy, our, local, ...
zkus odstranit zatím tohle (kdyby ti to nešlo tak ti pomůžu/eme) a pak bych ti popřípadě poradil další úpravy
ten script funguje a je celkem dobře formátovaný, což je určitě k tvé cti,
tak se nenech odradit a dál zkoušej
PS.jsou věci co ti můžou pomoci v programování
Perl
-u,dále pak např.
perltidy
perlcritic
i když na ten je u tebe možná ještě brzoV prvom rade dakujem za tipy a postrehy.
Zbavil som sa GOTO ale nie cez while - rozmyslal som nad tym ale neslo mi do hlavy ako to spravit, aby vyskocil z Ifu a siel na spravne miesto... Ibaze by som tam narafal niekolko while, v sebe vnorenych ale to mi sprislo ako dost neprehladne a narocne riesenie (najma ak som to mal do kodu dopisat a nie cele napisat nanovo :D )
Tak som z GOTO presiel na last ale to mi robilo problemy, pak na next - to uz slo ale nie vsade, tak som kod rozstrihal na podprogramy a goto, last, next, continue a neviem co vsetko som nasiel nahradil tym, ze po skonceni (prebehnuti) podprogramu som na jeho konci odkazoval na iny podprogram - tak uz bolo len treba ustrazit, aby kazdy jeden koncil odkazovanim na iny (ak sa nejednalo o ukoncenie celeho programu) a zaroven na spravny - nazvem to logicky nadvaznym.
Tiez som to spravil aj preto, ze ked uz som bol vo svungu koli vyhodnoteniu po vyhre/prehre ktore sa mi opakovali 3x uplne rovnako, tak som si povedal, ze by to mohlo byt riesenie namiesto GOTO - ci uz dobre, to posud ty :)
Mam vsak otazky, preco je to GOTO take zle? funguje to, a robi to presne to, co od neho chcem - tu sa stopni a chod tam a tam a pokracuj akoby nic. Je to koli tomu ze ak je program robustny, tak to spomaluje alebo robi chyby ci ako? Ako nie si jediny co mi to hovori / pise ale odpoved ako "nepouzivaj to a bodka mi akosi nestaci, najma ak to vyvojaro perlu vymysleli a stale to v jazyku udrziavaju...
Za dalsie, v miestach kde sa hrac ma rozhodnut co chce pokracovat (1/0) by som chcel dat Y/N alebo A/N tak ako to byva bezne, ale akosi mi to nejde.
Robil som to tak, ze som v Ife priradoval hodnoty nie 1/0 ale pismena, to sa mu vsak nepacilo, tak somm skusil cez pomocne premenne, ktore sa mali vyhodnocovat
stale mi to nebere. Napad? Riesenie?
za dalsie, ked uz mam pouzivat use strict (naco je to dobre, resp lepsie nez rovno pouzivat premenne?), nevedel som ci je lepsie ich deklarovat na zaciatku celeho programu alebo az v podprograme akonahle sa objavia?
Sorry asi ssa pytam az moc ale posledna otazka:
ako udrziavat prehladnost kodu, ked by som sa teraz zozhodol, ze to co mam musi byt v Ife (alebo v niecom inom) ako dat na vsetky riadny tabulator (najlepsie nie manualne), lebo oznacit blok textu a stlacit TAB nie je najstastnejsi napad.
Na toto vsetko sa pytam preto, ze tuto hru som realne s kockami hraval o korunky este na zakladnej so spoluziakmi a viem, ze tam je este kopec pravidiel a pod co som zatial nenapisal (Ale napisem :D)
Teraz to vyzerá o moc lepšie.
Goto je prasárna, skáčeš po kóde ako koza, toto sa ti rýchlo vypomstí keď kód presiahne tvojich pár riadkov, poďalšie to môžeš písať rovno v asemblery, keď nechceš použiť vymoženosti vyšších jazykov.
$ano = "A"; // Toto je reťazec (string)
if ($zmena_vkladu == $ano){ // hehe fail :)
No... za pokus to stálo.
Ale uz to mam, treba citat vsetky riadky ukazkoveho programu :)
goto
značně znepřehledňuje orientaci v kódu, některé starší jazyky nebo nízkoúrovňové jazyky nepodporovali iteraci pomocífor (foreach)
awhile
např. Basic nacmém Commodoru to neuměl nebo třeba PIR (jestli se nepletu).goto
v Perl-u se dá použít i při volání subrutinygoto &fuction
což má své opodstatnění. Dále by se dal možná někde najít (popř.) zkonstruovat skript, kde odstraněnígoto
z kódu by bylo značně složitéPs. budu odpovídat s dovolením postupně :)
na porovnávání řetězců se v Perl-u používají
lt gt le ge eq ne
na rozdíl od číselného< > <= >= == !=
má to své opodstatnění např.
100 < "2aa"
není pravda,100 lt "2aa"
je pravdatedy ve vašem případě
"A"=="N"
je pravda (porovnává se0==0
) :)Trochu se budu opakovat.
Správně odsazovat (popř. ulehčit odsazování) umí každý "dobrý" textový editor.
perltidy
vám automaticky doplní odsazování. Zkuste siperltidy kocky2.pl
a pak si prohlédnout souborkocky2.pl.tdy
.konečně k vašemu kódu: :)
Především pokrok lze jasně vidět. Přístup přes subrutiny a jejich vzájemné volání je trochu neobvyklý, ale zcela korektní.
Nicméně se mi zdá, že v tomto případě je kód až příliš rozdělen na mnoho subrutin (dále sub).
Každá sub by měla dávat smysl sama o sobě. Zpravidla každá sub dostává nějaké "hodnoty" na vstupu a nějakou "hodnotu" dává na výstup a mezi sub se sdílí jen minimum proměnných.
use strict;
zabraňuje jednak chybám v psaní např. nepovolí$zmwna_vkladu
, dále pak "nutí" držet v kódu pořádek (dělit globální a localní proměnné atp.).proměnné se deklarují zpravidla když jsou potřeba většinou s udáním hodnoty.
Např. takhle by mohli vypadat některé úpravy ve vašich sub (při globální proměnné
our $kredit
):zkuste udělat další úpravy a pak by jsme vám poradili dál
PS. zas tak moc mi nevěřte ve vysvětlování jsem zjednodušoval, sem tam něco vynechal a nebo jsem prostě mohl udělat chybu
P.S.: goto no ...