projekt Partie

Obsah
Minimální a doporučená konfigurace
---------------------------
O stránce
Tato stránka je kompletní dokumentací k projektu Partie, její aktuální verzi najdete na internetu, kde je navíc ke stažení nejnovější verze. Najdete zde jak technické informace o projektu, tak i nápovědu k programu (je i v programu samotném). Kromě toho si můžete z deníku přečíst, jak vývoj projektu probíhal.
O nás
Jmenuji se Libor Tinka (na fotce vlevo) a jsem programátorem a vedoucím našeho soutěžního týmu. U projektu jsem se staral samozřejmě o úhledný a stabilní kód programu, ale také jsem navrhnul prostředí hry. Studuji na gymnáziu Vídeňská v Brně.
Můj bratr se jmenuje Jakub Grós. Měl na starosti grafiku a desing, ale také mi velice pomohl a poradil ve svízelných situacích. Studuje gymnázium v Uherském Hradišti.
O projektu
Šachový program s možností hry proti počítači, stopováním času
a trojrozměrnou šachovnicí. Součástí programu je také práce
s partií (načítání,ukládání), herní pozicí a nastavení
uživatelského rozhraní (to lze také nahrávat a ukládat).
Program se ovládá výhradně pomocí myši, má podobné rolovací
nabídky jako prostředí Windows. Běží na platformách MS-DOS a
MS-WINDOWS 98/ME (na jiných nebyl program testován).
Minimální a doporučená konfigurace
Program by měl běžet na všech typech PC, byl testován na 486DX, doporučuji však rychlejší procesor, hlavně z důvodů vykreslování grafiky, tedy nějaké Pentium (>75 MHz).
Program využívá grafický mód 640x480 při 16 barvách. K běhu programu je tedy zapotřebí VGA karta. Stejné požadavky platí pro monitor.
Pro ovládání programu je nezbytná myš, tato periferie je pro program dokonce důležitější než klávesnice (lze ovládat pouze myší).
Program využívá pouze základních 64KB paměti, ale maximální velikost spouštěného programu (EXE) musí být minimálně 213,414 bytů, nepočítám-li spouštění externích programů (intro, 3D šachovnice); je tedy třeba počítat tak s 363 KB volné paměti pro spouštění.
Rozpis souborů
PARTIE.B00, PARTIE.B01, PARTIE.B02 - banky obrázků ke hře
PARTIE.BMP - úvodní obrazovka (barvy palety jsou na počátku černé kvůli "rozsvícení")
PARTIE.CFG - soubor s aktuálním nastavením programu
PARTIE.CT - centralizační tabulka (informace pro poziční oceňování situace na šachovnici)
PARTIE.DEF - soubor s neměnným standardním nastavením programu
PARTIE.EXE - vlastní program
PARTIE.HLP - nápověda programu (kódování LATIN2)
PARTIE.HTM - stručný popis programu
PARTIE_D.HTM - dokumentace (tato stránka)*
PARTIE.ICO - ikona programu (pro Windows)*
PARTIE.JPG - foto autorů*
PARTIE.KOM - komunikační soubor (předávání parametrů externímu programu)*
PARTIE.LAT - stručný popis programu (kódování LATIN2)*
PARTIE.LNG - jazykový balíček (obsahuje český a anglický jazyk do programu)
PARTIE.MSK - "masky" pro tvorbu trojrozměrných figurek
PARTIE.PAL - paleta úvodní obrazovky pro její "rozsvícení"
PARTIE.PGN - ukázkový textový záznam šachové partie (kompatibilní s programem)*
PARTIE.POS - ukázkový soubor se šachovou pozicí (kompatibilní s programem)*
PARTIE.SGP - zdrojový kód hlavního programu*
PARTIE.TXT - stručný popis programu (kódování WINDOWS)*
PARTIE_K.BMP - fotka grafika
PARTIE_L.BMP - fotka programátora
PARTIE3D.EXE - externí program s 3D šachovnicí (nespouštět samostatně!), tato součást je nestabilní
PARTIE3D.SGP - zdrojový kód zobrazení 3D šachovnice*
* lze smazat bez omezení funkčnosti programu
Nápověda k programu
PARTIE
Nová - zahájí novou partii
- zahájení partie znamená nastavení výchozí pozice na šachovnici, vyčištení
partiáře; na tahu je bílý
Načíst - načte partii nebo herní pozici z disku
- zobrazí se seznam souborů, ze kterého lze zvolit
- podle herního módu se buď načte celá partie nebo herní pozice
Uložit - uloží partii nebo herní pozici na disk
- zobrazí okénko s dotazem na název souboru
- podle herního módu se uloží buď partie nebo herní pozice
- je nutné zadat správnou příponu (.PGN/.POS)
Konec - konec práce s programem
VOLBY
Vzít zpět - vrátí jeden tah a posune pozici v partiáři o tento tah zpět
- nelze provádět v turnajovém módu
Dopředu - provede následující tah a posune pozici v partiáři o tento tah
vpřed
- nelze provádět v turnajovém módu
Prohodit strany - soupeři si vymění své pozice (na tahu je druhý hráč)
- nastavení hry se nijak nemění
Vzdát se - hráč na tahu vzdá hru a prohrává, hra končí
Nabídnout remis - hráč nabídne svému soupeři remízu a ten zvolí, zda ji
příjme (nerozhodně), nebo ne (hra normálně pokračuje)
Hra/Tvorba pozice - přepínání mezi herním módem a editačním módem, který se
vztahuje na editaci herních pozic
- po provedení změn na šachovnici se smaže partiář, takže není možné
hru uložit; je to kvůli zachování "integrity", protože uložené hry
mohou být zahajovány pouze z výchozí pozice
NASTAVENÍ
Animace figur - přepíná možnost figur pohybovat se po šachovnici plynule
- toto nastavení se vztahuje jak k tahům počítače, tak k tahům, které
provádí člověk, pokud nemá nastavebo přetahování figur
Přetahovat figury - přepíná možnost pohybovat s figurami myší ("chňapat")
- při přetahování figur se figurka "uchopí" a přesune na požadovanou pozici
na šachovnici; poté se teprve pustí tlačíko myši
Počítač hraje za bílého - přepíná stav bílého hráče (člověk/počítač)
Počítač hraje za černého - ekvivalentí
- takto lze nastavit i hru dvou počítačů
Vyhledávání.. - nastavení způsobu vyhledávání a obtížnosti hry
- jsou tři způsoby vyhledávání:
- půltahy - program propočítá všechna potenciálně dobrá pokračování
do dané hloubky a vybere to nejvýhodnější, resp. nejméně
ztrátové
- časový limit - platí pro počítač; program počítá tak dlouho, dokud mu
nevyprší čas (jedna sekunda před vypršením), poté
provede nejlepší tah, který vypočítal
(implicitní hloubka je zde 5 půltahů)
- turnajový mód - časové omezení pro obě strany, pokud jedna strana
nesplní limit, tah jí propadá
- nekonečný výpočet - program počítá tak dlouho, dokud není přerušen
uživatelem
Uložit nastavení - uloží aktuální nastavení na disk
- k nastavení patří kompletně nastavení prostředí + prodlevy pro animace a
po kliknutí myši
Načíst nastavení - načte nastavení z disku (automatické při spuštění programu)
Onovit původní nastavení - načte standardní neměnné nastavení
Jiné.. - ostatní nastavení (prodleva po kliknutí, rychlost animace)
ZOBRAZENÍ
3D šachovnice - spustí externí program s náhledem šachovnice ve třech
dimenzích
- šachovnice se otáčí pomocí kurzorových šipek
- přibližování a oddalování (zoom) se provádí klávesami +,-
- pohyb šachovnice se provádí klávesami 4,8,6,2
- !POZOR! Tento modul nebyl v testu stabilní!
Fisherovy hodiny - zobrazí/schová hodiny stopující čas bílého a černého hráče
- Fisherovy hodiny mají dva ciferníky (pro každého hráče zvlášť),
sekundovou, minutovou a hodinovou ručičku
Partiář - zobrazí/schová seznam tahů
- čísla na partiáři označují celé tahy, do kterých se počítá posun figur obou
stran
- kurzor ukazuje poslední tah
Ocněné uzly - zobrazí/schová displej s počtem koncových uzlů
- při výpočtu tahu do větších hloubek se herní strom stále větví;
počet "listů" tohoto stromu, tedy tahů v největší počítané hloubce
jsou právě koncové uzly
Zajaté figury - zobrazí/schová seznam sebraných figurek
- umožňuje hráči udělat si materiální představu o někdy dost nepřehledné
situaci na šachovnici
PGN informace - zobrazí/schová informace pro hlavičku souboru s partií/pozicí
- tyto informace patří do hlavičky PGN nebo POS souboru a napomáhají lepší
klasifikaci partií/pozic
Prostředí.. - okno s nastavením uživatelského rozhraní
- sem patří volitelné grafické prvky na obrazovce, včetně nastavení barev
Česky/English - přepínání dvou jazyků
- angličtina se ve hře nevztahuje na tuto nápovědu
INFORMACE
Vše - nápověda výpisem
jednotlivých funkcí
O projektu - okno s licenčním ujednáním a kontaktem na autory
Historie
3.6.2002 - zahájení projektu
Dneska mi konečně došlo, že jestli chci na soutěži dosáhnout nějakých valných výsledků, musím už teď začít s programem. Protože budou následovat prázdniny a já nebudu mít zas až tak tolik času, chci dokončit celý engine v Pascalu do konce června. Sedl jsem si k počítači a začal psát. Kupodivu se mi podařilo nějak vymyslet, jak bude pracovat vyhledávač tahů - rekurzí. Ale bude vůbec rekurze v Baltazarovi možná? Musím to ještě promyslet. Stejně tak alfa-beta odsekávání v mém algoritmu, které značně zvyšuje sílu programu z blbce na začátečníka. Podařilo se mi dokončit funkci na určování, zda je nebo není šach. Nevím, jestli spolehlivě funguje, ale snad ano...
5.6.2002 - algoritmus je asi hotov
Vzhledem k tomu, že se nechci pouštět v Baltazarovi do rekurze, potřebuji nějaký složitější (rekurze v tomto případě zjednodušuje) algoritmus. Konečně se mi podařilo dát něco do hromady. Napsal jsem nějaké vedlejší funkce a procedury, ale jinak jsem neudělal nic zvláštního. Už vím, jak budu vyhledávat a vyškrtávat tahy tak, aby se program nerekurzivně dostal alespoň na čtyři půltahy (úroveň rekreačního hráče, možná i lepší). Nejspíš se bude sestavovat pole variací, kde se bude hledat tah s nejlepším hodnocením na základě hodnocení tahů nastávajících.
10.6.2002 - první pokroky s tahy
Včera a předevčírem (víkend) jsem se domluvil s bratrem Kubou na spolupráci. On bude dělat grafiku (figurky, políčka šachovnice, logo...) a já to ostatní. První sadu figurek už máme nakreslenou v BaltEditu a na dalších alespoň devíti sadách brácha nyní pracuje. Mně se konečně podařilo vychytat mouchy, blechy, vši a jinou havěť z programu, takže jsem mohl začít s vyhledávačem tahů. Není to úplný vyhledávač, tím myslím podprogram, který by našel tah protivníka, ale pouze procedura, jež zjistí všechny přípustné tahy bílého/černého. Po hodině práce se mi podařilo, aby procedura nalezla tahy pěšců a jezdců. V nejbližší době se pokusím o zbytek figur, což už bude brnkačka. Než však začnu s vlastním vyhledávačem tahů počítače, budu muset dokončit i možnost rošády a přeměny pěšce (vlastně se bude ke každému tahu zapisovat stručná informace o stavu na šachovnici, tedy: hodnocení, šach/mat/pat ... to ještě musím promyslet).
11.6.2002 - vyhledávač tahů z pozice je skoro hotov
Netrvalo to dlouho a vyhledávač možných tahů z určité pozice je skoro hotový. Funguje pro všechny figury, nepočítá však s rošádou a jak jsem si všiml, ani s braním pěšci. To jsou však také celkem jednoduché věci, takže by měli být hotové do pozítřka. Taky jsem trochu načal minimaxový algoritmus, ale ten přestože funguje, má sílu jen jeden půltah (dělá tahy, které v aktuální pozici přinesou největší zisky) a nezná ani šach ani mat, takže i když jsem si s ním zahrál několik partií (např. 1.e4 Ja6 2.Sc4 Vb8? 3.Df3 Va8?? 4. Dxf6 mat), nestálo to za řeč. Při jednom půltahu síly je sice o něco lepší, než kdyby hrál úplně náhodně, kód je přímo triviální, ale porazí ho i naprostý začátečník, který se zrovna dnes seznámil s pravidly šachu. Než se tedy pustím do minimaxu a alfa-beta odsekávání, budu muset pořádně otestovat vyhledávač tahů, jestli opravdu spolehlivě funguje. Jakákoliv chybička by se pak změnila ve velkou chybu, kterou by bylo opravdu těžké hledat. Do zítřka navrhnu algoritmus ve formě vývojového diagramu a pokud zítra Bůh dá, bude už program konečně schopen vyvíjet slušné tahy (a možná bude i hotový).
12.6.2002 - vyhledávač tahů je takřka u konce
Asi jsem se včera přecenil, protože jsem netušil, jak dlouho mi potrvá implementace obyčejné rošády. Tu jsem dokončil právě dnes a myslím, že je to předposlední součást vyhledávače tahů. To však neznamená, že se na podprogramech ještě nebude pracovat, protože je před přepisem do Baltazara podrobím optimalizaci a při testování se vždycky pár much najde. Nyní je třeba ještě zkontrolovat vyhledávač tahů (pro různé situace) a implementovat ještě přeměnu pěšce (předpokládám, že program bude místo přeměn pěšců na dámy uvažovat, zda by nebyla výhodnější jiná varianta; může totiž nastat situace, kdy ...e8J! mat je zásadně lepší než ...e8D - můžou však nastat i situace s hlubšími důvody). Minimaxový algoritmus už mám na papíře a zbývá jen přepis (nebude to tak snadné). Zítra bych měl alespoň stihnout rozpracovat minimax.
13.6.2002 - s problémy ještě není konec!
Už nebudu dělat žádné prognózy do zítřka, protože dnes jsem se ještě zabýval hledáním chyby v rošádě a po zbytek podvečera jsem implementoval přeměnu pěšce. Tím vznikl další problém, protože počítač musí po přeměně pěšce počítat se čtyřmi případy přeměn. nicméně jsem tento problém vyřešil (jednoduše se vygenerují čtyři tahy v případě počítače, v případě člověka si může člověk samozřejmě vybrat). S proměnou pěšce jsem ještě neskončil, takže zítra to už SNAD utnu a budu se moci věnovat minimaxu....
15.6.2002 - může se začít s minimaxem
Nyní už jsem implementoval i proměnu pěšce, takže jsem vyčerpal všechny možné tahy z pozice a můžu se pustit do minimaxu. Podle schématu by měl minimax fungovat dobře, ale při přepisu nejspíš dojde k nějakým problémům. Nechám se překvapit zítra.
16.6.2002 - problémy s implementací minimaxu
Dnes jsem snad zcela dokončil rozhraní pro uživatele (hry hráč-hráč, hráč-počítač, počítač-hráč a počítač-počítač) a nahrubo napsal kód pro minimax i s alfa-beta odsekáváním. Nevím jak, ale podařilo se mi udělat o mnoho kratší a elegantnější schéma. Ve starém schématu, kde se linky různě křížily a tvořily jakousi logickou spleť, jsem se nedokázal orientovat, a už vůbec ne to přepsat do Pascalu. I kdyby se mi to povedlo, objevila by se v programu návěští, což je pohroma pro další přepis (vězte, že elegantní algoritmy návěští vůbec nepotřebují, stačí jim podprogramy). Začal jsem tedy znova a povedlo se. Implementaci a dokončování předešlých restů s minimaxem jsem věnoval celý den a myslím, že zítra bych už měl KONEČNĚ algoritmus zcela dokončit. Nyní má program velikost 16 288 bytů a já se stále více obávám přepisu do C. Některé struktury do Baltazara prostě nevím jak dostanu, takže je budu muset interpretovat jako podprogramy v C. Moje nároky však jsou, aby byl program co nejvíce v Baltazarovské stromové struktuře. Druhou stránkou je vlastní přepis do C, který znamená nastudování některých pasáží z učebnice, ale to by neměl být problém. Zatím netuším, jak to udělám s podprogramy, které volají podprogramy, ale to zkusím nastudovat z učebnice "Céčka" a Baltazara během mojí dovolené (3.7.2002). Volný čas do dovolené využiji buď k pokusům s 3D grafikou v Pascalu a editorem na figurky (neměl by to být zas až tak velký problém), anebo už se pokusím o přepis (zatím půjde o surovou textovou podobu, jejíž funkčnost je však klíčová).
17.6.2002 - poslední chybičky
Minimaxový algoritmus z papíru skutečně funguje, ale dnes jsem neměl dost času ho otestovat. Z knížky jsem si vytáhl jednu skvělou pozici pro testování minimaxu (při různých hloubkách dělá různé tahy) a vyzkoušel ji. Bohužel při normální šachové partii se mi prográmek nějak zakousl, takže doufám, že to nebude alfa-beta odsekáváním a ještě to pořádně otestuji. Nicméně jsem si nechal vypisovat úplný strom do hloubky tří půltahů (vypisovaly se mi všechny tahy a jejich hodnocení). Program skutečně dělal co má a opravdu prošel celý strom, ale chyba byla a momentálně stále je v předávání hodnoty až ke kořenu (hodnota tahu se počítá v závislosti na hlubších tazích a problém byl v tom, že hodnoty "nevyplavaly" až na povrch). Neměl by však být velký problém ji opravit, to však nechám na zítra. Algoritmus už KONEČNĚ kompletně pracuje na hloubce 1 půltah, což je sice mizerné, ale alespoň něco. Obávám se, že jsou tu ještě malé problémy jako: maty a paty (proč se nedetekují?), pravidlo o padesáti tazích (brnkačka, pravidlo o třech tazích už mám hotové) a brání en-passant (to bude možná chtít malou úpravu). Nakonec bude potřeba to všechno zkontrolovat (např. jestli černý nedělá dvakrát rošádu).
18.6.2002 - konečně už hraje!
Po odstranění chyb v minimaxu (odstraněním těchto chyb vznikly další chyby v úplně jiných částech programu, takže dalo docela práci celý program "stabilizovat") jsem mohl vyzkoušet hru při větších hloubkách, která pro mě vůbec nebyla zklamáním. Tomu předcházelo mnoho práce s vypisováním celého stromu a nacházením spousty chyb (s některými jsem se už dlouho/vůbec nesetkal). Minimax sice pracuje, jak má, ale stále jsou to naprosto suché tahy a je potřeba dát tomu šťávu. Jak na to? Nejprve budu muset ještě implementovat ten en-passant a projít všechny možné druhy situací, které mohou nastat (uff), přičemž se určitě objeví pár chybek, co budou chtít ošetřit. Nemělo by to být tak strašné, takže by mi měl zbýt nějaký čas na "osvěžení" hry počítače. Především ještě omrknu alfa-beta odsekávání, protože mám neblahý pocit, že nefunguje (při čtyřech půltazích jsem na tah čekal přes deset sekund). Další dost důležitou úpravou bude zabránění opakování tahu (při hře počítač-počítač obvykle dochází k remízám kvůli opakování stejného tahu) a taky oceňování pohyblivosti figur (dost důležitý faktor, ale na první místo dávám materiál). Málem jsem zapomněl,. že tu byla ještě malá moucha s přeměnou pěšce (člověk si nemůže vybrat a počítač si volí jezdce místo dámy). Rozhodl jsem se ostatní dodělávky (např, časové omezení při přemýšlení počítače) dodělat až v Baltazarovi a vůbec přepsat kód do Baltazara co možná nejdřív. Jelikož jedu s rodinou na dovolenou, potřeboval bych na cestu nějaký notebook (:-).
20.6.2002 - špatná zpráva
Když jsem tak přemýšlel o alfa-beta odsekávání, uvědomil jsem si, proč je vlastně program tak pomalý. Je to tím, že pro každý uzel nejprve vyhledám všechny možné tahy a ty pak oceňuji. Při programování jsem si vůbec neuvědomil, že nejvíc času se nešetří jen neoceňováním tam, kde to není třeba, ale hlavně tím, že "zbytečné" tahy se vůbec nemusejí provádět. Program tedy neocení všechny tahy, ale všechny je provede, čímž nestoudně vzroste poměr časová náročnost ku hloubce prohledávání. Řešením je překopat celý program (grr). Výhodou bude prostší a efektivnější kód. Opět by bylo jednoduché nasadit rekurzi, ale té se snažím vyvarovat. Naštěstí dneškem prakticky končí učení a navíc bude víkend, který zasvětím dokončení šachového programu (ne celý, přestože mám časový skluz jak hrom).
24.6.2002 - jde to ztěžka
Nemohu uvěřit, že mi to jde tak pomalu. Kvůli rychlejšímu algoritmu jsem musel celý program napsat prakticky znova (některé struktury, jako třeba vykreslení šachovnice, jsem prostě zkopíroval), takže asi proto se tak brodím... Dnes jsem (doufám) dokončil hru dvou lidských hráčů a dynamický prohledávací algoritmus je na světě (dokonce už je implementována jeho základní část). Budu taky muset zakomponovat vracení tahů, které ve "statické" verzi nebylo, no a taktéž nastavení hloubky prohledávání a hráče. To vše během hry, takže bude nejspíš zapotřebí nějaké menu. Na to se kouknu během zítřka a dnes zkusím načít nějakou tu 3D grafiku (zatím třeba jen vykreslení šachovnice). Naštěstí mám ještě své starší stránky, které se okolo 3D grafiky točí..
25.6.2002 - pokroky s dynamickou metodou
Přestože se mi podle náčrtků a zdrojáku (ten jsem si pro přehlednost vytiskl) zdá všechno naprosto jasné, vůbec nevím, jak budu všechny ty "obraty" v programu přepisovat, ale asi si s tím nějak poradím. Ostatně, budu na to mít i s grafikou necelý měsíc, což je šeredně málo (nepočítám zhruba dvoutýdenní rezervu na návrhy a všechny ty věci, kde se nedá ani velmi nepřesně určit, jak dlouho budou trvat). Stačí už jen málo úprav ve zdrojáku a program by měl přemýšlet rychleji než předtím už jen pro fakt, že provede podstatně méně operací, než u "statické" verze. Během dnešního večera si pěkně v klidu udělám návrh na dokončení programu (pfff), projdu si celý zdroják na papíře (když jsem si ho chvíli prohlížel, hned jsem našel dvě zásadní chyby), protože v textovém Pascalu, byť i v VGA - 50-ti řádkovém módu, je kód pro věčné listování dost nepřehledný (nevím jak vy, ale já se už ve dvacetikilovém prográmku občas chvilku hrabu, než najdu to pravé místo). Co se týče návrhů na 3D šachovnici, zlobila mě deformace šachovnice při rotaci, ale přestože jsem tuto chybu neodstranil, znám už její příčinu, kterou odstraním snadno. Je to dáno nastavením perspektivy. Objekt mi moc ubíhá do středu obrazu, a tak jsou body jaksi stahovány a nedrží se na šachovnici rovné linie (ne, že by to nevypadalo nezajímavě). Prvním problémem je zde tvorba 3D editoru (nic nezvládnutelného) a vlastně taky způsob vykreslování objektů figurek na šachovnici v libovolném úhlu (taky prakticky vyřešeno - přišel jsem na to na autobusové zastávce pře cestou Uherské Hradiště - Brno). Jsem rád, že se mé úsilí pomalu vyplácí a taky, že budu moci konečně podat zprávu o dokončení programu.
1.7.2002 - ovoce z dynamického prohledávání
Přestože zítra už odlétám na jiný kontinent, snažil jsem se dnes dohnat, co se dalo. Bohužel jsem pořádný šachový kód do konce června ani nedokončil, takže mám obavy, zda to všechno vůbec do konce prázdnin stihnu. Nejlepší by bylo sehnat do týmu nějakého Baltazaristu, který by dokázal podle mých pokynů a vývojáků napsat kód, ale nevěřím, že ještě někoho takového seženu. Dnes se mi poprvé podařilo přimět program, aby prohledával dynamicky do hloubky 1 půltah a podle čísel se zdá, že zvládne i větší hloubky, ale je tu ještě jedna moucha, která by vyplavala na povrch v případě, že program "učešu". Teď už vůbec nemám čas, takže si celý program prostě vytisknu a případné chyby zkusím najít pomocí trasovacích tabulek (to je snad nejstarší metoda, jakou znám). Velikost programu je k mému údivu asi o 6 KB větší, než velikost jeho "statického" brášky, ale důležitá je rychlost. Mám dojem, že jsou v programu zbytečné pasáže, ale ty budu muset najít na papíře. Vypadá to, že už vše spěje ke konci, takže hned po dovolené (dva týdny v cizině, kde si však především odpočinu od práce a školy) se pustím do optimalizace kódu a koncem měsíce musí být kompletní alespoň základ v Baltazarovi, jinak tu není ani pramalá šance na úspěch. Zatím je to drama.
14.7.2002 - dva dny po dovolené
Ne, že bych toho na dovolené tolik stihl (pár ošklivých vší jsem v kódu našel), ale dnes se mi po skoro dvoudenní práci podařilo docílit toho, že program prohledává do hloubky 3 půltahy. Zatím je to jen čistý minimax (žádné odsekávání), ale funguje naprosto perfektně. V testovací pozici podle knihy nalezl pro hloubky 1,2 a 3 příslušné tahy i se správným ohodnocením, takže předávání hodnot uzlů ve stromu už mám konečně za sebou. Upravil jsem i pár nedodělávek ohledně en-passant a braní pěšcem, ale stále ještě musím dořešit rošádu (jde o to, že počítač by si špatně pamatoval stav rošád ve hře a nemusel by s nimi vůbec počítat). Vyřešil jsem zakončení hry: počítač si velmi cení remízy (matu jsem přidělil hodnotu 10000, patu 9000), pokud tedy není v dohledu mat, počítač bude usilovat o remízu. Zítra se pokusím program "učesat" a zprovoznit i pro uživatele (zatím byl jen v experimentálním stadiu, přestože uživatelské rozhraní už bylo částečně dokončeno), což bude znamenat i zakomponovat pravidlo o třech a padesáti tazích (v podstatě jen vše přepíšu ze starší - "statické verze"). Mám dobrou náladu, protože úsilí se vyplatilo. Do konce tohoto měsíce musí být hotový základ v Baltazarovi, čemuž brzké dokončení algoritmu v Pascalu jen pomůže, ale přesto bude přepis těžký z hlediska odlišného programovacího jazyka (C) a hlavně struktury programu (stromová).
15.7.2002 - rvačka s alfa-beta
Vždycky, když něco programuji a zdá se, program je bez chyb, přidáním nějaké komponenty se spousta součástí jakoby zhroutí a je nutné je všechny modifikovat, aby to celé dohromady fungovalo. Tahle zkušenost ve mě vypěstovala to, že nevěřím v bezchybnost programu; spokojím se však s tím, že to nějak funguje (ale bez důkladných testů nepovažuji žádný program za ukončený). Další komponentou (tenhle pojem nepoužívám ve spojitosti s objektově-orientovaným programováním, myslím tím jen další přídavek do programu; Partie bude programována strukturovaně, jinak to zatím v Baltazarovi nejde) je alfa-beta odsekávání, od kterého jsem si sliboval velké urychlení programu. Půl dne mi trvalo, než se mi alfa-beta podařilo zprovoznit. Když jsem si zobrazoval herní strom, zjistil jsem, že alfa-beta funguje přesně, jak má, ale odsekaných větví bylo příliš málo. Porovnával jsem si počet prošlých uzlů při různých hloubkách u moderního programu. Tento program propočítával podstatně méně uzlů, přesto se však jejich počet v porovnání se schopnostmi mého programu shodoval alespoň řádově. Uvědomil jsem si, že cizí program nehodnotí tahy jen podle materiálové bilance (rozdíl hodnoty mých figur proti soupeřovým), ale hodnota tahu se upravuje dalšími oceňovacími kritérii, jako je například pohyblivost figur (mé figury musí mít co největší počet polí, na které mohou táhnout; naopak soupeř by měl mít volných polí co nejméně) anebo centralizace (snaha ovládnout centrum šachovnice např. obsazením pěšci - souvisí to však s pohyblivostí). Ani nemluvím o zavedení dalších pravidel, které do Partie asi ani zavádět nebudu (nemám na to nervy). Patří do obecných znalostí každého šachisty, patří sem třeba držení pěšců v jedné řadě či snaha dostat krále do bezpečí nejlépe rošádou. Myslím, že docela bude stačit zavést pohyblivost, takže jen těžko se najde hodně tahů se stejnou hodnotou. Tím by se měl (teoreticky) zefektivnit algoritmus alfa-beta. Také jsem si vzpomněl na postřeh jednoho mého kamaráda z gymnázia. Povídal něco o odsekávání stejných tahů. Mluvil spíše o vyhledávání jedné strategie, což je pro mě nadlidský úkol, ale motivoval mě k jednomu nápadu, který se ukázal jako skvělý (šlo o jistou úpravu alfa-beta -- program s touto úpravou skutečně odsekal spousty tahů a dokonce vyřešil testovací pozici na výbornou; bohužel nemůžu přijít na to, jak to vlastně funguje a proč). Naštěstí jde vše podle plánu, přesto pomaleji, než bych chtěl.
16.7.2002 - ne a ne to skoncovat
Dnes jsem skutečně bleskurychle udělal oceňování na pohyblivost figur, které záměrně upravuje stávající hodnoty tahů velmi jemně. Na prvním místě je samozřejmě materiál. Figurkám jsem nedávno upravil koeficienty, které jsem vyčetl z knihy: pěšec 1.00, jezdec 3.25, střelec 3.50, věž 5.00, dáma 9.00 a král 1000.00 (musí to být víc, než je součet hodnot všech figur, aby počítač krále nikdy nezkoušel měnit a zároveň o soupeřova krále usiloval). Dnes jsem si zavedl další konstantu, tedy hodnotu pole, kterou jsem si podle sebe nastavil na 0.0001. Oceňovací funkce ke stávající hodnotě podle materiálu (-40.50 až +40.50) připočítává ještě poziční výhodu (ta je v intervalu 0.0000 až ±0.0062). Tahy jsou tedy v mém programu hodnoceny na čtyři desetinná místa, což má svůj význam právě v tom, že se dává přednost materiálu před poziční výhodou díky větší číselné hodnotě a při stejném materiálu jsou určující právě dvě poslední desetinná místa. Po aplikaci tohoto oceňování naštěstí nenastaly žádné problémy a program skutečně vyhledával rychleji a stejně efektivně. Myslel jsem si, že už se konečně dostane s počtem ohodnocených uzlů do tolerance jisté tabulky z knihy (alfa-beta odsekávání má mít takovou účinnost, že při n minimaxem prohledávaných tazích stačí ve skutečnosti prozkoumat jen asi pět krát odmocnina z n s naprosto stejným výsledkem). Omyl. Do hloubky čtyř půltahů se sice program dostal za necelé tři sekundy, což mi stačí (čtyři půltahy stačí na 99% rekreačních hráčů a navíc se na tah nemusí vyloženě čekat), ale i jednoduchý ukázkový šachový program v Q-Basicu to dokázal v lidském měřítku hned. U pěti půltahů jsem si mohl i odskočit na malou, než počítač konečně našel tah. Marně jsem v programu hledal chybu, vše se zdálo správně. Tak jsem to vzdal a pokusil jsem se zprovoznit rozhraní pro uživatele (zadávání tahů, hra s počítačem). Pak mě ale mohl trefit šlak, když cosi ve vyhledávací proceduře zasahovalo do paměťových míst, kde to nemělo co dělat, takže z toho byly "neplatné operace" a program padal. Dost mě to naštvalo, takže jsem toho pro dnešek nechal. Nechápu, proč oceňovací procedura vypovídá službu v cyklu, kde se volá jen jednou a samostatně volaná pracuje ... správně? Ne - špatně! Když jsem ze základní pozice nechal počítač počítat do hloubky pěti půltahů, po skončení vyhledávání na šachovnici přibyli dva pěšci. Z toho plyne, že něco musí být špatně. Následující postup tedy bude takový, že budu optimalizovat, odvšivovat a "vymetávat pavučiny" v celém programu, který má teď velikost 32 234 bytů. Spoustu míst pro budoucí optimalizaci jsem si označil speciálním znaménkem v komentáři, takže se nebude nic hledat. To, co jsem neoznačil a bude určitě upraveno, jsou do očí bijící homogenní struktury, kde se dá leccos "povytýkat", jak tomu říkám já. V programu nebudou žádné vnořené funkce a procedury, ani proměnné, nic lokálního. Je to z důvodu pozdějšího přepisu. Stále píšu pozdějšího, ale moc času už není. Kolik problémů je potřeba ještě vyřešit? Kolik překážek ještě zbývá k cíli? No, motivace mi nechybí. Právě mě napadlo něco pro mnohem rychlejší oceňování...
17.7.2002 - lov na chyby byl úspěšný
Dnes jsem věnoval celé dopoledne optimalizaci a opravám chyb, které se v programu vyskytovaly. Konečně jsem implementoval rošádu a en-passant, uživatelské rozhraní je kompletní (program rozpozná konec hry), bylo optimalizováno zjišťování šachu (soupeř se mohl proti šachu bránit šachem svému soupeři) a mnoho dalšího. V závěru dne jsem si zkusil zahrát s počítačem zkušební partii. Počítač hrál při síle 3 půltahy, ale hned ve třetím tahu se cosi zvrtlo. No, určitě to nebude nic vážného, jen se budu muset vrátit k trasování vyhledávání tahů. Pak budou následovat cvičení na mat a remis a v úplném závěru aplikace algoritmu hrubé síly (to je skutečně termín pro minimaxový algoritmus). Ještě jednou jsem si totiž podrobně pročetl článek o alfa-beta v knize a uvědomil jsem si, co mi v programu chybí. Vlastně půjde jen o modifikaci větší části kódu, ale to by nemělo zabrat víc jak dvě hodiny (jak se znám, zabere to celý den). Na papíře mi tento algoritmus slušně fungoval, teď to jen aplikovat. Výsledkem by mělo být mé vysněné čtyři půltahy a možná i víc.
19.7.2002 - rychlejší ale pomalý
Od včerejška do dneška jsem jádro programu dost pozměnil, takže odpadla oceňovací funkce, která se rozčlenila do tří částí, které jsou přímo ve vyhledávacím algoritmu. Co se týče aplikace brutální síly, vůbec to nezabralo. Program sice odsekával větší množství tahů, ale zbytečných. Na čtyři půltahy se nyní čeká sice kratší dobu, ale to je přesto pro mě moc málo. Snažil jsem se, aby program oceňoval koncové tahy (v listech herního stromu) co nejjemněji, aby pak mohl odsekat více větví, což docela zabralo, ale u čtyřech půltahů se mi podařilo dosáhnout nejlepšího výsledku cca 60 000 koncových uzlů. To je sice oproti původním asi 200 000 uzlů podstatně lepší, ale ve srovnání s dobrým šachovým programem (6 240 uzlů) to je nic. Během noci si přečtu knížce o poslední možné technice, která by mohla zlepšit současnou situaci programu: hledání klidu (quiescence search). Jedná se o zavrhování jistých úderných tahů a optimalizuje alfa-beta odsekávání. Pro dnešek jsem ještě zkusil zjemnit oceňování zavedením hodnocení centralizace figur, ale to nemělo příliš valný výsledek. Ráno moudřejší večera.
2.8.2002 - po krátkém odkladu se jede naostro
Po devatenáctém červnu už jsem na programu nijak moc nepracoval, spíš jsem se staral o "papírovou" práci. Zítra si vše důležité (kód v Pascalu, návrhy, knížky) beru s sebou do Uherského Hradiště, kde bratr vypracoval grafickou část. Tam se pokusím během dvou, maximálně tří týdnů spojit Jakubovu grafickou část s kódem, který napíšu v Baltazarovi. Problém je právě ve strukturách psaných v C a v celkové stromové koncepci Baltazara. S knížkami, které mám (Učebnice jazyka C - vše srovnává s Pascalem, příručka k Baltazarovi 5.0, učebnice Baltazara 3.3), by vše mělo jít docela hladce. Při psaní kódu však budu muset dělat časté kontroly, protože tu bude spousta změn (např. booleovské výrazy/pole - C má pevnou dolní hranici pole; index nula). Žadné odklady už nejsou přípustné a bylo by dobré mít všechno hotové do dvou týdnů, což je s mými současnými podklady zvládnutelné. Bohužel se mi nepodařilo dostat algoritmus do dost velkých "otáček", aby propočítal čtyři půltahy pod jednu sekundu, ale do vysněných čtyř se dostal v pro mě slušném čase, a to mi stačí. Druhá věc je, co na to řeknou návštěvníci BVV při případném postupu do semifinále.
5.8.2002 - první spolupráce
Kupodivu se mi podařilo udělat hodně práce v relativně krátkém čase. Možná to jen tak vypadá, protože šlo především o grafickou část, na níž měl z valné části podíl Kuba. Taky jsem se nějak dostal do programování v C a vlastně celém Baltazarovi, neboť to byla dost dlouhá doba, co jsem v něm naposledy dělal. Máme už skoro hotové úvodní intro s titulky a celou šachovnici s množstvím sad kamenů. Nadeklaroval jsem nějaké základní proměnné, ale co se týče vlastního algoritmu tak nic moc. V Pascalovském kódu je třeba ještě udělat důležitou rychlostní úpravu, a sice zavést tabulku s pozicemi králů, což značně urychlí nejpoužívanější funkci, která zjišťuje šach. Možná to bude mít skutečně dopad na rychlost a do čtyř půltahů se program dostane v ještě přijatelnějším čase, než kdykoliv předtím.
7.8.2002 - moc se to vleče
Zdá se, že přepis do Baltazara mi nedělá větší problémy (na problém často narazím, ale posléze najdu řešení někde v knihách či nápovědě). Přepis do C je v podstatě podobný překládání z jednoho jazyka do jiného. S Kubou jsme udělali pokroky v grafice a já jsem přepsal zavedl všechny potřebné proměnné. Stojím teď před překážkou, na kterou se asi musím trochu připravit. Je totiž potřeba začít s interaktivní částí programu. Zatím mám hotové jen to, že program zjistí, zda je na tahu člověk nebo počítač (zatím jsem nastavil bílého i černého na člověka) a pak buď vypočte a provede tah, nebo dá slovo uživateli. Problém je v tom, že pokud provedu nějaký tah, musí se zavolat funkce, která ověří správnost tahu a teprve potom je možné tah provést. Tato ověřovací funkce je jedním z pilířů původního programu a potřebuje ke svému fungování ještě jednu, o něco jednodušší funkci, která zjišťuje šach. Hra dvou lidských hráčů tedy vyžaduje přepis dvou dost velkých funkcí, u nichž si v mnoha částech jejich těl asi nebudu při přepisu moc jistý, ale přepsat je musím. Také můžu zkusit nejprve prosté pohybování figurkami, což by vlastně bylo také možné, ale pak nevím, jak rozsáhlé úpravy bude potřeba udělat. Hm, ale každopádně se vyplatí začínat pěkně od základů, protože případné chyby (a těch je i u přepisu jak máku) by se pak hůře hledaly (pokud vím, tak Baltazar nemá funkci pro trasování programu. Další postup je tedy prozatím jasný.
10.8.2002 - konec přepisu
Teprve dnes se dá říci, že všechny funkce programu v Pascalu úspěšně přeložil do C (Baltazara) a že jsou alespoň částečně funkční. Jejich spolehlivost odhalí až hlubší testování programu mým bratrem, ale každopádně mi spadl kámen ze srdce, neboť jsem se vzhledem k mojí nezkušenosti s jazykem C (pozapomenuté základy z DDM) obával, že to nedokážu. Ukázalo se však, že vše dopadlo dobře. Do konce prázdnin už zbývá něco přes tři týdny, takže je nejvyšší čas přidat, abychom měli s bratrem vše hotové. Mohli bychom pak poslat finální verzi programu (Partie 1.00 beta) e-mailem rovnou do SGP, které sídlí právě tady, v Uherském Hradišti. Musíme se však vyvarovat jakéhokoliv přímého kontaktu s touto společností, neboť ta z myslím jasných důvodů ponechala jak získávání tak i posílání jakýchkoliv informací ohledně soutěže na internetu. Co se týče grafiky, máme už dávno hotové všechny sady figur pro 2D + pozadí šachovnice. Další elementy, jako pozadí Fisherových hodin nebo digitální číslice na pseudo-displeji jsme dokončili nedávno. Spoustu práce mám teď já, jako programátor. Vše mám sice hezky přepsáno a spoustu komponent programu jsem ošetřil (dokonce jsem našel hrubou chybu, která byla ve starším programu - pro uživatele bylo možné přeskakovat vlastní figury), ale program psaný čistě v "Céčku" není pro porotu soutěže Baltík+Baltazar 2002 to pravé ořechové. Chtějí čisté a hezky formátované strukturogramy (elegantní stromový způsob reprezentace algoritmu). To jim budu moci poskytnout, ale bude to rvačka s časem a trpělivostí (zatím má totiž každá funkce programu jen jeden příkaz, který reprezentuje vlastně celé tělo funkce). Předtím ale musím rozdělit funkci pro test tahu (zjištění jeho "způsobilosti" vůči pravidlům šachu), neboť dělá zbytečné kontroly prohřešků, které počítač stejně nedělá, ale uživatel může ("blbuvzdornost" programu je také součást hodnocení, ale říká se jí stabilita programu). Jakmile toto dokončím, po několika testech tyto funkce zapojím do programu. Teprve až bude vše fungovat, jak chci, začnu dělat druhý přepis. Nakonec ještě musím vytvořit 3D šachovnici, kterou si značně zvyšuji šance na soutěži (složitější projekt, lepší grafika). No, a ve chvílích mého odpočinku bude pracovat můj bratr v roli grafika a dotvářet vzezření celého programu (ikona, tlačítka, pozadí...).
17.8.2002 - kruh se bude uzavírat
Vzhledem k tomu, že zítra se vracím do Brna, svou práci si uložím na diskety a budu v ní pokračovat doma. Čekal jsem, že za ty dva týdny toho stihnu o moc víc, ale zdá se, že jsem se přecenil. Přesto je celý engine přepsán a kostra programu zpracována, takže nečekám nějaké další komplikace. Projekt jsem porovnával s jinými programy, které byly v soutěži B+B prezentovány. Pro klid svého puntíčkářského ducha jsem chtěl, aby můj program vynikal mezi ostatními, aby měl vůbec šanci prodrat se mezi deset prvních. Podle loňského a předloňského ročníku soutěže by to nemusel být takový problém. Předloni byl totiž prezentován šachový program, který se dostal do semifinále a můj a bratrův projekt ho podstatně převyšuje. Srovnával jsem však s těmi nejlepšími (finalisté), tedy programem pro editaci HTML dokumentů a simulátorem jízdy autem (3D). Pokud se mi podaří do dalších dvou týdnů (do jednoho, ten druhý je teď rezervní) dokončit projekt podle plánů, bude se moci měřit i s těmito programy. To by znamenalo jistě úspěch (program na CD tvůrce Baltazara), možná semifinále a snad i finále (ale to je samozřejmě relativní a je naprosto zcestné se zase přeceňovat, přestože by si měl každý úspěšný autor věřit). V současnosti žádné problémy s programem nejsou, vše jde hladce. Bohužel tu je přeci jen zádrhel, se kterým jsem ani tak nepočítal. Vzhledem k tomu, že ze strukturogramu (zápis kódu v Baltazarovi) je vygenerován kód v C a ten pak zkompilován do tzv. p-kódu, je program celkově podstatně pomalejší, než kdyby byl kompilován do nativního (přirozeného) kódu (binární Intel x86). V odpovědi na můj mail do SGP kromě této informace o způsobu kompilovaní stálo, že rychlost je bohužel největší slabinou Baltazara, která by však měla být v příštím roce pryč spolu s novou verzí tohoto vývojového nástroje (zatím je řeč o verzi 5.0 profi). Prý je tento nedostatek z hlediska soutěžícího řešitelný jen kompilátorem, který je však vytvořen v Baltazarovi (tady není problém, protože kompilátor by sice nebyl sám o sobě rychlý, ale generoval byl rychlý program). Tento kompilátor by vytvořil EXE, jež by se spouštělo z Baltazara, takže program by běžel externě. Nemusí jít o celý program, jen jeho kritickou část. Této metody prý bylo využito v jednom předloňském projektu (jednoduchý kompilátor kompiloval z assembleru). Pro mě to znamená, že prostě vyhledávací algoritmus nepoběží dost rychle na to, aby se program dostal do tří půltahů (!), což je ponižující vzhledem ke starým PC-AT 386, kde se zvládalo i pět půltahů. Ani nejnovější verze soutěžního šachového programu z předloňska nedokázala vyhledávat tahy. Vlastně jsem si při přepisu vyhledávacího algoritmu myslel, že mám v rukávu dvě esa: 3D šachovnici a hru počítače. Teď se budu muset opřít o 3D modul, se kterým jsem vlastně ani pořádně nezačal. Je však jenom můj problém, že jsem se pouštěl do šachového programu a neumím sestavit kompilátor, a vlastně ani neumím assembler (je vidět, že soutěž bude pro můj program s bratrovou grafikou tvrdý oříšek). Občas mám pocit, že jsem si dal vlajku trochu moc vysoko. Přesto si myslím, že kruh se uzavírá. Je jen potřeba dokončit jednotlivé funkce programu od vracení tahů přes ukládání partií do PGN, sestavování pozic až po tisk partie a zmíněný 3D modul. 3D šachovnice vlastně bude jediná komplikovaná záležitost, která mě čeká. Všechno ostatní je docela triviální, akorát je toho dost na to, abych si za ten následující týden "máknul". Pokud se mi program podaří brzy odevzdat, budu mít alespoň čas na pořádné testování a opravení případných chyb do konce korespondenčního kola (6.9.2002 - půlnoc).
18.8.2002 - malé úpravy a pár návrhů
Rozhodl jsem se, že zítra se už konečně poposunu trochu dál a do konce týdne snad projekt dokončím. Bude to chtít hodně práce, a taky návrhů, na které se ještě dnes vrhnu. jediné, co jsem dnes po příjezdu do Brna udělal, byla část nastavení, ale ještě to chce dokončit, což by neměl být zas až tak velký problém. Zítra se ukáže.
21.8.2002 - pomalý postup
První týden dokončování pomalu končí, je vidět, že se to trochu pohybuje, ale bohužel konec práce před sebou ještě nevidím. Věřte mi, něco takového se pozná. Od pondělí jsem udělal spoustu nových prvků, kompletní nastavení (i načítání a ukládání nastavení), nějaké hlášky a vychytávky, přesto ještě zbývá spousta dalších úprav. Největším problémem je stále 3D šachovnice, do které se pustím hned po dokončení hry počítače (aplikace vyhledávacího algoritmu).
22.8.2002 - zlý sen
Z posledního týdne toho moc nezbývá (je čtvrtek) a já, přestože jsem většinu dne strávil prací na programu, nemám žádné valné výsledky. Jedinou dobrou zprávou je, že se hned při další etapě (zítra) mohu pustit do zavedení hry počítače. Špatná zpráva je, že Baltazar má na mém počítači omezení paměti pro kompilaci, takže mám stále strach, že najednou se mi při spuštění programu objeví před očima hláška, že program je příliš velký. Nevím, jestli si mám dělat starosti, protože cizí soutěžní program, který se kvůli své velikosti nezkompiloval měl asi 200KB a můj něco přes 100, přesto (pěkný rým :) mám obavy. Cizí program se ale nějak zkompilovat musel, takže by bylo nejlepší v případě problémů odejmout nepotřebné funkce, program dodělat, přenést na jiný počítač, funkce obnovit a zkompilovat. Už teď je sice projekt mě a mého bratra způsobilý soutěže, ale přesto mi ta hra počítače a 3D šachovnice nedají spát. Možná budu potřebovat i ten rezervní týden, ale nedej bože to. Měl bych pak sice ještě čas do šestého září (konec korespondenčního kola) na poslání případných oprav, ale to už bude škola, kde chci mít od počítače klid. Po těch týdnech práce hlavou už toho mám tak akorát. Myslím si, že vlastní soutěž už je jen procházka růžovým sadem, největší soutěž se odehrává tady u mě doma, když sestavuji program. Jakmile je všechno hotové, člověk už jen svůj program předvádí, připraví si nějakou tu řeč - poklona - odměna - a je to. Jediná možnost, jak vše do konce týdne stihnout, je opravdu máknout na hře počítače a pak hned na 3D šachovnici. Nejdůležitější je mít kostru programu obalenou trochu masem a zbytek už je jen piplání, které se dá dělat i při televizi.
23.8.2002 - páteční rozčarování
Dnes mám opravdu dobrou náladu. Od pravého poledne jsem dělal na projektu a o půlnoci se mi to vyplácí. Mám v podstatě hotovou hru počítače, přestože je třeba dodělat věci jako vracení tahů, nabídka remízy a časové omezení, ale jinak jsem rád, že už počítač hraje a detekuje konec hry (mat/pat). Škoda jen, že jsem musel vypustit problematické en-passant, což mě taky trochu štve. Buď to ve zbylém čase ještě dodělám (po dokončení a odeslání projektu), neb tenhle nedostatek zapíšu do manuálu. Protože tento víkend nemám až tak moc volný (snad zítra odpoledne a v neděli vůbec), zase se pokusím rozvrhnout si nějak další postup (např. 3D šachovnice). Až teď jsem si uvědomil, že je program dost rozsáhlý, aby se ten pomyslný kruh začal uzavírat. Dokud prostě počítač nezačal hrát, nevěřil jsem, že to program někam dotáhne (přestože cizí soutěžní šachový projekt hru počítače neměl, dostal se do semifinále). Na semifinále si věřím. Nakonec mě napadlo udělat program dvojjazyčný (nechci překládat celou nápovědu, jen menu, poznámky atp.), na kompenzaci herní síly počítače. Také budu muset rozčlenit jednu funkci, která se hrozně rozvětvila a její strukturogram zabírá pro Baltazara neuložitelné množství dat. Co se týče kompilace, asi to bude natěsno. Nebudu vyjmenovávat, kolik mi toho ještě zbývá dodělat, ale to už jsou jen takové ty "hodinovky", kde se tolik nepřemýšlí. Po víkendu čekám bratra Jakuba, který se mnou oslaví dokončení projektu (pokud nějaké bude) a snad mi i pomůže s nějakou grafikou (nebo třeba zvukem?!). S ním zajdeme k našemu nevlastnímu otci, s jehož laskavým svolením pořídíme naše digitální foto do intra hry.
26.8.2002 - skluz
Můj bože! Jsem v týdnu, který jsem si vyhradil jako rezervu, kdybych něco nestíhal a přitom ještě nemám důležité části programu. Je to hrozné, protože si myslím, že projekt nestihnu do konce srpna dokončit. Je to hrozný pocit, ale kdybych měl více času... Zítra mám trochu času během dne, pak odpoledne ve středu a půlku zbývající části týdne. Jestli mám stihnout dodělat partiář, PGN, načítání/ukládání/tisk partie, skákání na tahy, radu od počítače, nabídku remízy, invertní šachovnici, 3D šachovnici, nápovědu, "about" a intro (to pouze dokončit, titulky jsou už hotové), musím se do práce pořádně opřít. Bratr mi dnes pomohl upravit figurky tak, aby vypadaly na všech políčkách šachovnice výrazně, ale jinak je 95% zbylé práce na mě. Většina funkcí programu už je legrace, ale ta zatracená 3D šachovnice, a teď i partiář (problémy se zkrácenou notací - vyžaduje návrh) chtějí den práce. Protože chci mít úspěch, nesmím dopustit, aby byl projekt nekompletní vzhledem k tomu, co jsem si naplánoval před prázdninami. Tehdy to byl šílený, zdánlivě neproveditelný plán, ale nakonec se ukázalo, že to není zas až tak pravda. Skutečným důkazem toho pro mě ale může být jenom dokončení projektu v termínu. Pokud ho totiž odevzdám později, tedy až v září, kdy je absolutně poslední možnost, nebude žádný čas na opravy.
31.8.2002 - nabral jsem druhý dech?
Samozřejmě by v tuhle dobu už každý, kdo se chce soutěže zúčastnit, měl už mít svůj program hotový, nebo dělat poslední úpravy. Já program sice ještě hotový nemám (!!!), ale už to bude co nevidět za mnou. Měl jsem obrovské starosti s 3D šachovnicí, kterou jsem včera přeprogramoval do Baltazara, a která byla jen zpola funkční. Posouvala se totiž o obrovské kusy (tak tři čtvrtě obrazovky) a při rotaci se body, jež měly být v jedné linii skupily do křivek.Celá šachovnice se při tom deformovala a po chvíli manipulace vypadala jako zmačkaný papír. To je sice hezké (10KB prográmek s 3D zmuchlaným kusem papíru, na kterém je z obou stran nakreslená šachovnice), ale já potřebuji přesnost. Uvědomil jsem si, že budu potřebovat změnit svůj vzorec pro perspektivu:
x3d = x + sin( z * Pí / 3600 ) * ( 320 - x ) ) )
Netrvalo to dlouho a měl jsem výbornou náhradu.
x3d = 320 - f * ( 320 - x ) / z ) ),
kde f je "jemnost" a z hloubka (třetí osa). No, nebudu tu jednoduchou věc dělat složitější, prostě jsem to vyzkoušel a fungovalo to. Teď do toho ještě vložit figurky. Druhý a asi nejhorší problém, s jakým jsem se setkal byl nedostatek paměti. Tedy ne, že bych měl v počítači málo paměti na program, ale kompilátor Baltazara verze 5 prostě nezchroustá nic, co je větší než 64KB. Nevěděl jsem, jak se z té šlamastyky dostat, takže jsem zase napsal do SGP. Ti mi dali najevo, že bych měl kód zkusit razantně zkrátit (např. opakující se struktury -- jenže oni nemají o mém programu představu), nebo nic. Ale taky přece můžu použít externí soubory! Podle pravidel se mohou použít externí soubory (exe), které však musí být napsány v Baltazarovi a je nutné do soutěže dodat i jejich zdrojové kódy. To není problém. Prostě udělám pro kritickou funkci zvláštní program, který se bude spouštět z hlavního programu a parametry se budou předávat přes soubor (přes paměť to neumím, alespoň jsem to nikdy nedělal). Možná bude stačit "externalizovat" vyhledávač tahů (cca 13KB) a 3D šachovnici, ale to se uvidí.
2.9.2002 - velká časová tíseň
Je sice hezké, že jsem dnes dokončil trojrozměrnou šachovnici, ale jakmile se jeden problém vyřeší, nastupuje další. Tentokrát je to převod vyhledávací funkce do externího programu. Všechny funkce a proměnné, které bude vyhledávač potřebovat mu poskytnu, ale především si musím zmapovat přesně které proměnné a funkce jsou potřeba, aby v hlavním kódu nebyly nějaké zbytečnosti. Taky musím znát všechny společné proměnné, protože ty budou předávány souborem. Mám však teď ze všeho hrozný pocit. Jsem spokojený, když je program čistě napsaný a když je stabilní. Když chci například spustit zobrazení 3D šachovnice, vše funguje různě dlouhou dobu. Po chvíli mi Windows oznámí neplatnou operaci a já nemůžu nic. Někdy je to dělení nulou, jindy zase operace v paměti, kde program nemá co dělat. Můžou to být chyby v programu, kde se dělí nulou a přistupuje za hranice polí, ale proč se potom tyhle chyby objeví vždy ve chvíli, kdy 3D šachovnici spouštím externě? Už nevím co mám dělat, aby byl program trochu stabilní. To by totiž mohlo všechno běžet perfektně, ale na soutěži na jiném počítači v jiném systému by program hned zkraje spadl. To přece ne! No, možná je to opravdu těmi zablešenými 64KB, takže musím hodně přidat a DNES, přestože zítra jdu do školy a brzy vstávám, ještě dnes dokončím "externalizaci" vyhledávače stůj co stůj. Prostě musím. Anebo NE! Udělám to tak, že si celý program vytisknu a všechno udělám na papíře, jako jsem to dělal v Tunisu. Zítra to pak rychle, ale hodně rychle přešupu (to bude úterý) a dodělám jak vyhledávač, tak 3D šachovnici, tak konečně zbylé potřebné funkce. Zbývá nápověda. Tu budu během večera (noci) v klidu psát a úterý je pryč. Středu věnuji testům, testům a zase testům, optimalizaci, úpravě kódu, komentování kódu, odstraním zbylé soubory a ve čtvrtek vše pošlu hezky do SGP. To však ještě není vůbec konec! Čtvrtek budu zase věnovat testování a jestli najdu nějaké chyby, okamžitě kód znovu posílám jako opravu, protože v pátek je poslední šance na odeslání.. pak už jen čekat. Zdá se to snadné, ale budou to hrozné dny, protože do toho přijdou ještě nové školní povinnosti. Po dokončení tohoto projektu si konečně po měsících namáhání svého mozku odpočinu. Zdá se, že pracovat ob den na počítači je legrace, ale já myslím na soutěž snad každých dvacet sekund (to je skoro stejně často, jako na sex u většiny lidí). Taky mám v plánu věnovat se trochu jiným věcem, než počítači. Od bratra jsem slyšel, že jeden nejmenovaný soutěžící, který chodí na stejnou školu jako on, na soutěži B+B několikrát byl a jednou dokonce vyhrál první cenu (notebook). Je to prý člověk, který je schopen prosedět u počítače celý den a že pokud na něčem maká, tak na tom opravdu maká bez přestávky. Bojovat proti takové odhodlanosti musí být opravdu těžké, zvláště když proti vám stojí několik set horlivých nadšenců od 9 do 99 let..
6.9.2002 - základní verze dokončena a odeslána
Nakonec se mi podařilo moji práci dokončit a odeslat do soutěže, jen jsem musel program trochu osekat (např. jsem ubral sociální funkce a práci s partiářem). Taky jsem v programu nechal chyby, které pro mě nejsou životně důležité, ale do dalšího termínu (který jsem doteď přehlížel: 13.9.) - do uzávěrky odevzdání jakýchkoliv oprav nebo doplňků k programu pošlu do SGP svůj projekt s opravenými chybami a snad přidám i zmíněné funkce. Momentálně probíhá na BVV Strojní veletrh (do 20.9.) a po něm následuje toužebně očekávaný INVEX. Domnívám se, že po uzávěrce termínu na úpravy se teprve pošlou pozvánky na semifinále, nebo zprávy typu: "Váš program za nic nestojí.". Tu druhou možnost můžu taky očekávat, protože kromě uživatelského rozhraní, chaotického enginu a spousty chyb vlastně nemám nic úžasného. Projekt upravím tak, aby vyhovoval mně samotnému a teprve potom z něho budu mít dobrý pocit.
7.9.2002 - jaké úpravy budou v projektu?
Rozmyslel jsem si, jaké úpravy v projektu ještě udělám, než pošlu doplňující verzi. Nejprve odstraním chybu při načítání uložené partie a taky umožním konání rošády a en-passantu (bohužel však jen ze strany uživatele). Pokud tyto chyby opravím, stačí jen přidat odňaté funkce programu, hlavně práci s partiářem a sociální funkce (vzdání se, nabídka remis atp.). Důležité bude taky udělat něco s vyhledávacím enginem, jehož kód je celý čistě v C a pro přehlednost programu by se hodilo předělat ho do strukturogramu. Možná ještě trochu rozšířím nápovědu a jinak snad přidám nastavení barev na 3D šachovnici.
8.9.2002 - už žádné chyby
Dnes se mi docela rychle podařilo opravit dvě chyby a to chybu při načítání hry a potom problém s rošádou. Zítra se pokusím přidat funkce pro práci s partiářem a sociální funkce. Pro zvýšení přehlednosti kódu bude nejlepší převést vyhledávací funkci na strukturogram co nejdříve, takže to zkusím taky během zítřka. Bohužel už ve škole začíná pořádný nápor a já mám čas jenom do pátku, takže to musí být efektivní práce a pokud dokončím naplánované záležitosti - už se nebudu snažit o nic dalšího. Snad jen pořádné testy...
9.9.2002 - poslední den programování?
Ano, už je to tady. Když jsem si dnes vyzvedával elektronickou poštu, byly tam dva nové maily. Oba byly od člověka, který má na starosti kontrolu programů. Tyto zprávy byly v rozmezí dvou dnů a v obou bylo upozornění na jisté problémy. Například byl problém s 3D šachovnicí, která spadla i v DOSu (jak je to možné?) a taky s prodlevou po kliknutí myši. Problém s myší odstraním (zvýším prodlevu, která se dá stejně uživatelsky donastavit a šachovnici se pokusím integrovat do hlavního programu). Prý se mám zaměřit na pohyb figur, resp. krále, se kterým nejde hýbat. To je pravda, tuto chybu jsem už opravil včera společně s rošádou a načítáním hry. Co zbývá? Opravdu se mi uleví, až budu mít kód vyhledávače ve strukturogramu, takže se do toho asi pustím hned. Pak se uvidí.
Hotovo. Zprvu se věci zdají být složitější, než ve skutečnosti jsou (někdy je to ale naopak), takže se sám divím, jak se mi podařilo přepsat vyhledávač, extrahovat z něj oceňovací funkci a tu zvlášť taky přepsat do strukturogramu (budu ji ještě potřebovat).
11.9.2002 - hotovo!
Dnes jsem odevzdal finální verzi programu (V1.01), která už je (doufám) kompletní. Samozřejmě má stále drobné chybičky, ale jejich opravami jsem se zabýval dosud a je to nekonečná práce. Všechno co jsem v programu chtěl mít tam mám, takže se dá říci, že jsem se vším spokojený.
Poděkování
Bratru Kubovi za nedocenitelnou grafiku, ušetřil mi tak spoustu práce
s nejistým výsledkem; za morální podporu a za zlaté uživetlské rady.
Bratru Evženovi, že mě naučil programovat do takové míry, že jsem byl schopen
napsat vlastní šachový engine.
Firmě SGP za perfektní programovací systém.
Renému, za digitální foto do hry.
Tátovi a mámě za trpělivost.
Použitá literatura
Pavel Drbal, SGP Baltazar 5.0 Programování pro děti a rodiče
Pavel Drbal, Programovní s Baltazarem pro děti i rodiče
SGP Systems, SGP Baltazar 3.15 Příručka
Dieter Steinwender, Frederic A. Friedel, Šachy na PC
Pavel Herout, Učebnice jazyka C (1. a 2. díl)
Karel Pliska, Učebnice šachu pro samouky (začátečníci)
Kontakt
Libor Tinka
Kuršova 6
Brno
635 00
Jakub Grós
Sokolovská 277
Uherské Hradiště
686 01
Licenční ujednání
Tuto verzi programu (1.01) je možné volně šířit
ne však za účelem zisku.
Firma SGP tedy může tento program publikovat.
Program slouží k užívání a demonstračním účelům, jakékoliv pozměňování zdrojového kódu nebo používání
určitých bloků programu samostatně je možné pouze po dohodě s programátorem
hry.
Pozměňování grafiky hry prostřednictvím k tomu určenými nástroji, nebo používání některých
grafických částí programu je možné pouze po dohodě s grafikem hry.
Copyright 2002 by Libor Tinka & Jakub Grós