Beispiel #1
0
void Board8x8::generateMoves(
    std::list<uint> & indexList,
    uint row,
    uint col,
    MoveList & moveList,
    bool isSlider)
{
  for (std::list<uint>::iterator itr = indexList.begin(); itr != indexList.end(); ++itr) {
    uint destIndex(*itr);
    uint destRow = destIndex >> 3;
    uint destCol = destIndex & 7;

    PieceType otherPiece = mPieceType[destIndex];

    if (otherPiece != NoPiece) {
      if ( (mWhiteToMove && isBlackPiece(otherPiece)) || (!mWhiteToMove && isWhitePiece(otherPiece)) ) {
        Move newMove(row, col, destRow, destCol, otherPiece);
        moveList.addMove(newMove);
      }

      if (isSlider)
        break;
    }
    else {
      Move newMove(row, col, destRow, destCol);
      moveList.addMove(newMove);
    }
  }
}
Beispiel #2
0
bool ChessBoard::isFiveInARow(size_t row,size_t col)
{
    if(!isLocatedPiece(row,col)){return false;}


    int counter=1;
    for(size_t i=row+1;i<rowgridnum;i++)//向下
    {
        if(isLocatedPiece(i,col))
        {
            if(isBlackPiece(row,col)==isBlackPiece(i,col))
            {counter++;}
            else{break;}
        }
        else{break;}
    }
    for(int i=row-1;i>=0;i--)//向上
    {
        if(isLocatedPiece(i,col))
        {
            if(isBlackPiece(row,col)==isBlackPiece(i,col))
            {counter++;}
            else{break;}
        }
        else{break;}
    }
    if(counter>=5){return true;}
    //判断纵向

    counter=1;
    for(size_t i=col+1;i<rowgridnum;i++)//向右
    {
        if(isLocatedPiece(row,i))
        {
            if(isBlackPiece(row,col)==isBlackPiece(row,i))
            {counter++;}
            else{break;}
        }
        else{break;}
    }
    for(int i=col-1;i>=0;i--)//向左
    {
        if(isLocatedPiece(row,i))
        {
            if(isBlackPiece(row,col)==isBlackPiece(row,i))
            {counter++;}
            else{break;}
        }
        else{break;}
    }
    if(counter>=5){return true;}
    //判断横向

    counter=1;
    for(size_t i=row+1,j=col+1;i<rowgridnum&&j<rowgridnum;i++,j++)
    {
        if(isLocatedPiece(i,j))
        {
            if(isBlackPiece(row,col)==isBlackPiece(i,j))
            {counter++;}
            else{break;}
        }
        else{break;}
    }
    for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--)
    {
        if(isLocatedPiece(i,j))
        {
            if(isBlackPiece(row,col)==isBlackPiece(i,j))
            {counter++;}
            else{break;}
        }
        else{break;}
    }
    if(counter>=5){return true;}
    //判断斜下

    counter=1;
    for(int i=row-1,j=col+1;i>=0&&j<rowgridnum;i--,j++)
    {
        if(isLocatedPiece(i,j))
        {
            if(isBlackPiece(row,col)==isBlackPiece(i,j))
            {counter++;}
            else{break;}
        }
        else{break;}
    }
    for(int i=row+1,j=col-1;i<rowgridnum&&j>=0;i++,j--)
    {
        if(isLocatedPiece(i,j))
        {
            if(isBlackPiece(row,col)==isBlackPiece(i,j))
            {counter++;}
            else{break;}
        }
        else{break;}
    }
    if(counter>=5){return true;}
    //判断斜上


    return false;
}
Beispiel #3
0
void Board8x8::generateWhitePawnMoves(uint row, uint col, MoveList & moveList)
{
  static const PieceType promotedPieceTypes[] =
  { WhiteQueen, WhiteRook, WhiteBishop, WhiteKnight };

  uint sourceIndex = getIndex(row, col);
  std::list<uint> & listMoves = mWhitePawnMoves[sourceIndex];
  for (std::list<uint>::iterator itr = listMoves.begin(); itr != listMoves.end(); ++itr)
  {
    uint destIndex(*itr);
    uint destRow = destIndex >> 3;
    uint destCol = destIndex & 7;

    if (row == 6) {
      if (col == destCol) {
        if (mPieceType[(row+1)*8+col] == NoPiece) {
          for (int i = 0; i < 4; i++) {
            Move promoMove(row, col, destRow, destCol, NoPiece, promotedPieceTypes[i]);
            moveList.addMove(promoMove);
          }
        }
      }
      else {
        PieceType otherPiece = mPieceType[destIndex];
        if (isPiece(otherPiece) && isBlackPiece(otherPiece)) {
          for (int i = 0; i < 4; i++) {
            Move promoMove(row, col, destRow, destCol, otherPiece, promotedPieceTypes[i]);
            moveList.addMove(promoMove);
          }
        }
      }
    }
    else {
      if (col == destCol) {
        bool doublePush = false;
        bool singlePush = mPieceType[(row+1)*8+col] == NoPiece;
        if (singlePush)
          doublePush = mPieceType[(row+2)*8+col] == NoPiece;

        if ( (destRow-row) == 1 && singlePush) {
          Move newMove(row, col, destRow, destCol);
          moveList.addMove(newMove);
        }

        if ( (destRow-row) == 2 && doublePush) {
          Move newMove(row, col, destRow, destCol);
          newMove.setDoublePawnPush();
          moveList.addMove(newMove);
        }
      }
      else {
        PieceType otherPiece = mPieceType[destIndex];
        if (isPiece(otherPiece) && isBlackPiece(otherPiece)) {
          Move newMove(row, col, destRow, destCol, otherPiece);
          moveList.addMove(newMove);
        }
      }
    }
  }

  // Check en-passant
  if (mWhiteEnPassant && row == 4) {
    if (col != 7) {
      PieceType pieceType = getPieceType(row, col+1);
      if (mEnPassantCaptureCol == col + 1 && pieceType == BlackPawn) {
        Move newMove(row, col, row+1, col+1, BlackPawn);
        newMove.setEnPassant();
        moveList.addMove(newMove);
      }
    }

    if (col != 0) {
      PieceType pieceType = getPieceType(row, col-1);
      if (mEnPassantCaptureCol == col - 1 && pieceType == BlackPawn)  {
        Move newMove(row, col, row+1, col-1, BlackPawn);
        newMove.setEnPassant();
        moveList.addMove(newMove);
      }
    }
  }
}