Spela schack | Om dataschack | Koda spelbräda | Öppningsspel | Evalueringsfunktion | Draggenerator | Minimax & Alfabeta-reducering | Dragsortering | Slutspel | Schackregler | Javascript | Länkar/referenser

header
Öppningsspelet
Motiv
Alla schackprogram har någon typ av specialbibliotek för det inledande spelet, det är de första dragen på spelbrädan. En synpunkt som kan finnas på detta är att det är fusk. Tanken är väl att datorn, eller programmet beroende på hur man ser på det, skall räkna ut det bästa draget - inte slå upp det i en tabell?

Vad det handlar om är bara de första dragen. Rent filosofiskt, när en människa spelar schack, så använder människor också öppningsbibliotek. De första dragen präglas inte av någon taktik eller strategi utan är ett val utifrån andra aspekter. Kanske utifrån en känsla eller värdering av motståndaren på ett psykologiskt plan - i bästa fall. Oavsett vilket är de första dragen inlärda drag från kända schackpartier. Först några drag in i matchen divergerar spelplanen så mycket att man kan börja tala om strategi.

Att därför låta en schackdator använda ett mindre bibliotek inledningsvis är inget kontroversiellt. Det leder datorn in i partiet på ett civilicerat sätt.

Alternativet, att direkt låta datorn söka efter ett drag, resulterar inte i något vettigt då datorn inte kan se så långt fram att det finns något att göra beräkningar på. Det blir mest irr-drag som präglas av slump.

I detta fall skall jag göra en väldigt enkel funktion för inledningsspelet. Jag föreställer mig att det 1-3 första dragen ligger i detta väldigt minimalistiska öppningsbibliotek. Jag skall dock försöka designa koden så att det går att bygga ut med ett större bibliotek ifall det är önskvärt i framtiden.

Källa - Vilka drag?
För att ha något att börja med så kommer jag använda informationen i wikipedia om schacköppningar. Jag har ingen speciell kunskap för att värdera dessa olika drag. Anser du dig ha kunskap om förbättringar i detta delprojekt får du gärna komma med praktiska tips.

Kod
Nedanstående kod är skriven för att vara enkel att uppdatera för vem som helst. Vad nextMoveLoopup gör är att läsa de senaste dragen från stacken och komponera det format som ligger i openStr. Därefter görs en enkel strängjämförelse och matchar inledningen och det finns en fortsättning hämtas denna.

// Inledningsspelet (1-3 första dragen) 
// följer kända partier om möjligt
//
//
var openStr = new Array(

   // open games
   "e2e4e7e5", "Standardöppning",
   "e2e4e7e5g1f3b8c6f1b5", "Ruy Lopez",
   "e2e4e7e5g1f3b8c6c2c3", "Ponziani",
   "e2e4e7e5g1f3b8c6d2d4", "Scotch Game",
   "e2e4e7e5g1f3b8c6f1c4", "Italiensk öppning", 
   "e2e4e7e5g1f3b8c6f1c4c7c5", "Giuoco Piano",
   "e2e4e7e5g1f3b8c6f1c4c7c5b2b4", "William Davies Evans",
   "e2e4e7e5g1f3b8c6f1c4g8f6", "Två hästar",
   "e2e4e7e5g1f3b8c6f1c4f8e7", "Ungerskt försvar",
   "e2e4e7e5g1f3b8c6b1c3g8f6", "Fyra hästar",

   // semi-open games
   "e2e4d7d6d2d4g8f6b1c3g7g6","Pirc försvar", 

   // closed games
   "d2d4d7d5b1c3g8f6c1g5", "Richter-Veresov Attack",

   // indiska system
   "d2d4g8f6c2c4d7d6", "Gammalt indiskt försvar",
   "d2d4g8f6c2c4e7e5", "Budapest försvar",
   "d2d4g8f6c2c4e7e6g1f3f8b4", "Bogo-indiskt försvar",

   // övrigt
   "d2d4e7e6c2c4b7b6", "Engelskt försvar"

)

// Returnerar -1 om drag saknas
// dessutom sätts bestMoveFrom, bestMoveTo, bestMoveWho
//
function nextMoveLoopup(m)
{
   lstr="hgfedcba";
   dstr="87654321";
   tl="";
   for (i=0;i<stackPointer;i++)
   {
      tl=tl+num2Note(stackFrom[i])+num2Note(stackTo[i]);   
   }
   for (var i=0;i<openStr.length;i+=2)
   {
      ol=openStr[i];
      bestMoveWho="";
      if (ol.substr(0,tl.length)==tl)
      {
         if (ol.length>tl.length)
         {
            nmf=ol.substr(tl.length,2);
            nmt=ol.substr(tl.length+2,2);
            bestMoveFrom=lstr.indexOf(nmf.charAt(0))+
                          (dstr.indexOf(nmf.charAt(1)))*8;
            bestMoveTo  =lstr.indexOf(nmt.charAt(0))+
                          (dstr.indexOf(nmt.charAt(1)))*8;
            bestMoveWho=openStr[i+1];
            setText("kommentar",bestMoveWho);
            break;
         }
      }
   }
   return (bestMoveWho!="");
}