Beispiel #1
0
 private final synchronized void initInternalBook() {
   if (numBookMoves >= 0) return;
   //        long t0 = System.currentTimeMillis();
   bookMap = new HashMap<Long, List<BookEntry>>();
   numBookMoves = 0;
   try {
     InputStream inStream = getClass().getResourceAsStream("/book.bin");
     if (inStream == null) throw new IOException();
     List<Byte> buf = new ArrayList<Byte>(8192);
     byte[] tmpBuf = new byte[1024];
     while (true) {
       int len = inStream.read(tmpBuf);
       if (len <= 0) break;
       for (int i = 0; i < len; i++) buf.add(tmpBuf[i]);
     }
     inStream.close();
     Position startPos = TextIO.readFEN(TextIO.startPosFEN);
     Position pos = new Position(startPos);
     UndoInfo ui = new UndoInfo();
     int len = buf.size();
     for (int i = 0; i < len; i += 2) {
       int b0 = buf.get(i);
       if (b0 < 0) b0 += 256;
       int b1 = buf.get(i + 1);
       if (b1 < 0) b1 += 256;
       int move = (b0 << 8) + b1;
       if (move == 0) {
         pos = new Position(startPos);
       } else {
         boolean bad = ((move >> 15) & 1) != 0;
         int prom = (move >> 12) & 7;
         Move m = new Move(move & 63, (move >> 6) & 63, promToPiece(prom, pos.whiteMove));
         if (!bad) addToBook(pos, m);
         pos.makeMove(m, ui);
       }
     }
   } catch (ChessParseError ex) {
     throw new RuntimeException();
   } catch (IOException ex) {
     System.out.println("Can't read opening book resource");
     throw new RuntimeException();
   }
   /*        {
       long t1 = System.currentTimeMillis();
       System.out.printf("Book moves:%d (parse time:%.3f)%n", numBookMoves,
               (t1 - t0) / 1000.0);
   } */
 }