Šahs un datori, jeb gribu programmēt šaha programmu
(16.02.2016 red.,Google App Engine hostings)
Programmēšana
Zemāk aprakstītais domāts vairāk datoriķiem, kas vēlas izkopt šaha spēles
programmēšanu. Šahisti vienkārši spēlē šahu (vai dodas uz http://www.chess.com).
Nolēmu padalīties apkopotajā
informācijā, ja nu kādam uznāk entuziasms un nav vēlmes izgudrot velosipēdu.
Tas ir iespējams un programma var būt absolūti minimāla.
Lūk elegants piemērs, uzrakstīts Javascript valodā 5Kb apjomā (source ir apskatāma).
http://p4wn.sourceforge.net/5k/
Algoritms nav pārskatāms, bet programma darbojas, kaut arī visai glupi no šahista viedokļa.
Ja gribam izveidot ko stiprāku, tad sākam domāt par teoriju, un tā ir plaši atrodama internetā.
Lai nebūtu lieki jāsērfo, dažas tēzes zemāk.
Novērtēsim sarežģītību. Vidēji pozīcijā viena puse var
izdarīt ~30 gājienus (nu kaut vai). Uz katru no tiem – tāda pati atbilde. Jau
~900 pozīcijas. Ja mēs rēķinam savu otro gājienu, tad atbilde uz to jau ir (900)
* (900)...., utt. Pēc 3-ā mūsu gājiena - jau 24 miljoni. Var sanākt tā, ka sevišķi tālu rēķināt
nevaram, ja gribam arī uz ekrāna reālā laikā pabīdīt figūriņu.
Te ir dziļāka teorija:
http://www.frayn.net/beowulf/theory.html, arī šeit labs raksts.
Vienkārši sakot, visi izmanto tā
saukto min-max algoritmu (skat.alpha-beta pruning). Kalkulācijas dziļumu apzīmē ar ply (wikipēdijā var
daudz atrast). Pirmais ply ir mūsu iespējamie pirmie gājieni, kur pēc min-max
algoritma novērtējam iespējamās pozīcijas un cenšamies iegūt labāko(max). Otrais
ply ir pretinieka atbildes gājiens, kur skatamies sliktāko(min) priekš sevis
pozīciju, kuru pēc loģikas spēlēs pretinieks. Tālāk trešais ply ir mūsu otrais
gājiens, kurā atkal meklējam labāko. Ceturtais ply ir otrā gājiena atbilde no
pretinieka puses. Vēl sastopami tādi apzīmējumi kā search depth (rekursijas dziļums), kā arī nodes (varianti, jeb grafu virsotnes kokā).
Tātad gudrās šaha programmas jāprogrammē vismaz C valodā,
ja gribam panākt ātrdarbību. Piebildīšu, ka, ja šaha galdiņš ir 8x8, tad
informāciju var glabāt baitos un pielietot AND, OR, XOR, <<,>> bitu (bitwise) operācijām.
Izvēlētai programmēšanas valodai ir milzīga nozīme.
Uzvar tikai un vienīgi "brute force" metode - iteratīva EVAL funkcija.
Viss pārējais apkārt ir nianses. Nav jēgas rēķināt vienu gājienu un cerēt uz labu šaha sniegumu.
Tieši tāpat ir ar datora ātrdarbību – rekursija aiz rekursijas
prasa jaudīgāku tehniku. Bet nu tomēr, ir jau arī izklaides šahs mobilajos
telefonos. Spēles atlātnes visas puslīdz nopietnās programmas nerēķina vispār,
bet izmanto jau gatavus binārus kokus (books sākot no dažiem Mb) ar gatavām
novērtējuma vērtībām. Tieši tāda pati ideja ir spēles nobeigumam, kur atpakaļ
no mata tiek sarēķināts koks pretējā virzienā (endgame tablebases),
par kuru izmantošanas nepieciešamību domas dalās. Var arī sanākt horizonta efekts, kad
izvēlamies nepareizo metodi, notērējam aprēķinos laiku un neko neiegūstam.
Kopš reāli datu apjomi kļuvuši terrabaitos, ir veiktas kalkulācijas, piemēram, visām 6-figūru galotnēm un pēc pozīcijas uzreiz var iegūt labāko nākamo gājienu (Nalimova tabulas) bez jebkādiem aprēķiniem.
Internetā ir web-lapas, kur pēc pozīcijas uzreiz tiek iedoti varianti, piemēram, 6-men tables (vai šeit) ,5-men tables.
Diemžēl šis risinājums ir ļoti datu ietilpīgs. Pērkot saīsinātā versijā sanāk ducis DVD disku, pēc instalācijas 100GB. Internetā ir atrodami entuziasti, strādājoši šajā virzienā.
Faktori, kurus programmas izmanto pozīciju novērtēšanai:
1.materiāls uz galdiņa;
2.figūru tuvums centram;
3.savu figūru tuvums savam karalim (cik piesegts);
4.smago figūru tuvums pretinieka karalim;
5.blakus esošu bandinieku skaits pret vientuļiem (vājumi);
6.ieņemtās līnijas visā garumā;
7.attālums bandiniekiem līdz dāmai;
8.figūru apdraudējums pretinieku figūrām;
9.utt, daudz sīku nianšu un faktoru kopums.
Iespējamās taktikas:
Nobeigumā karali cenšas bīdīt uz centru, sākumā tura pēc iespējas noslēptu.
Varbūt ir vērts nerēķināt ātrāko matu vispār, bet censties pēc iespējas vairāk nokaut pretinieka figūras.
Atmest gājienus, kas nevērtējami kā aizdomīgi jau pirmajos aprēķinos, bet nu te algoritms var kļūdīties.
Kvalitāte pozīciju novērtējumā nedaudz atsver rēķināšanas dziļumu.
Ir tāda laba viltība, ko var pielietot min-max algoritma izstrādē, kas balstās uz nulles gājienu (null move). Doma tāda, ka, ja pozīcija neuzlabosies (salīdzinot novērtējumus pēc katra) arī, ja mums iedos divus gājienus uzreiz (bez atbildes gājiena pa vidu), tad tajā virzienā meklēt nav vērts.
Tad vēl ir tāda tehnika kā nepieļaut atkārtotu rēķināšanu no vienas un tās pašas pozīcijas,
kas var sanākt pamainot gājienu secību (piem,1.d4-d5 2.e4 sanāk arī 1.e4-d5 2.d4).
Tomēr tādi gadījumi var sanākt pietiekoši reti, lai sarežģītu algoritmu.
Matemātiskās likumsakarības
Nopietna dziņa izstrādei noteikti jāizmanto dabas dotas skaitļu likumsakarības. Eksperti savos algoritmos tās pielieto kā pašsaprotamas un obligātas.
1) Obligāti: iepriekšminētās bitu operācijas -vieninieciņu un nullīšu visātrākās skaitļojamās operācijas. Ir tādi "maģiskie skaitļi" (wiki), kuri speciāli sagatavoti figūru gājienu noteikšanai-ģenerēšanai, neko labāku izdomāt vairs laikam nevar. Pats pārliecinājos un pierādījumam (kaut vai šeit) bandinieka iespējamo gājienu lauciņus var izrēķināt ar vienu bitwise izteiksmi, tā vietā lai ciklā apskatītu 64 lauciņus un apkārtējās figūras. Bitu operācijas ir ātras, kā arī var galdiņu un figūras atmiņā grozīt pēc patikas (wiki). Starp citu, bitu skaits var atspoguļot materiālu (algoritmi aprēķinam, t.i. pozīcija ir skaitlis, biti-figūras). Pie tam 8x8 galdiņa sakritība ar baits=8biti, integer=2baiti, long=vēl x2 baiti, un int64 (jeb long long tips) 64-bitu skaitlis taisni kā nosedz visu laukumu pa bitam (visi to izmanto);
2) Secīga xor operācija iegūst atpakaļ sākotnējo rezultātu (piemēram xor(xor(11,5),5)=11), ko izmanto ātrai gājiena un atpakaļ gājiena skaitļošanai, kā arī unikālas pozīcijas atslēgas (vai atmiņas adreses) iegūšanai. Pie xor izmantošanas jāpiemin Zobrist ideja. Doma ir tāda, ka pozīciju (figūras, rokāžu indikatorus, jebko citu) var nošifrēt xor(xor(xor(...))) vienā skaitļa atslēgā un dešifrēt atpakaļ. Kā otro operandu xor-am pielieto iepriekš uzģenerētu random skaitļu masīvu (ir gatavi algoritmi). Tas tāpēc, lai atslēga noteikti sanāktu arī unikāla - ja nu kautkā pēc 20tā gājiena sanāk identisks cipars, kas, starp citu, praksē gadās (raksts). Ja visas šīs atslēgas saglabā masīvā, tad iegūstam pozīciju datubāzīti ar visu pozīcijas pilnu pierakstu samērā kodolīgā pierakstā. Ja metodi izprot, tad sanāk automātiska šujmašīna baitiem :)
3) Binārā meklēšana un labākā gājiena sortēšana pēc pozīcijas novērtējuma meklēšanas ciklos. Tas vienkārši ir efektīvs ātruma palielinājums.
4) Protams, nekādas pakāpēs celšanas vai decimālskaitļu dalīšanas normāli šeit nav pieļaujamas.
Mana šakāļa intuīcija un daži redzētie kodi saka priekšā, ka pirms aprēķina vajag maksimāli sagatavot milzu masīvu ar 64-bitu maskām bitu operācijām (figūru gājienus/izvietojumus/garāmsišanas/utt.), kas tad būs aprēķinu mehānisma kodols. Bet nu šito jājēdz.
Augstākās valodās (java,interpretatori), kur ātri darbojas masīvu sakārtošana vienā komandā .sort(), to jāizmanto pirms variantu pārlases, zinot pozīciju vērtējumus. Reāli "timeout" vienmēr notiekās un jāatgriež atrastais gājiens. Un visa masīva kopēšana vienā komandā .slice arī ātrāka par cikliem.
Jā, intuīcija neviļ un mūsdienu dziņos tiek izmantoti iepriekš sagatavoti skaitļu masīvi "magic bitboards" figūru gājienu (un ne tikai) aprēķiniem. Nonākot pie sava dziņa veidošanas, noteikti ar tiem būtu jāiepazīstas un jāpielieto. Matemātiski to sauc par "de Bruijn" virknēm vai skaitļiem (raksts). Idejiski ir tā, ka pietiek ar vienu reizinājumu un apskati sarakstiņā, lai noteiktu, piemēram, visus konkrētās pozīcijas figūras gājienus.
Pētot c,c++ līmeņa dziņus, atklāju speciālu "nolaišanos" assemblera koda līmenī, lai pielietojot BSR, BSF mašīnkoda instrukcijas "momentāni" noteiktu lielāko un mazāko bitu. Valodā c nav analoga un cikli vājina dzini.
5) Parasti šaha galdiņu glabā 64bitos (a1=0..63=h8) katram figūru tipam. Ja tomēr tiek izmantots galdiņa masīvs, tad 8x8 vietā uztur 10x10 masīvu, jo tad figūra uz e2 ir masīva 25tais elements. Tāpat redzēti 12x12 masīvi, kur 2(nulles)+8+2(nulles) vienkāršo matemātiku.
6) Skaldīšana pa bitiem. Vienā baitā lauciņu var reprezentēt arī tā: 3(rinda)+3(kolonna)+2(liekie) biti. Tad kolonna ir (baits&7) un rinda ir ((baits>>3)&7), piemēram e2=20. Divos baitos ievietojas gājiens. Pēc pozīcijas novērtēšanas, gājienam pievieno pozīcijas novērtējumu (brīvajos augšējos bitos), kas lieliski ievietojas 4baitos skaitlī. Lieki piebilst, ka skaitļi sortējas un saglabājas hash tabulās.
Šaha dziņu (Chess engines) apskats
Zināmākie līderi ir ChessBase
(datubāze),Fritz, ChessMaster, Hiarcs, Rybka(!), Houdini, Stockfish (open source, atvasina daudzi),u.c. daudzi kā Zappa.
Ir tāds RobboLitto,IvanHoe,Fire u.c. no vienas stipra koda saimes.
http://www.chesscentral.com/software/fritz.htm
http://www.chessbase.com/shop/ (Lielākā partiju datu bāze)
http://chessmaster.uk.ubi.com/xi/index.php
http://www.hiarcs.com
http://www.shredderchess.com (šeit var uzreiz uzspēlēt un zaudēt web-lapā, t.i. tur ir kārtīga programma pieslēgta caur pieprasījumiem, nevis kāda java vai javascripts)
http://www.cruxis.com/chess/houdini.htm - Stiprs šaha dzinis Houdini ir jauns konkurents Rybka.
http://www.rybkachess.com/ - (līderis)
te ir arī labs forums, dzinis skaitās ļoti spēcīgs. (web-lapā ar to var uzspēlēt http://www.chessok.com/onlineserv/rybkavs/rybka.php. Domāju, ka uz mobilajiem telefoniem risinājums caur web-lapu ir ideāls stipram šaham, tikai nepieciešams pastāvīgs internets.)
Komercija, protams, pārsvarā gadījumos nepieļauj source programmu tekstu brīvu iegūšanu,
tomēr vecākām versijā internetā tas parādās visai plaši.
Visbiežāk sastopami athīva failiņi ar distributīvu atbilstošai platformai – tikai dziņi.
Ir kategorija šaha dziņu brīvai lejupielādei ar visām sourcēm. Jāsaka, ir daudz bezmaksas chess engines,
kur projekts kādreiz sācies, turpinājies un loģiski nobeidzies, nespējot
cīnīties ar šaha grandiem programmu jomā. Tā arī aiziet vēsturē un tagad sources
autori liek internetā. Tomēr varbūt ir vērts tos paanalizēt, pirms atsisties
pret muļķīgām kļūdām paša algoritmā (kā viens rakstīja: „Itkā pēc pozīcijas esmu
uzvarējis, bet nezkāpēc algoritms nevis mato, bet karalis tikai muļķīgi skraida
pa galdiņu".
Crafty garadarbs http://www.craftychess.com/
Pētīju sources tekstus C valodā. Aptuveni 1Mb .c failiņu. Darbojas gan uz Windows,
gan Linux platformas. Nu priekš Mac gan jau arī var atrast kāda dziņa sourci.
Kods ir ievērojams, rakstīts sen un pamatīgi. Internetā sastopami daudz atvasinājumi,
jo spēlē visai augstā līmenī. Crafy vispirms rezervē vietu atmiņā, ņem talkā
atklātņu tabulu pirmajiem gājieniem no faila, un, kad esmu to novedis no kursa
ar a2-a3, rēķina cik nu var tālu paspēt sarēķināt. Protams, kods ir jūtami
novecojis un ir labāki, tomēr arī šajā darbs ieguldīts ievērojams un pietiekami
apjomīgs. Pētot pozīciju vērtēšanas algoritmus, nonācu pie slēdziena, ka tiek pilnībā izmantotas visas uzkrātās zināšanas par šaha teoriju. Algoritms nekļūdīgi pēc figūru izvietojuma jūt tālāk spēlējamo taktiku. Šaha teorija aprakstīta wikipēdijā, tas viss atrodams Crafty kodā. Man prieks, ka šādas labi dokumentētas augstas klases programmas kāds piedāvā brīvai apskatei. Pēdējās izmaiņas šeit saistītas ar galotņu tabulām, kas nu jau ir sarēķinātas 6-figūrām un dzinis to var izmantot reāli. Crafty vispār skaitās sentēvs un no viņa nākuši daudzi atvasinājumi, kā piemēram Glaurung http://www.glaurungchess.com/ (Stockfish ir viņa pēctecis)
Ir pieejami arī daudzi citi dziņi, arī Rybka vecākās versijās. Protams, daudz var atrast arī torrentos.
Šaha programmētājiem labi zināms ir GnuChess. Internetā ir daudz tā klonu un tam ir daudz versiju (no 90jiem), protams moderns.
Visai laba klasifikācija šaha programmām atrodama šeit.
Pārsvarā tiek nodalīts dzinis (chess engine) no vizuālās daļas (GUI - graphics user interface). Savienojuma standarts ir UCI (Universal Chess Interface), kuram tad visi dziņu izstrādātāji arī
piemērojas. Vecs protokols, bet nu tāda ir attīstības vēsture. Visas šīs programmas, lai cik slavējamas no šaha viedokļa, absolūti neslavējamas no
integrēšanas viedokļa. Tas jūtami nekad nav bijis šaha programmu pamatuzdevums. Parasti kopā ar UCI (specifikācija / detalizēti) tiek minēts winboard/xboard standarts, ko arī šaha dziņos iekļauj. Labs salīdzinājuma raksts detalizēti apraksta plusus un mīnusus. Bet nu būtībā šaha dziņa interfeisam nepieciešamā funkcionalitāte ir pozīcijas uzdošana un komanda meklēt ar dziļuma parametru. Tehniski tas viss notiek caur standarta stdin/stdout datu plūsmu. Dzinis tiek startēts kā process un tam tiek padoti pieprasījumi. Reizēm GUI izstrādātāji pārkompilē opensource dziņus, stabilākai un optimālākai darbībai.
Iesaku ieskatīties sadaļā http://www.sdchess.net/html/download_engines.htm
un http://www.playwitharena.com/ (Šeit ir visai labs open source stipram šaham, par brīvu, protams gan GUI, gan dziņi komplektā Arena),
http:/www.tim-mann.org/xboard.html
Es pamēģināju Winboard (ar Crafty dzini iekšā) instalāciju http://ftp.gnu.org/gnu/winboard/winboard-4_2_7b.exe
Spēlēja viņš nikni, nospieda mani kā uti stūrī. Piezīmēšu, ka ja tam pašam vecajam Chess Master 3000 (no
seniem Windows 3.1 laikiem) uzliek dziļāku meklēšanas līmeni, tad mēs arī
panākam visai labu šaha programmu, pateicoties mūsdienu datorjaudām. Gribēju
teikt, ka Deep Blue pret mani nav vajadzīgs.
Tiem, kam patīk vēsture, iesaku apskatīt http://www.benlo.com/microchess/microchess.html, kur laikam ir pirmais assemblera šahs.
Pirmā programma nemācēja ne rokādes, ne garāmsišanas. Otrā plaši zināmā assemblera programma bija Sargon no 1978.gada, kuras kods ir pieejams (wiki).
Citas adreses ko apskatīt: http://www.andreadrian.de/schach/index.html ar bildēm un informāciju bagāta šaha vēstures lappusīte vācu valodā, britu lappuse par šaha programmu vēsturi, kā arī http://www.computer-museum.ru/games/kaissa1.htm par padomju laiku pirmo šaha skaitļotāju. Adresēs 1, 2, 3 var izbaudīt vecās šaha programmas darbībā pārlūkprogrammā (tikai vajag javu uzinstalēt).
Adresē http://www.spacious-mind.com atrodama lieliska 30 gados uzkrāta kolekcija-saraksts par šaha kalkulatoriem (nezinu kā tos nosaukt), programmām, vispār vēsturi ar visām bildēm, kas regulāri tiek arī papildināta. Piebildīšu, ka mūsdienu šaha kompjūteri-kalkulatori (ar galdiņu vai bez) tagad ir tās pašas spēcīgās šaha programmas parastos datoros. Agrāk tomēr bija atšķirība tos kodējot katru pēc tehniskām iespējām: lampiņas, rezistori, 8-bitu korejiešu procesora shēmiņa. Cik man zināms, piemēroja tādus šaha assemblera kodus kā Sargon un Colossus.
Par mobilo ierīču šahu
Šahs mobilajā telefonā ir vājāks par šahu uz stacionārā datora vai laptopa, jo iekārtai ir ierobežotas skaitļošanas iespējas. Tomēr java programmēšanu laikam var iemācīties un mobilās ierīces attīstās strauji savā ātrdarbībā. No programmētāja viedokļa, mobilos var sadalīt tā: iphones (jālieto Apple SDK), androidi (Google Android SDK, java), Windows mobiles (Microsoft Visual Studio) un lērums java (JavaMe+ražotāja SDK) variāciju. Android šobrīd ir stipri tirgus līderis, tomēr samērā jauns lai būtu daudz šaha programmu. Android aplikācijas ir java, lai arī nav nekāds C++. Gribi negribi, javisti nekur nepazūd. No vecajām java pazīstams ir ChessMaster, bet nu tāds. Spēcīga java chessgenius ,arī shredderchess (failiņi). PocketPC iekārtām pocketgrandmaster.com (var lejupielādēt šeit). Chess Tiger skaitās stipra programma Palm datoriem (apkopojums). Šaha programmu ieteikumi no lietotāju puses iphone (arī) un android. Šeit daži android aplikāciju .apk faili lejuplādējami android pārlūkā (tikai jāatļauj uzstādījumos instalēt arī ne AppMarket aplikācijas).
Stipra programma (source arī) ir DroidFish. Jebkurā gadījumā, tādos serveros kā FICS un portālos kā chess.com ir visas iespējas iegūt atbilstošo programmu mobilajam telefonam spēlei tiešsaistē.
Planšetu iekārtas ir kā jaudīgāki mobilie mapītes izmērā, tomēr vājāki par dotoriem un par samērā augstu cenu. Programmas tām izstrādā gandrīz kā priekš mobiliem. Piebildīšu, ka stipru šaha programmu radītāji acīmredzot no tā visa ir tālu, zinātne turās pie daudzprocesoru stacionārajiem.
Par šaha programmu dažādību - platformas, valodas, veidi
Pēdējos gados kļuvis iespējams izstrādāt vismaz 3 gājienus uz priekšu rēķinošu šaha dzini ActionScript(AS3) valodā (Adobe flash, jeb vienkārši "flex"), pateicoties datoru ātrdarbības pieaugumam. Varu ieteikt sekojošu lapu http://www.flashchess3.com, un pats autors apraksta šeit savu veikumu, manuprāt lieliski sanācis. Spēcīgi spēlējoša flash programma ir adresē: http://ezis.appspot.com/FLChess.htm. Java šaha aprēķiniem ir daudz ātrāka, tomēr flash ir labākas grafiskās iespējas. Flash ir uzinstalēts gandrīz uz visiem datoriem, ko nevar teikt pilnībā par java.
Savukārt Microsoft arī neguļ uz lauriem un attīsta savu Silverlight tehnoloģiju. Viens labs piemērs arī atrodams http://silverlight.net/samples/sl2/silverlightchess/run/Default.html. Tur var labi redzēt, cik ļoti kvalitatīvi javascript (JS) šahs ir vājāks par Silverlight variantu un C# iespējām. Ideāls piemērs izpratnei. Silverlight būtu piemērots šaha programmēšanai. MS Studio ļauj savā Silverlight projektā iekļaut .cs (C-šarp) kodu, kas ir ātrs. Sanāk gandrīz .exe internetā. Tikai, vai visi lietotāji to Silverlight būs uzinstalējuši?
Lai nerastos jautājumi, .exe un .dll (C,C++,arī C#, trakajiem ASM), protams ir pati labākā programmēšanas valoda un rezultāts šaha dzinim, t.i. ņemiet MS Studio Express, un uz priekšu. Protams, ir arī citi C kompilatori. Visual Basic būs bišķi lēnāk (vai nepiemērotāk), bet nu ar python gan nekas gudrs nesanāks.
Par python un Lua runājot, šīs divas valodas nemaz nevajadzētu noniecināt. Python interpretators plaši tiek lietots grafikas programmās, jo tam ir pietiekami ātrdarbīgas matemātiskās funkcijas (teiksim, pietiekoši). Lua savukārt ir plašu popularitāti ieguvusi skriptu valoda video spēļu programmēšanā (nu ļoti ērta un to ātrumu vajag nosacīti). Lai arī šaha dziņa gadījumā to pielietošana ir apšaubāma, toties 3D funkcionalitāti tās var nodrošināt pilnā mērā.
Te ir daži interesanti linki:
No sērijas „Kur šahists ar savu prasmi ir lieks un cīnās tikai programmas”:http://www.husvankempen.de/nunn/ (CEGT)
Katru gadu dažādās pilsētās notiek šaha programmām organizēti turnīri (kas arī nosaka to savstarpējos reitingus) un zināmākie ir CEGT, ICGA, CCRL, WBEC, SSDF, vācu. Ir arī entuziastu web-lapas.
Šeit labi apkopojumi dažādiem reģistrētiem dziņiem: http://www.superchessengine.com, http://lefouduroi.pagesperso-orange.fr/tournois/uci/uel.htm, http://www.chessopolis.com/cchess.htm, protams Arena http://www.playwitharena.com.
Stipras java programmas un to sources ir sekojošās adresēs: http://web.comhem.se/petero2home/javachess - Cuckoo chess, http://home.arcor.de/dreamlike/ot5applet/index.html - OliThink chess. Šeit nekomentēšu, stipri dziņi 64bitu javai. Nav jau vairs nekāds brīnums, ka java spēj sarēķināt miljoniem variantu sekundes laikā. Spēlē stipri.
Kā visai nopietnu java programmu varu ieteikt arī šo: http://www.ludochess.com/jester_eng/jester_eng.html
Source tai nav pieejama, bet es papētīju dekompilētā veidā. Ir pieejama lejupielādējama versija šeit. Šī ir stipra java bāzētā "vecā" stila programma bez 64bitu bitboard elementiem, pārnesama pat uz javascript un actionscript.
Aizdomas, ka programma sazinās ar serveri man pazuda, tiklīdz zaudēju tai ar atslēgtu internetu. Programmu izrādās var uzrakstīt 90Kb java kodiņā tā, lai tā visai labi spēlētu šahu!
Ideja slēpjas labi sabalansētā matemātiskā modelī, kurš darbojas dziļā rekursijā. Tātad vajag ātrdarbību, bitu
operācijas, zināt precīzus koeficientus un prioritātes (būt draugos ar šahu) un tad pat nevajag atklātņu
datubāzes, jo modelītis nedarīs muļķības partijas sākumā. Kā uzzināt šo matemātikas modelīti- tas ir cits jautājums. Skaidrs ir
viens, ka tradicionāli pārskatāmas un cilvēkam saprotamas programmas šaha gadījumā neder, jo būs lēni.
Tikai matemātika, cipari, rekursijas un precīzi koeficienti.Diemžēl.
Dažas viltības, pētot kodiņu, es tomēr atklāju. Tās būtu sekojošas:
1. neanalizējam visus variantus, bet ticamākos (dažādas tehnikas katrai programmai kā to darīt);
2. prioritāte kaušanai un to vispirms rēķinam tik dziļi, lai kaušana vairs nebūtu iespējama;
3. varianti ideāli glabājas koka veidā (grafā), t.i. varbūt labāk lietot objektorientētu pieeju (new node()) un klases (Position.score, Position.nextvariants[]), nevis masīvus [0....x-miljoni]. Šeit gan jāskatās kā tiek izmantotas hash tabulas (sk.zemāk);
4. vērtēšana ir sarežģīta, jāizmanto gandrīz visi elementi, kā brīvie bandinieki, bloķētie, pāra, kādi
laidņi,utt.
5. Nav vērts pat sākt, ja skaidri zināms, ka kods darbosies lēni un rekursijas nespēs laikā
sarēķināt. Būs ne tikai švaks spēlētājs, bet pat ļoti, ļoti iesācējs.
6. Ir gadījumi, it sevišķi spēles beigās, kad jāvērtē nevis nākamie gājieni, bet figūru uzvedība un
taktika, kaut randomizētā veidā (bandinieks varētu skriet dāmā tuvākos 5
gājienus, karalis varētu ķert bandinieku, vai vajadzētu pienākt ar karali, lai
ieliktu matu).
Šeit, manuprāt, arī ir visai saprātīga java valodā uzrakstīta šaha programma http://www.lokasoft.nl/jchess/chessgame.htm. Lokasoft radījis puslīdz labu šaha dzini java vidē, kuru daudzviet internetā var atrast. To var brīvi iekļaut savos projektos, tam ir pat aprakstīts interfeiss. Šeit lapas, kur to var atrast vēl:
1, 2, 3. Diemžēt programmas izejas kods netiek dots.
Starp citu, ideja, ka java-aplets ielādējas atmiņā un kompilētais kodiņš rēķina (salīdzinot ar daudz augstāka līmeņa interpretatoriem), šaha programmas gadījumā ir
ļoti piemēroti.
Tomēr java nav .exe un tas ir lēnāk.
Viena samērā labi spēlējoša veca java ir adresē http://javachess.tripod.com.
Diezgan labi spēlē uz javascript nokompilēts stockfish (GitHubs). Šahistiem arī noderīga lapa. Tas veikts ar Emscripten, kas ir C koda kompilēšana uz JS, bet tā nav gluži "tīrākā" portēšana, lai gan rezultāts spēlē visai labi. Līdzīgs projektiņš ir adresē http://www.vectomatic.org/lib-gwt-svg-chess (apraksts). Lietojot Google Web Toolkit (GWT) rīkus, autors pārveidojis java-bāzētu šaha dzini uz javascript-bāzētu. Tādējādi, pārvēršot java apletu pārlūkprogrammas interpretera valodā, tiek zaudēts šaha stiprums, toties tiek radīta iespēja spēlēt šahu jebkurā pārlūkprogrammā (arī bez instalētas javas atbalsta).
Visual Basic valodā uzrakstīts kods http://www.freevbcode.com/source/Migoya_Chess.zip
Interesanti, ka šaha programmas rakstītas pat tādās senās biznesa programmēšanas valodās, kā FORTRAN (forums) un COBOL (publikācija).
Pārskatāmas programmiņas piemērs redzams arī Qbasic valodā no DOS laikiem forumā (vai arī lejupielādējot QB64 beisika piemērus). Kā arī viena Turbo Pascal valodā rakstīta šaha programmiņa.
Viens java šaha dziņa izstrādātājs uztur visai labu blogu par savu darbu adresē http://mediocrechess.sourceforge.net. Kā redzams, tas ir pietiekami sarežģīti.
Dažas noderīgas lietiņas:
Šaha pozīciju var eleganti uzģenerēt arī ar vienu linku, no kura var paņemt arī bildītes http://www.eddins.net/steve/chess/chessimager
Ja vienkārši jāapskata saglabātu partiju pozīciju fails (pgn) http://www.lutanho.net/pgn/pgnviewer.html
Te var uzģenerēt šaha pozīcijas diagrammu: (a), vai (b), vai (c).
Interneta resursiņš, kur uzreiz var redzēt uzliktās pozīcijas FEN kodu: http://chessup.net/.
Bezmaksas ChessBase Light versija http://www.chessbase.com/download/cblight2007/index.asp
2-miljonu partiju datubāzīte internetā ar pozīcijas meklēšanas iespēju: http://www.chesslab.com/PositionSearch.html
Starp citu, http://www.365chess.com ir laba partiju online datubāze, kurā var atrast arī aktuālākās partijas, kā arī senās klasikas. Laba meklēšana un apskate pārlūkā. Laba alternatīva Chessbase, tikai bez maksas.
Nu un te arī viskautkas no šaha programmām http://www.enpassant.dk/chess/softeng.htm
Te ļoti labs apkopojums gatavām šaha programmām http://www.schackportalen.nu/English/emjukvara.htm
Viens entuziasts uztur ftp serverīti ar dažādām labām lietām, ko var lejupielādēt. Tur ir arī daudz šaha dziņu.
Šeit daudz vecu šaha programmu: http://chess.eusa.ed.ac.uk/Chess/Links/Pittsburgh/prg.html.
Daudzu brīvi iegūstamu programmu katalogs tiek uzturēts http://www.enpassant.dk.
Atklāju visai labu avotu šaha programmu iegūšanai adresē http://www.filetransit.com. Tikai meklēšanā jāuzdod vārds "chess". Lejupielādes, apraksti un liela brīvo programmu dažādība.
Aktīvs šaha programmu fanāts, kuru citādāk nenosauksi, publicē savas norādes-saites blogā http://jimablett.hostwebs.com, kas tomēr nav ierastam lietotājam paredzēts.
Šaha lappuses internetā, lai nav lieki jāmeklē:
Daži izdevušies portāliņi par šaha tēmu: http://www.worldchesslinks.net, http://www.chessgames.com, http://www.chess.com (ja kas,spēcīgs portāls: spēlēšana, lejupielādes, rubrikas, forums, t.i.visai nopietns darbs notiek), http://www.chessdom.com, http://www.chessok.com, http://www.chessvibes.com, http://www.chesscafe.com.
Vairāk informatīvi šaha spēlētājiem: http://www.fide.com, Latvijā http://www.chess.lv, http://www.sahistiem.lv.
Šaha datorprogrammu Wiki: http://en.wikipedia.org/wiki/Chess_engine.
TWIC šaha nedēļas žurnāls: http://theweekinchess.com, kurā ir praktiski visu aktuālo turnīru informācija: oficiālās lapas, dalībnieki, rezultāti, partijas, utt.
Visu galveno šaha turnīru rezultāti ir atrodami tam speciāli radītā adresē: http://chess-results.com, kā arī iespējams atrast šo to par notikušiem turnīriem.
Simpātisks un viegli lasāms labā angļu valodā ir Chessville rakstiņš, kur ir jūtami kvalitatīvs programmu apkopojums (bet ne pats jaunākais) vienā lapā ar ieteikumiem šaha programmu lietotājam.
Par bezmaksas programmām viens svaigs apraksts atrodams http://www.techsupportalert.com/best-free-computer-chess.htm.
Starp citu, publicēšanai internetā lieti var noderēt šaha unikodu simboli (wiki):♔♕♖♗♘♙♚♛♜♝♞♟.
Kā arī šaha figūras .svg formātā un true type šaha fonti 1, 2.
Par tiešsaistes šaha serveriem (online chess servers)
Internetā, protams, ir daudz programmu un serveru, tomēr tos var iedalīt pēc popularitātes, dalības maksas, nu un uzstādāmās programmas veida.
Liels bezmaksas serveris ir adresē http://www.freechess.org/. Par maksu ir http://www.chessclub.com/, http://www.playchess.com , http://www.chessworld.net. Ieteicams lietot kārtīgu aplikāciju, nevis java, jo tās ir zināmas priekšrocības ātrumā. Protams, būtisks ir interneta pastāvīgums, citādi muļķīgi zaudējumi garantēti. Serveros tiek izmantoti arī spēlētāji-roboti (pieslēgts kāds dzinis caur interfeisu). Vēl raksturīgi, ka prasmīgi šaha spēlētāji izvairās no nepopulāriem serveriem, t.i. viņu skaits tomēr ir galīgs.
Vēsturiski, liels šaha spēlētāju skaits ir FICS un ICC serveros un tie arī ir visvecākie pat pēc savienojumu konstrukcijas (telnets caur portu 5000). Vēl ir http://www.caissa.com, http://www.chesscube.com, u.c.
Serveros jāpiereģistrējas (uz savu e-pastu jāsaņem apstiprinājums un jāpabeidz reģistrācija pēc norādes), atkarībā no programmas: jāmeklē vai jāpiesaka spēles, vai jāiet istabās, jādefinē jauns galdiņš, vai "jāsēžas" pie kāda gaidoša (pievēršam uzmanību pretinieka stipruma reitingam un laika kontrolei). Spēli uzsākot, čatā vēlams uzrakstīt "Hi!" (sveiks :).
No vienkāršības viedokļa, ļoti simpātisks ir http://www.chess.com serveris. Vienkārša reģistrācija, skaists dizains. Pasaulē kļuvis ļoti populārs pēdējos gados. Otrs augošs chess.com konkurents ir http://lichess.org.
Reklāma popularitātes veicināšanai
Daži vārdi par gājienu datubāzēm (books)
Šaha partiju sākumā, protams, var analizēt pozīcijas un mēģināt darīt labākos gājienus, bet var arī papētīt
statistiku (necensties izdomāt riteni) par visbiežāk spēlētajām atklātnēm un variantiem, tādējādi novēršot
kļūdas jau pašos pirmajos gājienos. Pētot Crafty datubāzi, kas savos ~10Mb satur lielu daudzumu pozīciju binārā veidā,
kļuva skaidrs ieguldītā darba apjoms šāda maza failiņa iegūšanai. Tas nav vienkārši. Var mēģināt
atšifrēt ChessBase datubāzi, tomēr ir vienkāršāki veidi. Ir šaha atklātņu statistika
internetā http://www.chessgames.com/perl/explorer, vai http://chessecodatabase.com.
Pieļauju, to var lejupielādēt un automatizēti arī apstrādāt, tomēr man izdevās atrast apmēram 5,7miljonu partiju
failu PGN pierakstā. Šajā adresē pieejams nedaudz mazāks fails, bet tomēr iespaidīgs partiju skaits: http://www.top-5000.nl/pgn.htm
Veicot metodisku apstrādi, kas prasīja iespaidīgus datorresursus, ieguvu datubāzīti tīra atklātņu teksta ar partiju skaitiem un rezultātiem katram variantam.
Ja apskatam jau gatavus risinājumus, tad praksē pastāv sekojoši atklātņu failu standarti: Polyglot (.bin failiņi), Arena (.abk), un Chessbase/Fritz (.cbk).
Ar programmu palīdzību ir radīti daudzi šo failu varianti, itkā savstarpēji savietojami dažādos šaha dziņis, tomēr praksē var izrādīties, ka kautkā nedarbojas un kāds amatieris sakomplektējis. Jāskatās no kurienes fails nācis. Fails pēc būtības ir gājienu datubāze. Tikpat labi var būt pozīciju/novērtējumu datubāzīte.
Polyglot formāta datos (labs apraksts) meklē pozīciju pēc unikāla (nez vai pierādīts) koda, iegūst nākamos gājienus un to "svara novērtējumus" (iepriekš ar programmām aprēķinātus).
Visiem zināmi standarti
Jebkuru šaha pozīciju var aprakstīt FEN pierakstā, kas kļuvis ļoti populārs internetā, kā arī elektroniski saglabājot pozīcijas šaha programmās. Bieži, pielietojot interneta norādē kā parametru FEN pozīcijas kodu, tiek iegūta analīze pozīcijai/diagramma/citi brīnumi, ko piedāvā konkrētā lapa. FEN kodā pirmā daļa apraksta figūras uz galdiņa, sākot no galdiņa augšas uz leju. Melnajiem-mazie burti, baltajiem-lielie. Diagrammai protams pietiek, tomēr, pilnvērtīgas partijas gadījumā ir vēl papildus parametri: kam gājiens, kādas rokādes iespējamas, kuru bandinieku tagad var sist garāmejot, gājienu skaits bez sišanas (pēc 50 var pieprasīt neizšķirtu), partijas gājiens.
Partijas tiek pierakstītas un saglabātas tīri angliski PGN pierakstā un tāda paša paplašinājuma failos (te standarts). Gadās vēl arī ChessBase faili .cb* , bet nu tie nav tik vērsti uz atklātā koda pusi :) Šis formāts satur papildus ChessBase iekšējos indeksiņus. Figūru apzīmējumi: bandiniekus neapzīmē nekā, N-zirgs, B-laidnis, R-tornis, Q-dāma, K-karalis. Pārējais itkā viegli saprotams visiem.
Šaha dziņa stiprumu, tāpat kā profesionālu šahistu gadījumā, raksturo ELO reitings. Ja šahistiem tas tiek aprēķināts pēc turnīriem (Rēķina FIDE organizācija), tad datorprogrammu gadījumā tas ir vairāk nosacīts. Vienmēr, kad runājam par šaha programmu, tomēr ir svarīgi uzreiz uzzināt ELO līmeni, uz kuru tas pretendē (Rybka ~3200, Crafty ~2700, mans javascript garadarbs ~500). Šeit ir interesants statistikas rakstiņš par zināmu spēlētāju un čempionu reitingiem.
Atklātnes ir sanumurētas un tām ir piešķirti ECO kodi (A00-E99).
Pozīciju analīzēs (anotācijās), bieži komentāru veidā parādās pozīciju novērtējums (PGN tekstos simbols $). NAG kods norāda uz pozīcijas vērtējumu pēc saraksta. Anotācijas veidojot, parasti fonā darbojas kāds šaha dzinis, kas veic arī vērtēšanu.
Šahs kā uzdevums programmētājam
Galdiņš 8x8, tumšais lauciņš sākot no A1, figūru gājieni un sākuma pozīcija - wikipēdijā labi aprakstīts, tāpat arī noteikumi. Sadaļa latviešu valodā.
Nianses(!), kas jāapskata, programmējot šahu pēc pareiziem šaha noteikumiem:
-bandinieka sitiens garāmejot (wikipēdijā En_passant aprakstīts), kā arī 2 lauciņu gājieni. Pārējās figūras iet visus savus iespējamos gājienus visos virzienos.
-ja karalis vai attiecīgais tornis ir izkustējies, rokāde vairāk šajā partijā nesanāk;
-rokāde šaha brīdī nesanāk;
-rokāde nesanāk, ja karalim jālec pāri apdraudētam lauciņam;
-bandiniekam ieejot dāmā, tiek uzlikta figūra - dāma/tornis/laidnis/zirgs (var sanākt arī 2 melnās dāmas uz galdiņa, piemēram);
-ja ir šahs un to neizdodas novērst, tad ir mats (programmējot šī sadaļa ir specifiska, jo nevar vienkārši to ignorēt) un spēle beidzas (angl. white wins/black wins);
-ja nevaram vispār paiet un nav ne šahs (angl.check), ne mats (angl.checkmate), tad ir pats (angl.stalemate) un spēle beidzas, t.i. neizšķirts (angl.draw);
-ja pozīcija atkārtojas 3 reizes, tad ir neizšķirts un spēle beidzas;
-ja 50 gājienus nav nokauta neviena figūra, tad ir neizšķirts.
Cilvēciskos faktorus kā "pieskāries-jāiet", "velkam spēli mīcoties", neizšķirta piedāvāšanu, emocionālu padošanos - neapskatam.
Šaha pulksteņi arī varētu būt nākamais solis.
Rēķinot iespējamos figūru gājienus, jāņem vērā, ka lēkt pāri figūrām var vienīgi zirgs un kāpt virsū savām figūrām nedrīkst, turklāt sevišķs gadījums ir rokāde.
Tā īsumā viss pārējais ir atļauts un uzdevums nodefinēts.
Jaunākie šaha virzieni
Tas, ka šaha uzdevumus nu jau labāk risina programmas, radījis šahistos vēlmi attīstīt jaunus kreatīvākus virzienus. Ir visādas idejas, kā piemēram, jauns figūras veids uz galdiņa, vai nestandarta lieluma galdiņi, vai cits figūru izvietojums sākumā, vai vispār šaha galdi trijstūra vai sešstūra formās. Visveiksmīgākā ideja ir Fischer Random Chess (jeb Chess960). Tā jūtami gūst popularitāti un pat šaha programmas sāk tam piemēroties. http://www.chess960.net var iepazīties ar to, bet pamatā ir 960 iespējamas sākuma pozīcijas ar mainītu smago figūru izvietojumu. Protams, nu jau tā īsti sagatavoties partijai, samācoties atklātnes, sanāk visai grūti. Visnejēdzīgākā lieta ir rokāde, bet nu diemžēl šeit to nav vēl aizlieguši (mans imho). Piebildīšu, ka notiek pat turnīri un vairāki šahisti tiešām sāk pievērties šim virzienam kā hobijam.
Ko pilnveido šaha dziņos
Šaha dziņu programmēšanā pēdējos gados svarīgākais:
1) liela apjoma dati ar iepriekš izrēķinātiem labākiem gājieniem (spēles beigās ceļš līdz matam jo sevišķi (EGTB,Gaviota tablebases));
2) nu jau gandrīz katrs jaunais dzinis izmanto int64 skaitļus bitboard reprezentācijai, vairs ar int32 neaprobežojas;
3) tagad visi (citādāk vairs nav nopietni sacīkstēm) izmanto "magic bitboards",t.i.ir liels daudzums iepriekš saskaitītu skaitļu masīvu, jo tas darbojas ātrāk un atmiņas vai diska vieta vairs nav problēma - milzīgs lietderības koeficients;
4) daudzplatformu kompilācijas (Windows, Linux, Mac, protams apgrieztās versijās iOS (Apple ipad&iphone) un Android) gandrīz visiem zināmiem stipriem dziņiem;
5) multiplūsmu kalkulācijas (threads) - reāli atmiņā sēž vairākas dziņa kopijas. Vienkāršākā gadījumā nākamos gājienus vienmērīgi sadala pa procesoriem un tie rēķina. Problēmas ir komunicēties starp thread-iem, bet ja minimāli, tad nekas. Senākos laikos bija viens procesors un algoritms arī bija vienkāršāks. Un pastāv arī uzskats, ka procesoru noslodzes regulēšanu labāk varētu atstāt pašas sistēmas pārziņā;
Kas attiecas uz programmēšanas valodām, tad C vietā vairāk tiek lietots C++ (.cpp), nekādas vairāk izmaiņas reāli pielietojamās valodās nav. Piezīmēšu, ka arī programmu kodi sirgst ar novecošanu, jo vienā brīdī paši dziņu izstrādātāji tos pārraksta no jauna. Kas attiecas uz online web-servisiem kalkulācijām šaha jomā, tad nekādas super-kalkulācijas kādā interneta vietnē piedāvātas netiek. Varētu būt, bet kautkā nav. Laikam neatmaksājas. Visi pērk sev atsevišķu tehniku, attiecīgi tiek arī programmēts. Nu un protams tagad tiek piedāvāts šahs mobilajām iekārtām un planšetēm.
6) ir vēl tādas mazas kpk-tabulas, t.i. kad palicis karalis pret karali un bandinieku, tad 12Kb failā apskatās risinājumu;
7) vietām SSE2 instrukciju lietošana. Jaunākiem procesoriem ir klāt nākušas operācijas, kas manipulē ar papildus reģistriem (vienā darbībā). Tādējādi ir ieviests 128 bitu skaitļa tips (__m128i). Praksē redzēju paātrinātu datu masīvu kopēšanu (divus int64 uzreiz). Grafikā tos lieto vektoru aritmētikā. Vēsturiski no MMX laikiem paplašinātie mašīnkoda operatori dod paātrinātu skaitļošanu.
8) 64-bitu Windows būtiska atšķirība, nokompilējot C kodu, ir pointeru adresācija. Agrāk datus apstrādāja "tuvumā" datu segmentā (max 4Gb), bet tagad milzīgā atmiņas masīvā ar adresi 64 bitos. Tāla adresācija nebūt nav optimāla maksimālai ātrdarbībai. Tad nu jādomā kā optimālāk organizēt mainīgos un atmiņas buferus.
Hash tabulas
Hash ideja ir nerēķināt to, kas jau vienreiz izrēķināts. Hash tabulas parasti uzglabā pozīcijas un to novērtējumus. Parasti, startējot šaha dzini, tiek rezervēta ievērojama vieta atmiņā (ar malloc()) daudzu megabatu apjomā šaha pozīciju/to novērtējumu/nākamo variantu/u.c. uzglabāšanai. Tā dara praktiski visi nopietnie šaha dziņi. Tas, protams, dod milzīgas iespējas darboties ar jau aprēķinātu un saglabātu informāciju, tomēr būtiski padara programmu nepārvietojamu uz citām vidēm/programmēšanas valodām/iekārtām, kur nav šādu milzīgu atmiņas pārvaldīšanas iespēju. Klasiski būtu informāciju glabāt mainīgajos/masīvos/objektos, bet ne caur norādēm kaut kur dziļi sistēmas piešķirtos atmiņas apgabalos.
Bieži hash atslēga ir identiska polyglot .bin atklātņu atslēgas formātam, t.i. tiek izmantots tas pats daudzu xor() algoritms, kas iegūst 64-bitu skaitli, atspoguļojošu tekošo pozīcīciju. Ja FEN ir tekstuāls pozīcijas pieraksts, tad hash atslēga ir skaitlis pozīcijai.
Kad programmā tiek izsaukta funkcija, tā arī rezervē sev apgabalu privātiem mainīgiem. Ar to gribēju norādīt būtisku atšķirību šaha programmu uzbūvēs, ko nevar uzreiz pamanīt. Turklāt, analizējot šaha programmas un to klonus, kļūst redzama gandrīz vai viena un tā paša koda izmantošana ar minimālām atšķirībām (jo sevišķi tādas kā "hash.c").
Programmējot jāuzmanās, lai kolīzijas (maz atmiņas) un aprēķinu sarežģītība neradītu palēninājumu, jo bez hash var arī iztikt.
3D programmēšamas iespējas
Tiem, kas vēlas reāli veikt trīsdimensiju programmēšanu, iesaku lejupielādēt rīku Unity3D, vai ShiVa3D, vai pie ļoti jaudīga datora UDK. Tas gan nav domāts tieši šaha dziņu programmēšanai.
Mata meklētāji, jeb "checkmate solvers"
Labi spēlējošs algoritms meklē gājienus selektīvi, vērtējot pozīcijas (daudz kalkulāciju). Tas ir lieki, ja, piemēram, jāatrod mats 22 gājienos (pozīcija). Spēcīga šaha programma izvēlēsies stabilāko gājienu, bet pat neapskatīs figūru upurus, kuri (maz iespējams), noved pie forsētas uzvaras veiksmīgas apstākļu sakritības rezultātā. Internetā pieejams ChestUCI projekts šaha problēmu risināšanai, tomēr šī programma ir veca un, piemēram, Fritz var uzdot meklēt matu. Šī tēma būtībā ir saistīta ar šaha problēmu kompozīcijām (wiki). Protams, arī šeit tiek izmantotas jau zināmu pozīciju datubāzes. Parasti uzdevumos, kur jāatrod mats dažos gājienos, risinājuma variantā gandrīz katrā gājienā tiek uzbrukts karalim (šahs vai tuvu tam). Praktiski visi stiprie dziņi matu atrod vispirms, jo tas algoritmos ir prioritatīvi un neprasa lielas pārlases. Tomēr, ja risinājums prasa viltīgus manevrus, algoritmam nepieciešama vai nu intuīcija, vai pilnāka un dziļāka pārlase. Sanāk, ka parastām šaha programmām uzdevums tomēr ir nedaudz cits.
Uzģenerēti M1,M2,M3, arī daži M4, un programma atrodas šeit, tomēr M5 reālā laikā atrast šis kods jau nespēj.
Šaha blogi
Jebkurš sevi cienošs profesionālis šajos laikos var izveidot savu blogu, piemēram ar http://www.blogger.com. Agrāk tomēr tas prasīja ievērojamas datorzināšanas, šobrīd tas ir kļuvis ļoti vienkārši. Tādējādi internetā parādās vairāk un vairāk šahistu blogi, kas interesanti tieši profesionāļu skatījumā.
Daži piemēri: http://susanpolgar.blogspot.com (vai A,B,C, D, nedaudz nopietnāks izpildījums: E,F un daudzi citi). Par šahistiem diezgan daudz informācijas var atrast wikipēdijā, sociālajos portālos, viņu oficiālajās lapās, protams googlē un bing. Blogu un publikāciju gadījumos kļūst svarīgs šaha spēles attēlojums un te jau ir dažādi interesanti rīki (piem.java bāzēts http://chesstuff.blogspot.com, http://gameknot.com, par maksu http://www.chesspublishing.com). Tomēr atstāšu izvēli pašu blogeru vietā, turklāt šī tēma ir ļoooti plaša un apskatīt šeit to sevišķi negribētu. Personīgi ieteiktu paskatīties http://chesstempo.com šaha partiju publikācijas rīku PGN-VIEWER, kuru darbībā var apskatīt, piemēram, šajā blogā. Pārskatāms, jebkurai pārlūkprogrammai un visiem datoram visos blogos lietojams (bez java vai flash). Labs programmētāja darbs. Ir piestrādāts arī pie variantu apskates anotācijās un komentāros. Bezmaksas, ja negrib komerciāli pelnīt.
Šobrīd jau nopietnos šaha turnīros tiek organizēta šaha partiju attēlošana tiešsaistē, t.i. šaha galdiņi ir saistīti ar datorsistēmām. Tas turnīru organizētājiem nav lēti un šeit ir sava veida divu firmu monopols Monroi un DGT. Blogeriem piekļuve ir visai ierobežota un partijas jāsalasa no turnīru mājaslapām, vai Chessbase, vai lieliem šaha portāliem kā Chessgames. Tāda ir dzīve, par ziloni nekļūsi un nākas vien cīnīties ar mušām... Hmm, pēdējā laikā parādījies http://www.chessbomb.com, kur diezgan dzīvā režīmā var apskatīt turnīru partijas.
35 vēsturiskas šaha partijas.
Minimālā koda šaha programmas
Protams, stipra šaha programma ir visai niansēta un jebkuras tās kods ir visai ievērojams baitu ziņā. To izstrādātāji gadu no gada atrod kautko uzlabojamu un izlabojamu, tādējādi īsts projekts sanāk visai izstiepts pa gadiem un ļoti, ļoti kvalitatīvā kodā, t.i. katrs simbols ir rūpīgi pārdomāts.
Taču pastāv arī neliela sacensība nevis programmas stiprumā, bet gan tās īsumā (šedevrs-īss, liekvārdība kaitē). Protams, pirmās šaha programmas mašīnkodā var uzskatīt par īsa koda programmām, tomēr tās ir pārāk nepārskatāmas. Vislabāk tam piemērots C-kods. Vispār diezgan "matemātiski" sanāk šie dziņi. Tomēr piezīmēšu, ka viņiem raksturīgi reizēm neiespējami gājieni, muļķīgas pata situācijas, nespēja kalkulēt kombinācijas. Bet nu tā itkā darbojas un spēlē šahu.
Internetā atrodami sekojoši piemēri: Micro-Max šaha dzinis (wiki), Toledo nanochess šaha dzinis, no iepriekš minētiem: p4wn, microchess, ZX-81 in 1K.
Šaha programmu portēšana uz citām programmēšanas valodām
Protams, eksistē daudz uz citām programmēšanas valodām pārrakstītu un pielāgotu šaha programmu. Var apgalvot, ka visi šaha dziņi ir atvasināti viens no otra, tur grūti ko jaunu izdomāt. Tomēr šeit var rasties nepārvaramas grūtības, kas visu projektu iedzīs strupceļā. Kā būtiskākā ir 64-bitu atbalsts. Ja valoda neatbalsta (piem. javascript, actionscript, lua), tad algoritmā operators 1<<63 vienkārši dos kļūdainu rezultātu. Otra būtiska problēma ir atmiņas izmantošana (masīvi vs malloc). Kā trešo minēšu C++ funkciju setjmp-longjmp, kas ir tāds kā "goto". Tā parādās search iterācijās, lai burtiski "atsviestu" atpakaļ uz sākumu (vai piņķerīgi to aizvietot). Visbeidzot ātrdarbība ir ļoti būtiska. Algoritms var izrādīties par smagu miljoniem pozīciju pārlasei. No otras puses, datori kļūst jaudīgi, valodas mainās, var arī izdoties. Šeit ir piemērs 3D-Unity šaham, kur izmantoti dažādās valodās rakstīti šaha dziņi.