Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Napoleon - fenstring.cpp

fenstring.cpp

Caricato da: Crybot
Scarica il programma completo

  1. #include "fenstring.h"
  2. #include "utils.h"
  3. #include "constants.h"
  4. #include <boost/algorithm/string.hpp>
  5. #include <boost/lexical_cast.hpp>
  6. #include <vector>
  7.  
  8. namespace Napoleon
  9. {
  10.     FenString::FenString(std::string str)
  11.         :FullString(str)
  12.     {
  13.         Parse();
  14.     }
  15.  
  16.     void FenString::Parse()
  17.     {
  18.         std::vector<std::string> fields;
  19.         boost::split(fields, FullString, boost::is_any_of(" "));
  20.  
  21.         std::string piecePlacement = fields[0];
  22.         std::string sideToMove = fields[1];
  23.         std::string castling = fields[2];
  24.         std::string enPassant = fields[3];
  25.         std::string halfMove = fields[4];
  26.         std::string fullMove = fields[5];
  27.  
  28.         parsePiecePlacement(piecePlacement);
  29.         parseSideToMove(sideToMove);
  30.         parseCastling(castling);
  31.         parseEnPassant(enPassant);
  32.         parseHalfMove(halfMove);
  33.     }
  34.  
  35.     void FenString::parsePiecePlacement(std::string field)
  36.     {
  37.         for (int i=0; i<64; i++)
  38.         {
  39.             PiecePlacement[i] = Constants::Piece::Null;
  40.         }
  41.  
  42.         std::vector<std::string> ranks;
  43.         boost::split(ranks, field, boost::is_any_of("/"));
  44.  
  45.         for (unsigned i = 0; i < ranks.size(); i++)
  46.         {
  47.             int empty = 0;
  48.             for (unsigned l = 0; l < ranks[i].size(); l++)
  49.             {
  50.                 switch (ranks[i][l])
  51.                 {
  52.                 case 'P':
  53.                     PiecePlacement[Utils::Square::GetSquareIndex(l + empty, 7 - i)] = Piece(PieceColor::White, PieceType::Pawn);
  54.                     break;
  55.                 case 'p':
  56.                     PiecePlacement[Utils::Square::GetSquareIndex(l + empty, 7 - i)] = Piece(PieceColor::Black, PieceType::Pawn);
  57.                     break;
  58.                 case 'N':
  59.                     PiecePlacement[Utils::Square::GetSquareIndex(l + empty, 7 - i)] = Piece(PieceColor::White, PieceType::Knight);
  60.                     break;
  61.                 case 'n':
  62.                     PiecePlacement[Utils::Square::GetSquareIndex(l + empty, 7 - i)] = Piece(PieceColor::Black, PieceType::Knight);
  63.                     break;
  64.                 case 'B':
  65.                     PiecePlacement[Utils::Square::GetSquareIndex(l + empty, 7 - i)] = Piece(PieceColor::White, PieceType::Bishop);
  66.                     break;
  67.                 case 'b':
  68.                     PiecePlacement[Utils::Square::GetSquareIndex(l + empty, 7 - i)] = Piece(PieceColor::Black, PieceType::Bishop);
  69.                     break;
  70.                 case 'R':
  71.                     PiecePlacement[Utils::Square::GetSquareIndex(l + empty, 7 - i)] = Piece(PieceColor::White, PieceType::Rook);
  72.                     break;
  73.                 case 'r':
  74.                     PiecePlacement[Utils::Square::GetSquareIndex(l + empty, 7 - i)] = Piece(PieceColor::Black, PieceType::Rook);
  75.                     break;
  76.                 case 'Q':
  77.                     PiecePlacement[Utils::Square::GetSquareIndex(l + empty, 7 - i)] = Piece(PieceColor::White, PieceType::Queen);
  78.                     break;
  79.                 case 'q':
  80.                     PiecePlacement[Utils::Square::GetSquareIndex(l + empty, 7 - i)] = Piece(PieceColor::Black, PieceType::Queen);
  81.                     break;
  82.                 case 'K':
  83.                     PiecePlacement[Utils::Square::GetSquareIndex(l + empty, 7 - i)] = Piece(PieceColor::White, PieceType::King);
  84.                     break;
  85.                 case 'k':
  86.                     PiecePlacement[Utils::Square::GetSquareIndex(l + empty, 7 - i)] = Piece(PieceColor::Black, PieceType::King);
  87.                     break;
  88.                 default:
  89.                     empty += (boost::lexical_cast<int>(ranks[i][l]) - 1);
  90.                     break;
  91.                 }
  92.             }
  93.         }
  94.  
  95.         return;
  96.     }
  97.  
  98.     void FenString::parseSideToMove(std::string field)
  99.     {
  100.         switch (field[0])
  101.         {
  102.         case 'w':
  103.             SideToMove = PieceColor::White;
  104.             break;
  105.         case 'b':
  106.             SideToMove = PieceColor::Black;
  107.             break;
  108.         }
  109.     }
  110.  
  111.     void FenString::parseCastling(std::string field)
  112.     {
  113.         CanWhiteShortCastle = false;
  114.         CanWhiteLongCastle = false;
  115.         CanBlackShortCastle = false;
  116.         CanBlackLongCastle = false;
  117.  
  118.         for (unsigned i = 0; i < field.size(); i++)
  119.         {
  120.             switch (field[i])
  121.             {
  122.             case 'K':
  123.                 CanWhiteShortCastle = true;
  124.                 break;
  125.             case 'k':
  126.                 CanBlackShortCastle = true;
  127.                 break;
  128.             case 'Q':
  129.                 CanWhiteLongCastle = true;
  130.                 break;
  131.             case 'q':
  132.                 CanBlackLongCastle = true;
  133.                 break;
  134.             }
  135.         }
  136.     }
  137.  
  138.     void FenString::parseEnPassant(std::string field)
  139.     {
  140.         if (field.size() == 1)
  141.         {
  142.             if (field[0] == '-')
  143.                 EnPassantSquare = Constants::Squares::Invalid;
  144.         }
  145.         else
  146.         {
  147.             EnPassantSquare = Utils::Square::Parse(field);
  148.         }
  149.     }
  150.  
  151.     void FenString::parseHalfMove(std::string field)
  152.     {
  153.         HalfMove = boost::lexical_cast<int>(field);
  154.     }
  155. }