PROGRAMATORSKA PRIRUCKA pro hru SNAKE ARENA

# autor: eslav Przywara aka Chester (sqely_programator@chesio.com)
# datum posledni modifikace: 11.3.2005 14:32 SEC


O programu:
Program snake.exe je typicka hra, zalozena na principu rostouciho cervika pozirajiciho potravu. Meritkem uspesnosti ve hre je dosazene skore, ktere se pocita na zaklade poctu snezene potravy a rychlosti pohybu hada.
Obtiznost hry je dana:
 1. Rychlosti pohybu hada a arenou (prostredi, ve kterem se had pohybuje), ktere uzivatel (dale jen hrac) voli na zacatku hry.
 2. Delkou hada, ktera roste s poctem snezene potravy.
Hra konci v momente, kdy had narazi do steny areny nebo 'se zakousne', tzn. narazi sam do sebe.
V pripade, ze dosazene skore je vetsi nez nejmensi ulozene skore pro danou arenu (popr. pocet ulozenych skore je mensi nez max. povoleny pocet) nabidneme hraci moznost zadat svoje jmeno a nasledne skore ulozime na odpovidajicim miste (viz popis unity score.pas nize)

Program se sklada z nasledujicich casti:
 constant.pas - unita obsahujici konstanty a procedury pouzivane v jinych unitach a hlavnim programu
 areny.pas - unita obsahujici definice aren (hracich ploch) a proceduru pro jejich vykresleni
 score.pas - unita obsahujici vse pro praci se souborem, ve kterem ukladame skore
 snake.pas - vlastni program a procedury
 best.sco - soubor s nejlepsimi skore
 help.txt - soubor s napovedou (dostupny i prostrednictvim programu)
 pro_programatory.txt (aktualni dokument) - informace o programu


Strucny popis jednotlivych unit:

const.pas
  - definice zakladnich konstant (viz zdrojak)
  - procedure Vrajt
    - uhlednejsi formatovani textoveho (!) vystupu. Pokud chceme s jeji pomoci vypsat cislo, musime ho predtim pretypovat na retezec.
  - procedure Header
    - vypise hlavicku programu

areny.pas
  - definice konstant a promennych dulezitych pro vzhled hraci plochy (rozmery, barva apod.)
  - procedure DrawArena
    - procedura vykresluje zvolenou arenu (obsahuje definici jednotlivych aren)
    - obsahuje konstanty pro ruzne 'graficke' znaky

score.pas
  - def. konstant a promennych pro praci se skore a souborem, ve kterem skore ukladame
  #globalni#
  - procedure SaveScore(shape:byte; skore:integer);
    - nacte hracovo jmeno ze standartniho vstupu a ulozi dosazene skore
    - nekontroluje, jestli dosazene skore staci na ulozeni! To musim provest pred jejim volanim!
  - function GetMinScore(shape:byte) : integer;
    - zjisti jake je minimalni skore ulozene pro danou (shape) arenu (pokud je pocet ulozenych skore mensi nez max. povoleny pocet, vraci 0)
    - funkci volame pri spusteni hry - po skonceni ihned vime, jestli dosazene skore budeme ukladat a podle toho dale postupujeme (napr. nevolame SaveScore)
  - procedure Scores(shape:byte; skore:integer);
    - zobrazi dosazena skore pro zvolenou nebo prave dohranou arenu - prom. shape
    - pokud byla volana po skonceni hry a hrac dosahl dobreho skore, vypise dosazene skore na odpovidajicim miste a zaroven zavola proceduru InputName, ktera nastavi kurzor pro zapsani jmena
  #lokalni#
  - function FileExists(fname:string) : boolean;
    - zjisti, zda dany soubor existuje
    - bohuzel, zatim neimplementovano - z neznamych pricin pada...
  - procedure ReturnError(error_no:word,error_msg:string);
    - error_no je vysledek funkce IoResult, pokud je error_no ruzny od nuly, vypise chybovou hlasku (tu vzdy zmodifikujeme pomoci error_msg) a nastavi chybovou stavovou promennou na true, abychom pozdeji mohli vyskocit z nadrazeneho procesu
    - volame po kazdem pristupu k souboru
  - function ReadNum(var f:text) : integer;
    - f-ce se pokusi nacist cislo ze souboru na ktery ukazuje f, skonci kdyz se na vstupu objevi 'necifra'
    - pokud hned prvni znak nebyl cifra, vraci zapornou hodnotu (predpokladame cteni jen nezapornych cisel)
  - procedure InputName(line:byte);
    - procedura nastavi pozici kurzoru na souradnice [X_position, line] (X_position je konstanta vypocitana uvnitr procedury)
    - zaroven vypise vyzvu k vypsani hracova jmena

snake.pas
  - vlastni program
  - hlavni program realizuje procedura Game, ktera v sobe postupne vola (az do ukonceni programu) procedury pro:
    - zobrazeni menu
    - vykresleni areny
    - vykresleni hada (pouze pocatecni inicializace)
    - vykresleni potravy (take pouze pocatecni inicializace)
    - vlastni hru
    - konec hry (mysleno vlastni hry, ne programu)
  - hra sama je zajistena procedurou Play
    - ta nastavuje vsechny dulezite promenne a cyklicky vola proceduru Move, ktera zajistuje pohyb hada a vse souvisejici - tzn. volani procedur pro posun hlavicky, ocasku, 'zaseti' noveho jidla, pocitani  skore, pauznuti hry atd.
  - vsechny procedury jsou detailne popsany primo ve zdrojovem kodu, zda se mi zbytecne tady vse znova opisovat

best.sco
  - soubor, ve kterem ukladame skore
  - jeho struktura musi byt nasledujici (// komentar):
    (1.)      1#4#0#2# // pocet ulozenych skore pro jednotlive areny (napr. 2.arena ma 4 skore)
    (2.)               // oddelujici radka
    (dalsi)   1.       // cislo areny
              23#playerXY#  // skore#jmeno_hrace#
              2.
              34#playerA#   // na kazdem radku jeden zaznam!
              27#playerB#
              14#playerA#
              3#playerC#
              3.            // 3. arena nema ulozene zadne skore
              4.            // proto ihned za ni je radek s cislem dalsi areny
              104#playerZ#
              12#playerY#
  - # je oddelovac, definovany v score.pas (ve jmene hrace muzou byt jakekoli znaky krome oddelovace)


Zaverem jeste zname chyby a nedotazenosti:
1. Pri podrzeni kurzorove klavesy behem hry, had nachvili 'ztuhne', pote se znovu rozjede - pricina neznama...
2. Neni osetreno vkladani uzivatelova jmena - pokud obsahuje # (oddelovac), nezobrazi se pri pozdejsim nacteni spravne - zobrazi se pouze cast pred oddelovacem. Tato chyba muze zpusobit vetsi problemy pouze v pripade, ze oddelovac bude hned prvnim pismenem jmena - jake problemy zpusobi ovsem neovereno.
