package com.rahul.numboard; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.ObjectOutputStream; import java.util.ArrayList; import com.rahul.stockfish.Stockfish; public class NumBoard { public static final int BOARD_SIZE = 64; private static final int EmptySquare = 0; private static final int WRook = 2; private static final int WBishop = 3; private static final int WPawn = 5; private static final int WKnight = 7; private static final int WKing = 11; private static final int WQueen = 13; private static final int BRook = 17; private static final int BBishop = 19; private static final int BPawn = 23; private static final int BKnight = 29; private static final int BKing = 31; private static final int BQueen = 37; // private static final int BRook = -2; // private static final int BBishop = -3; // private static final int BPawn = -5; // private static final int BKnight = -7; // private static final int BKing = -11; // private static final int BQueen = -13; private double[] board; private double evalScore; private Stockfish stockfish; private int turnChecker; private ArrayList<RowData> data; private ObjectOutputStream oos; public NumBoard() { data = new ArrayList<RowData>(); stockfish = new Stockfish(); turnChecker = -1; } /** * scorePresent : Pass true if evaluation scores are present in the input * file. False otherwise. linesToRead : Number of lines to read or -1 for * reading the whole file */ public void buildBoards(boolean scorePresent, int linesToRead) { try { BufferedReader br = new BufferedReader(new FileReader(new File( "./data/game4.log"))); String fen; int linesRead = 0; if (linesToRead == -1) linesToRead = Integer.MAX_VALUE; if (!scorePresent) stockfish.startEngine(); while ((fen = br.readLine()) != null && linesRead++ < linesToRead) { createBoard(fen, scorePresent); turnChecker *= -1; createRow(); } if (!scorePresent) stockfish.stopEngine(); br.close(); printBoards(); storeData(); } catch (Exception e) { e.printStackTrace(); } } private void printBoards() { for (RowData row : data) System.out.println(row); } private void createRow() { double[] expectedOutput = { evalScore }; data.add(new RowData(board, expectedOutput)); } private void createBoard(String fen, boolean scorePresent) { board = new double[BOARD_SIZE]; int index = 0; char[] fenChars = fen.toCharArray(); for (int i = 0; i < fenChars.length && index < BOARD_SIZE; i++) { switch (fenChars[i]) { case 'R': board[index++] = WRook; break; case 'N': board[index++] = WKnight; break; case 'B': board[index++] = WBishop; break; case 'P': board[index++] = WPawn; break; case 'K': board[index++] = WKing; break; case 'Q': board[index++] = WQueen; break; case 'r': board[index++] = BRook; break; case 'n': board[index++] = BKnight; break; case 'b': board[index++] = BBishop; break; case 'p': board[index++] = BPawn; break; case 'k': board[index++] = BKing; break; case 'q': board[index++] = BQueen; break; case '/': break; default: int emptySquares = (int) fenChars[i] - 48; while (emptySquares-- != 0) board[index++] = EmptySquare; } } try { if (scorePresent) { evalScore = Integer.parseInt(fen.split("\\[")[1].split("]")[0]) / 100.0f; } else { evalScore = turnChecker * stockfish.getEvalScore(fen, 2000); } } catch (Exception e) { evalScore = 0; return; } } private void storeData() { try { oos = new ObjectOutputStream(new FileOutputStream(new File( "./data/numboards_game4.bb"))); oos.writeObject(data); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { NumBoard generator = new NumBoard(); generator.buildBoards(false, -1); } }