Programátoři z pekel zde za šat a stravu programují čipová pseuda. Nyní s favicon!

Programujeme v BASICu: Dialogové hry (1)

Beginner`s All-purpose Symbolic Instruction Code. BASIC. První programovací jazyk, který jsem se naučil zhruba v jedenácti letech a provází mě dodnes. Moderní dobou je odsuzovaný, údajně totiž začínající programátory učí nesprávným zvyklostem. První kritici ho označovali za málo strukturovaný, pozdější za málo objektový. Osobně jej považuju za naprosto použitelný, postačující, pohodlný a perfektní. Navíc skutečný programátor se vyzná i ve třetí úrovni vnoření příkazu GOSUB.

Proč byl ale i přes výhrady skoro dvacet let tak populární? BASIC je totiž jazyk od počátku cílený zejména na uživatele-neprogramátory, z toho plyne jeho konverzační nestrukturovaný styl, proto má číslování řádků a proto z něj programátoři obvykle šílí.
Běžný uživatel ale sedl k počítači a pokud chtěl vyřešit úkol, ke kterému neexistoval hotový program, měl tu jednoduchý prostředek jak se řešení dobrat. Otevřel příručku ke svému mikropočítači, který BASIC obsahoval v ROM coby operační systém, programový zavaděč, shell a programovací jazyk v jednom a za pár hodin měl funkční program, který řešil jeho unikátní problém. Dnes takový uživatel obvykle pustí Excel a kliká a kliká a kliká…

Částečně pod vlivem knih „Příručka programátora“ a „BASIC u mikropočítačů“, částečně z důvodu mých sympatií k tomuto jazyku jsem se rozhodl napsat několik programovacích článků. Neumím žádný BASIC ani po skoro dvaceti letech perfektně, na to jsem prošel příliš mnoho jeho dialektů, než abych některým pronikl opravdu až „na kost“. Začalo to Sinclair BASICem, pokračovalo přes QBASIC, TurboBASIC, RAPIDQ a OPL až k VisualBasicu, kterým se čas od času zabývám v práci a který se pravděpodobně objeví i v mojí diplomce. Kromě toho jsem si už zkusil něco napsat i na většině počítačů ze svojí sbírky, takže jsem se seznámil s BASICem na Consulu 2717, IQ 151, Replice 1, Apple IIe (Pravetz) a Apple IIgs. Pointou je, že rozhodně uvítám jakékoliv optimalizující komentáře, takže vidíte-li něco k vylepšení, dejte to vědět.

Předpokládám nicméně alespoň základní znalost BASICových klíčových slov, pokud ji nemáte, tak právě teď je ten správný čas otevřít zmiňovanou příručku k vašemu počítači a dostudovat k čemu že to vlastně je ten PRINT, FOR, NEXT, INPUT, GOTO a další.


Dialogové hry
Na počátku mikropočítačového věku byla komunikace uživatele s počítačem zajišťována terminálem. Nebyla tedy šance takový Altair nebo Apple-I přinutit číst jednotlivé stisky klávesnice a něco podle nich interaktivně dělat. Počítač vypsal zprávu, uživatel si ji přečetl, zadal svoji reakci v podobě textu, bouchl do Enteru a poslal tuto odpověď hezky po sériové nebo paralelní lince zpět do počítače. Ten ji vyhodnotil a nějak zareagoval, často třeba vypsáním zprávy. Kruh uzavřen a jede se znovu.

Stejně fungovaly i první mikropočítačové hry. Přišly tak na svět klasiky jako hádání čísel (např. MasterMind), zvířat („Žije to ve vodě?“, „Létá to?“), slov (šibenice aka HangMan) a desítky dalších. Tyto hry mají výhodu v tom, že se i velmi snadno programují. Nelze tedy začít jinak než pomocí nich.

První dialogovou hrou, kterou bych rád předvedl je odebírání zápalek alias Nim. V základním provedení má velmi jednoduchá pravidla: Na stole je 23 zápalek. Hráč i počítač střídavě odebírají jednu, dvě nebo tři zápalky. Kdo odebere zápalku poslední prohrává.

Za těmito jednoduchými pravidly se skrývá ještě jednodušší matematický princip: Pro výhru je třeba na stole ponechat protihráči jednu jedinou zápalku a toho lze dosáhnout odebíráním (N-1) mod 4 zápalek. V případě, že je tento zbytek po dělení čtyřmi roven nule je naprosto jedno, kolik zápalek odeberete a zde také počítač jako v jediném případě rozhoduje o dalším kroku pseudonáhodně a tak jej můžete dostat do úzkých. Pokud se vám nepovede ho do takovéto situace dostat, prohrajete.

Ukázkový zdrojový kód byl odladěn na počítači Apple IIgs v PRODOS BASICu. Počet zápalek je při každé hře jiný, náhodný a pohybuje se v rozmezí 15 až 45.

 10  LET Z = 15 + 30 *  INT ( RND (1))
 20  PRINT "NA STOLE JE ";Z;" ZAPALEK."
 25  PRINT "STRIDAVE ODEBIRAME 1,2 NEBO 3."
 30  PRINT "KDO BERE POSLEDNI, PROHRAVA."
 35  PRINT "KOLIK ZAPALEK CHCES VZIT?"
 40  INPUT A
 50  IF A < 1 OR A > 3 OR A > Z THEN  GOTO 35
 60  LET Z = Z - A
 70  IF Z = 0 THEN  GOTO 250
 80  IF Z = 1 THEN  GOTO 300
 90  LET A = (Z - 1) - 4 *  INT ((Z - 1) / 4)
 100  IF A = 0 THEN  LET A =  INT (3 *  RND (1)) + 1
 110  PRINT "JA BERU ";A
 120  LET Z = Z - A
 130  PRINT "ZBYVAJICI ZAPALKY: ";Z
 140  IF Z = 1 THEN  GOTO 250
 150  IF Z = 0 THEN  GOTO 300
 160  GOTO 35
 250  PRINT "PROHRAL JSI!"
 260  PRINT
 270  GOTO 10
 300  PRINT "VYHRAL JSI!"
 310  PRINT
 320  GOTO 10

Úprava pro jiné počítače by měla být triviální. Pro Commodore 64 by nemělo být třeba žádných úprav, ZX Spectrum má jiné volání funkce RND atd.


To je napoprvé vše. Příště ještě zůstaneme u dialogových her a si zkusíme přistát na Měsíci.