PERL - hra - vas nazor/chyby/pripomienky

Sekcia: Programovanie 13.07.2013 | 20:26
Marcel   Návštevník
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)
    • RE: PERL - hra - vas nazor/chyby/pripomienky 14.07.2013 | 01:52
      Avatar wamba   Návštevník

      tak rezervy tam určítě jsou a všechny odstranit naráz by byl téměř nadliský úkol :)

      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řidat my, 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,

      především dobrý textový editor (popř. IDE)
      dále pak např. perltidy
      perlcritic i když na ten je u tebe možná ještě brzo
      • RE: PERL - hra - vas nazor/chyby/pripomienky 14.07.2013 | 20:01
        Avatar Marcel   Návštevník

        V 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

         

        $ano = A;
        $nie = N;
        if ($zmena_vkladu = $ano){
        	vklad();
        }
        elsif ($zmena_vkladu = $nie){
        	die "Ďakujeme za záujem, dovidenia.\n";
        }
        

         

        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)

        • RE: PERL - hra - vas nazor/chyby/pripomienky 14.07.2013 | 21:00
          Avatar bedňa LegacyIce-antiX  Administrátor
          V skratke:

          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 :)
          Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org
          • RE: PERL - hra - vas nazor/chyby/pripomienky 14.07.2013 | 21:43
            Avatar Marcel   Návštevník

            No... za pokus to stálo.

             

            Ale uz to mam, treba citat vsetky riadky ukazkoveho programu :)

        • RE: GOTO 15.07.2013 | 01:18
          Avatar wamba   Návštevník

          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) a while 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í subrutiny goto &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ě :)

        • RE: porovnávání řetězců 15.07.2013 | 01:43
          Avatar wamba   Návštevník

          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 pravda

          tedy ve vašem případě "A"=="N" je pravda (porovnává se 0==0) :)

        • RE: odsazování 15.07.2013 | 01:58
          Avatar wamba   Návštevník

          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 si perltidy kocky2.pl a pak si prohlédnout soubor kocky2.pl.tdy.

        • RE: kocky2.pl 15.07.2013 | 03:17
          Avatar wamba   Návštevník

          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):

            
          sub vklad {
              print "Tvoj kredit je $kredit. O koľko si chceš zahrať?: ";
              chomp( my $vklad = <> );
              if ( overenie_vklad($vklad) ) {
                  hrej_s_vkladem($vklad);
              }
              else {
                  vklad();    #popř.goto &vklad;
              }
              return;
          }
          
          sub overenie_vklad {
              my $vklad = shift;
          
              if ( not $vklad <= $kredit ) {
                  print "Bohužiaľ, nemáte tolko prostriedkov v kredite.\n"; 
                  return 0;
              }
          
              if ( not $vklad > 0 ) {
                  print "Vklad není kladný\n";
                  return 0;
              }
          
              return 1;
          }
          

          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

    • RE: PERL - hra - vas nazor/chyby/pripomienky 14.07.2013 | 15:43
      Avatar bedňa LegacyIce-antiX  Administrátor
      Ako píše Wamba goto je zlá nepekná vec.
      Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org
    • RE: PERL - hra - vas nazor/chyby/pripomienky 14.07.2013 | 22:16
      Avatar d_   Návštevník
      funkcie nepoznas?

      P.S.: goto no ...
    • RE: PERL - hra - vas nazor/chyby/pripomienky 15.07.2013 | 11:04
      Avatar bedňa LegacyIce-antiX  Administrátor
      Inak už 11rok mi doma leží kniha Naučte se Perl za 21 dní. Ja som ju dal za 15 dní aj s fungujúcim webom :) Tú knihu som už nikdy viac neotvoril a nič v PERLy nerobil, ak chceš darujem ti ju.
      Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org