Tietokoneshakki / Teknisiä yksityiskohtia

Bittilaudat

Shakkilaudalla sattuu olemaan 64-ruutua, mikä on täsmälleen yhtä paljon kuin monissa tietokoneissa on sanan pituus biteissä. Niinpä 64-bittisiä kokonaislukuja eli bittilautuja voikin käyttää kuvaamaan jotain laudan ominaisuutta. Esimerkiksi biitilaudalla voi vaikkapa kuvata valkeat lähetit siten, että laudan ruudut numeroidaan 1 - 64 ja lähettien sijaintia vastaavien ruutujen numeroiden kohdalta bitit asetetaan ykkösiksi, kun nen muuten ovat nollia.

Bittilautojen soveltuvuus shakkiohjelmiin tulee esille, kun laudasta pitäisi saada selville jokin tietty asia. Tällöin se saadaan helposti bittilaudoista käyttämällä bittioperaatioita AND, OR, XOR, ja NOT. Tällöin muutamalla operaatiolla voidaan suorittaa suuri joukko laskennallisia tehtäviä kerrallaan. Näin vältetään silmukoita nopeuskriittisissä kohdissa. Tämän lisäksi tarvitaan operaatio, jolla bitit saadaan ulos yksi kerrallaan bittilaudasta. Tässä auttavat muutamat yksinkertaiset operaatiot, joilla vähiten merkitsevä bitti voidaan nollata tai vastaavasti eristää. Lisäksi bittilaudassa olevien bittien määrä voidaan laskea ilman silmukoita.

Nopea siirtojen tuottaminen

Siirtojen tuottamisessa bittilaudat osoittavat tehokkuutensa. Kuninkaan ja ratsujen siirrot saadaan yksikertaisilla maskeilla, jotka lasketaan etukäteen jokaiselle laudan ruudulle. Sotilaiden siirrot voidaan tuottaa yhdellä kertaa joko vastaavilla maskeilla tai sitten bittien siirto-operaatioilla. Laskemalla maskit yhteen ja sitten käyttämällä sopivia bittioperaatioita laudalla olevien mustien ja valkeiden ruutujen kanssa, saadaan ruudut, joihin tietyt nappulat voivat siirtyä.

Ongelmaksi tulevat liukuvat nappulat. Tornien tapaan liikkuvien nappuloiden kanssa käytetään vaakasuuntaisten siirtojen tuottamiseen operaatioita, joilla eristetään tornin rivi bittilaudasta ja käytetään syntynyttä 8-bittistä lukua indeksinä etukäteen laskettun taulukkoon, josta saa bittilaudan, joka sisältää mahdolliset siirrot. Pystysuuntaan liikkumisessa käytetään käännettyjä bittilautoja. Tällä tarkoitetaan bittilautoja, jotka on käännetty 90 astetta. Tällöin tornin linja voidaan erottaa samaan tapaan kuin rivikin normaalista bittilaudasta.

Lähettien tapaan liikkuvien nappuloiden kanssa käytetään myös käännettyjä bittilautoja. Nyt niitä on käännetty 45 tai 315 astetta. Kuitenkin, koska diagonaalit ovat eripituisia, täytyy bitit siirtää sopivaan kohtaan ja eristää oikean pituisella maskilla. Nämä kaikki luvut voidaan etukäteen laskea taulukkoihin, joita sitten käytetään siirtojen tuottamisen aikana.

Erikoistapaukset säännöissä

Säännöissä on kolme erikoistapausta, joiden vuoksi tarvitaan erikoisjärjestelyjä. Lisäksi tasapelisääntöjä varten tarvitaan sopivat laskurit. Nämä tapaukset ovat korottaminen, linnottautuminen ja ohestalyönti. Korottaminen pitää ottaa huomioon siirtojen tuottamisessa. Eli jokainen takariville siirtyvä sotilas aiheuttaa neljän eri siirron tuottamisen; yhden jokaiselle korotusvaihtoehdolle. Lisäksi kun korotussiirto tehdään, muuttuu paitsi sotilaan bittilauta, myös korotettavan nappulan bittilauta. Korotettavissa saatava materiaalikin on lisättävä, jos siitä pidetään kirjaa aseman tietorakenteessa.

Linnottautuminen sisältää kolme eri vaihetta, joissa on otettava huomioon siihen liittyviä asioita. Ensinnäkin linnottatumisoikeuksista on pidettävä kirjaa asemarakenteessa. Niitä on päivitettävä aina, kun torni tai kuningas liikkuu lähtöruudustaan. Toiseksi, kun siirtoa ollaan tuottamassa on tutkittava onko kuningas shakissa lähtöruudussaan, kohderuudussaan tai ruudussa, jonka yli se hyppää. Tämä saattaa hidasta siirtojen tuottamista paljon, jos shakin tunnistamista ei ole tehty tehokkaasti.

Ohestalyönnissä on pidettävä muistissa ruutu, jonka yli edellisessä siirrossa kaksoisaskeleen ottanut sotilas juuri siirtyi. Sitä vastaava bittilauta voidaan laskea yhteen vastustajan nappuloita edustavan bittilaudan kanssa sotilaiden lyöntejä tuotettaessa.

Avaus- ja loppupelitietokannat

Tietokoneohjelmat ovat tunnetusti surkeita avaus- ja loppupelivaiheissa, koska niissä on tärkeämpää omata näkemys asemasta kuin laskea tarkkaan jokainen muunnelma. Erityisesti pitkällä aikavälillä vaikuttavat aseman piirteet ovat vaikeampia tietokoneelle, koska sen laskentahorisontti on suhteellisen lyhyt. Tämän vuoksi avauksiin ja loppupeleihin on tehty omat kirjastot, joita tietokoneohjelmat käyttävät.

Yksinkertaisimmillaan nämä kirjastot ovat kokoelmia asemista, ja parhaista siirroista niissä. Useimmiten niiden käyttö on erillistä varsinaisesta hakumoottorista, koska avaus- ja loppupelivaiheet voidaan rajata helposti erilleen keskipelistä. Lisäksi, kun avauskirjaston siirrot loppuvat, on siirryttävä normaaliin hakuun, joten siirtyminen tapahtuuluonnollisesti. Vastaavasti, kun nappuloita on tarpeeksi vähän, on yksinkertaista jättää normaalihaku ja siirtyä tietokantahakuun.


Pääsivulle