Home Previous Bottom Next

Writing a chess program in 99 steps


 
step 40: makemove.cpp

#include <iostream>
#include "defines.h"
#include "protos.h"
#include "extglobals.h"
#include "move.h"
 
#ifdef WINGLET_DEBUG_MOVES
       void debugMoves(char *, Move &);
#endif
 
void makeMove(Move &move)
{
       unsigned int from = move.getFrom();
       unsigned int to = move.getTosq();
       unsigned int piece = move.getPiec();
       unsigned int captured = move.getCapt();
 
       BitMap fromBitMap  = BITSET[from];
       BitMap fromToBitMap = fromBitMap  | BITSET[to];
 
       board.gameLine[board.endOfSearch].move.moveInt = move.moveInt;
       board.gameLine[board.endOfSearch].castleWhite  = board.castleWhite;
       board.gameLine[board.endOfSearch].castleBlack  = board.castleBlack;
       board.gameLine[board.endOfSearch].fiftyMove    = board.fiftyMove;
       board.gameLine[board.endOfSearch].epSquare     = board.epSquare;
       board.endOfSearch++;
 
       switch (piece)
       {
              case 1: // white pawn:
                     board.whitePawns           ^= fromToBitMap;
                     board.whitePieces          ^= fromToBitMap;
                     board.square[from]        = EMPTY;
                     board.square[to]          = WHITE_PAWN;
                     board.epSquare            = 0;
                     board.fiftyMove           = 0;
                     if (RANKS[from] == 2)
                           if (RANKS[to] == 4) board.epSquare = from + 8;
                     if (captured)
                     {
                           if (move.isEnpassant())
                           {
                                  board.blackPawns           ^= BITSET[to-8];
                                  board.blackPieces          ^= BITSET[to-8];
                                  board.occupiedSquares    ^= fromToBitMap | BITSET[to-8];
                                  board.square[to-8]       = EMPTY;
                                  board.Material           += PAWN_VALUE;
                           }
                           else
                           {
                                  makeCapture(captured, to);
                                  board.occupiedSquares ^= fromBitMap;
                           }
                     }
                     else board.occupiedSquares ^= fromToBitMap;
 
                     if (move.isPromotion())
                     {
                           makeWhitePromotion(move.getProm(), to);
                           board.square[to]         = move.getProm();
                     }
                     break;
 
              case 2: // white king:
                     board.whiteKing             ^= fromToBitMap;
                     board.whitePieces          ^= fromToBitMap;
                     board.square[from]        = EMPTY;
                     board.square[to]          = WHITE_KING;
                     board.epSquare            = 0;    
                     board.fiftyMove++;
                     board.castleWhite = 0;
                     if (captured)
                     {
                           makeCapture(captured, to);
                           board.occupiedSquares ^= fromBitMap;
                     }
                     else board.occupiedSquares ^= fromToBitMap;
 
                     if (move.isCastle())
                     {
                           if (move.isCastleOO())
                           {
                                  board.whiteRooks         ^= BITSET[H1] | BITSET[F1];
                                  board.whitePieces          ^= BITSET[H1] | BITSET[F1];
                                  board.occupiedSquares    ^= BITSET[H1] | BITSET[F1];
                                  board.square[H1]          = EMPTY;
                                  board.square[F1]          = WHITE_ROOK;
                           }
                           else
                           {
                                  board.whiteRooks         ^= BITSET[A1] | BITSET[D1];
                                  board.whitePieces          ^= BITSET[A1] | BITSET[D1];
                                  board.occupiedSquares    ^= BITSET[A1] | BITSET[D1];
                                  board.square[A1]          = EMPTY;
                                  board.square[D1]          = WHITE_ROOK;
                           }
                     }
                     break;
 
              case 3: // white knight:
                     board.whiteKnights         ^= fromToBitMap;
                     board.whitePieces          ^= fromToBitMap;
                     board.square[from]        = EMPTY;
                     board.square[to]          = WHITE_KNIGHT;
                     board.epSquare            = 0;    
                     board.fiftyMove++;
                     if (captured)
                     {
                           makeCapture(captured, to);
                           board.occupiedSquares ^= fromBitMap;
                     }
                     else board.occupiedSquares ^= fromToBitMap;
                     break;
 
              case 5: // white bishop:
                     board.whiteBishops         ^= fromToBitMap;
                     board.whitePieces          ^= fromToBitMap;
                     board.square[from]        = EMPTY;
                     board.square[to]          = WHITE_BISHOP;
                     board.epSquare            = 0;
                     board.fiftyMove++;
                     if (captured)
                     {
                           makeCapture(captured, to);
                           board.occupiedSquares ^= fromBitMap;
                     }
                     else board.occupiedSquares ^= fromToBitMap;
                     break;
 
              case 6: // white rook:
                     board.whiteRooks         ^= fromToBitMap;
                     board.whitePieces          ^= fromToBitMap;
                     board.square[from]        = EMPTY;
                     board.square[to]          = WHITE_ROOK;
                     board.epSquare            = 0;    
                     board.fiftyMove++;
                     if (from == A1) board.castleWhite &= ~CANCASTLEOOO;
                     if (from == H1) board.castleWhite &= ~CANCASTLEOO;
                     if (captured)
                     {
                           makeCapture(captured, to);
                           board.occupiedSquares ^= fromBitMap;
                     }
                     else board.occupiedSquares ^= fromToBitMap;
                     break;
 
              case 7: // white queen:
                     board.whiteQueens          ^= fromToBitMap;
                     board.whitePieces          ^= fromToBitMap;
                     board.square[from]        = EMPTY;
                     board.square[to]          = WHITE_QUEEN;
                     board.epSquare            = 0;    
                     board.fiftyMove++;
                     if (captured)
                     {
                           makeCapture(captured, to);
                           board.occupiedSquares ^= fromBitMap;
                     }
                     else board.occupiedSquares ^= fromToBitMap;
                     break;
 
              case 9: // black pawn:
                     board.blackPawns           ^= fromToBitMap;
                     board.blackPieces          ^= fromToBitMap;
                     board.square[from]        = EMPTY;
                     board.square[to]          = BLACK_PAWN;
                     board.epSquare            = 0;
                     board.fiftyMove = 0;
                     if (RANKS[from] == 7)
                           if (RANKS[to] == 5) board.epSquare = from - 8;
                     if (captured)
                     {
                           if (move.isEnpassant())
                           {
                                  board.whitePawns           ^= BITSET[to+8];
                                  board.whitePieces          ^= BITSET[to+8];
                                  board.occupiedSquares    ^= fromToBitMap | BITSET[to+8];
                                  board.square[to+8]       = EMPTY;
                                  board.Material           -= PAWN_VALUE;
                           }
                           else
                           {
                                  makeCapture(captured, to);
                                  board.occupiedSquares ^= fromBitMap;
                           }
                     }
                     else board.occupiedSquares ^= fromToBitMap;
 
                     if (move.isPromotion())
                     {
                           makeBlackPromotion(move.getProm(), to);
                           board.square[to]         = move.getProm();
                     }
                     break;
 
              case 10: // black king:
                     board.blackKing             ^= fromToBitMap;
                     board.blackPieces          ^= fromToBitMap;
                     board.square[from]        = EMPTY;
                     board.square[to]          = BLACK_KING;
                     board.epSquare            = 0;    
                     board.fiftyMove++;
                     board.castleBlack = 0;
                     if (captured)
                     {
                           makeCapture(captured, to);
                           board.occupiedSquares ^= fromBitMap;
                     }
                     else board.occupiedSquares ^= fromToBitMap;
 
                     if (move.isCastle())
                     {
                           if (move.isCastleOO())
                           {
                                  board.blackRooks         ^= BITSET[H8] | BITSET[F8];
                                  board.blackPieces          ^= BITSET[H8] | BITSET[F8];
                                  board.occupiedSquares    ^= BITSET[H8] | BITSET[F8];
                                  board.square[H8]          = EMPTY;
                                  board.square[F8]          = BLACK_ROOK;
                            }
                           else
                           {
                                  board.blackRooks         ^= BITSET[A8] | BITSET[D8];
                                  board.blackPieces          ^= BITSET[A8] | BITSET[D8];
                                  board.occupiedSquares    ^= BITSET[A8] | BITSET[D8];
                                  board.square[A8]          = EMPTY;
                                  board.square[D8]          = BLACK_ROOK;
                           }
                     }
                     break;
 
              case 11: // black knight:
                     board.blackKnights         ^= fromToBitMap;
                     board.blackPieces          ^= fromToBitMap;
                     board.square[from]        = EMPTY;
                     board.square[to]          = BLACK_KNIGHT;
                     board.epSquare            = 0;    
                     board.fiftyMove++;
                     if (captured)
                     {
                           makeCapture(captured, to);
                           board.occupiedSquares ^= fromBitMap;
                     }
                     else board.occupiedSquares ^= fromToBitMap;
                     break;
 
              case 13: // black bishop:
                     board.blackBishops         ^= fromToBitMap;
                     board.blackPieces          ^= fromToBitMap;
                     board.square[from]        = EMPTY;
                     board.square[to]          = BLACK_BISHOP;
                     board.epSquare            = 0;
                     board.fiftyMove++;
                     if (captured)
                     {
                           makeCapture(captured, to);
                           board.occupiedSquares ^= fromBitMap;
                     }
                     else board.occupiedSquares ^= fromToBitMap;
                     break;
 
              case 14: // black rook:
                     board.blackRooks         ^= fromToBitMap;
                     board.blackPieces          ^= fromToBitMap;
                     board.square[from]        = EMPTY;
                     board.square[to]          = BLACK_ROOK;
                     board.epSquare            = 0;    
                     board.fiftyMove++;
                     if (from == A8) board.castleBlack &= ~CANCASTLEOOO;
                     if (from == H8) board.castleBlack &= ~CANCASTLEOO;
                     if (captured)
                     {
                           makeCapture(captured, to);
                           board.occupiedSquares ^= fromBitMap;
                     }
                     else board.occupiedSquares ^= fromToBitMap;
                     break;
 
              case 15: // black queen:
                     board.blackQueens          ^= fromToBitMap;
                     board.blackPieces          ^= fromToBitMap;
                     board.square[from]        = EMPTY;
                     board.square[to]          = BLACK_QUEEN;
                     board.epSquare            = 0;    
                     board.fiftyMove++;
                     if (captured)
                     {
                           makeCapture(captured, to);
                           board.occupiedSquares ^= fromBitMap;
                     }
                     else board.occupiedSquares ^= fromToBitMap;
                     break;
       }
       board.nextMove = !board.nextMove;
 
#ifdef WINGLET_DEBUG_MOVES
       debugMoves("makemove", move);
#endif
 
}
 
void unmakeMove(Move &move)
{
       unsigned int piece = move.getPiec();
       unsigned int captured = move.getCapt();
       unsigned int from = move.getFrom();
       unsigned int to = move.getTosq();
 
       BitMap fromBitMap  = BITSET[from];
       BitMap fromToBitMap = fromBitMap  | BITSET[to];
 
       switch (piece)
       {
              case 1: // white pawn:
                     board.whitePawns           ^= fromToBitMap;
                     board.whitePieces          ^= fromToBitMap;
                     board.square[from]        = WHITE_PAWN;
                     board.square[to]          = EMPTY;
                     if (captured)
                     {
                           if (move.isEnpassant())
                           {
                                  board.blackPawns           ^= BITSET[to-8];
                                  board.blackPieces          ^= BITSET[to-8];
                             board.occupiedSquares    ^= fromToBitMap | BITSET[to-8];
                                  board.square[to-8]        = BLACK_PAWN;
                                  board.Material           -= PAWN_VALUE;
                           }
                           else
                           {
                                  unmakeCapture(captured, to);
                                  board.occupiedSquares ^= fromBitMap;
                           }
                     }
                     else board.occupiedSquares ^= fromToBitMap;
 
                     if (move.isPromotion())
                     {
                           unmakeWhitePromotion(move.getProm(), to);
                     }
                     break;
 
              case 2: // white king:
                     board.whiteKing             ^= fromToBitMap;
                     board.whitePieces          ^= fromToBitMap;
                     board.square[from]        = WHITE_KING;
                     board.square[to]          = EMPTY;
                     if (captured)
                     {
                           unmakeCapture(captured, to);
                           board.occupiedSquares ^= fromBitMap;
                     }
                     else board.occupiedSquares ^= fromToBitMap;
 
                     if (move.isCastle())
                     {
                           if (move.isCastleOO())
                           {
                                  board.whiteRooks         ^= BITSET[H1] | BITSET[F1];
                                  board.whitePieces          ^= BITSET[H1] | BITSET[F1];
                                  board.occupiedSquares    ^= BITSET[H1] | BITSET[F1];
                                  board.square[H1]          = WHITE_ROOK;
                                  board.square[F1]          = EMPTY;
                           }
                           else
                           {
                                  board.whiteRooks         ^= BITSET[A1] | BITSET[D1];
                                  board.whitePieces          ^= BITSET[A1] | BITSET[D1];
                                  board.occupiedSquares    ^= BITSET[A1] | BITSET[D1];
                                  board.square[A1]          = WHITE_ROOK;
                                  board.square[D1]          = EMPTY;
                           }
                     }
                     break;
 
              case 3: // white knight:
                     board.whiteKnights         ^= fromToBitMap;
                     board.whitePieces          ^= fromToBitMap;
                     board.square[from]        = WHITE_KNIGHT;
                     board.square[to]          = EMPTY;
                     if (captured)
                     {
                           unmakeCapture(captured, to);
                           board.occupiedSquares ^= fromBitMap;
                     }
                     else board.occupiedSquares ^= fromToBitMap;
                     break;
 
              case 5: // white bishop:
                     board.whiteBishops         ^= fromToBitMap;
                     board.whitePieces          ^= fromToBitMap;
                     board.square[from]        = WHITE_BISHOP;
                     board.square[to]          = EMPTY;
                     if (captured)
                     {
                           unmakeCapture(captured, to);
                           board.occupiedSquares ^= fromBitMap;
                     }
                     else board.occupiedSquares ^= fromToBitMap;
 
                     break;
 
              case 6: // white rook:
                     board.whiteRooks         ^= fromToBitMap;
                     board.whitePieces          ^= fromToBitMap;
                     board.square[from]        = WHITE_ROOK;
                     board.square[to]          = EMPTY;
                     if (captured)
                     {
                           unmakeCapture(captured, to);
                           board.occupiedSquares ^= fromBitMap;
                     }
                     else board.occupiedSquares ^= fromToBitMap;
                     break;
 
              case 7: // white queen:
                     board.whiteQueens          ^= fromToBitMap;
                     board.whitePieces          ^= fromToBitMap;
                     board.square[from]        = WHITE_QUEEN;
                     board.square[to]          = EMPTY;
                     if (captured)
                     {
                           unmakeCapture(captured, to);
                           board.occupiedSquares ^= fromBitMap;
                     }
                     else board.occupiedSquares ^= fromToBitMap;
                     break;
 
              case 9: // black pawn:
                     board.blackPawns           ^= fromToBitMap;
                     board.blackPieces          ^= fromToBitMap;
                     board.square[from]        = BLACK_PAWN;
                     board.square[to]          = EMPTY;
                     if (captured)
                     {
                           if (move.isEnpassant())
                           {
                                  board.whitePawns           ^= BITSET[to+8];
                                  board.whitePieces          ^= BITSET[to+8];
                                  board.occupiedSquares    ^= fromToBitMap | BITSET[to+8];
                                  board.square[to+8]        = WHITE_PAWN;
                                  board.Material           += PAWN_VALUE;
                           }
                           else
                           {
                                  unmakeCapture(captured, to);
                                  board.occupiedSquares ^= fromBitMap;
                           }
                     }
                     else board.occupiedSquares ^= fromToBitMap;
 
                     if (move.isPromotion())
                     {
                           unmakeBlackPromotion(move.getProm(), to);
                     }
                     break;
 
              case 10: // black king:
                     board.blackKing             ^= fromToBitMap;
                     board.blackPieces          ^= fromToBitMap;
                     board.square[from]        = BLACK_KING;
                     board.square[to]          = EMPTY;
                     if (captured)
                     {
                           unmakeCapture(captured, to);
                           board.occupiedSquares ^= fromBitMap;
                     }
                     else board.occupiedSquares ^= fromToBitMap;
 
                     if (move.isCastle())
                     {
                           if (move.isCastleOO())
                           {
                                  board.blackRooks         ^= BITSET[H8] | BITSET[F8];
                                  board.blackPieces          ^= BITSET[H8] | BITSET[F8];
                                  board.occupiedSquares    ^= BITSET[H8] | BITSET[F8];
                                  board.square[H8]          = BLACK_ROOK;
                                  board.square[F8]          = EMPTY;
                           }
                           else
                           {
                                  board.blackRooks         ^= BITSET[A8] | BITSET[D8];
                                  board.blackPieces          ^= BITSET[A8] | BITSET[D8];
                                  board.occupiedSquares    ^= BITSET[A8] | BITSET[D8];
                                  board.square[A8]          = BLACK_ROOK;
                                  board.square[D8]          = EMPTY;
                           }
                     }
                     break;
 
              case 11: // black knight:
                     board.blackKnights         ^= fromToBitMap;
                     board.blackPieces          ^= fromToBitMap;
                     board.square[from]        = BLACK_KNIGHT;
                     board.square[to]          = EMPTY;
                     if (captured)
                     {
                           unmakeCapture(captured, to);
                           board.occupiedSquares ^= fromBitMap;
                     }
                     else board.occupiedSquares ^= fromToBitMap;                  
                     break;
 
              case 13: // black bishop:
                     board.blackBishops         ^= fromToBitMap;
                     board.blackPieces          ^= fromToBitMap;
                     board.square[from]        = BLACK_BISHOP;
                     board.square[to]          = EMPTY;
                     if (captured)
                     {
                           unmakeCapture(captured, to);
                           board.occupiedSquares ^= fromBitMap;
                     }
                     else board.occupiedSquares ^= fromToBitMap;                  
                     break;
 
              case 14: // black rook:
                     board.blackRooks         ^= fromToBitMap;
                     board.blackPieces          ^= fromToBitMap;
                     board.square[from]        = BLACK_ROOK;
                     board.square[to]          = EMPTY;
                     if (captured)
                     {
                           unmakeCapture(captured, to);
                           board.occupiedSquares ^= fromBitMap;
                     }
                     else board.occupiedSquares ^= fromToBitMap;                  
                     break;
 
              case 15: // black queen:
                     board.blackQueens          ^= fromToBitMap;
                     board.blackPieces          ^= fromToBitMap;
                     board.square[from]        = BLACK_QUEEN;
                     board.square[to]          = EMPTY;
                     if (captured)
                     {
                           unmakeCapture(captured, to);
                           board.occupiedSquares ^= fromBitMap;
                     }
                     else board.occupiedSquares ^= fromToBitMap;                  
                     break;
       }
 
       board.endOfSearch--;
       board.castleWhite         = board.gameLine[board.endOfSearch].castleWhite;
       board.castleBlack         = board.gameLine[board.endOfSearch].castleBlack;
       board.epSquare            = board.gameLine[board.endOfSearch].epSquare;
       board.fiftyMove           = board.gameLine[board.endOfSearch].fiftyMove;
 
       board.nextMove = !board.nextMove;
 
#ifdef WINGLET_DEBUG_MOVES
       debugMoves("unmakemove", move);
#endif
 
}
 
void makeCapture(unsigned int &captured, unsigned int &to)
{
       // deals with all captures, except en-passant
       BitMap toBitMap;
       toBitMap = BITSET[to];
 
       switch (captured)
       {
              case 1: // white pawn:
                     board.whitePawns           ^= toBitMap;
                     board.whitePieces          ^= toBitMap;
                     board.Material           -= PAWN_VALUE;
                     break;
 
              case 2: // white king:
                     board.whiteKing             ^= toBitMap;
                     board.whitePieces          ^= toBitMap;
                     break;
 
              case 3: // white knight:
                     board.whiteKnights         ^= toBitMap;
                     board.whitePieces          ^= toBitMap;
                     board.Material           -= KNIGHT_VALUE;
                     break;
 
              case 5: // white bishop:
                     board.whiteBishops         ^= toBitMap;
                     board.whitePieces          ^= toBitMap;
                     board.Material           -= BISHOP_VALUE;
                     break;
 
              case 6: // white rook:
                     board.whiteRooks         ^= toBitMap;
                     board.whitePieces          ^= toBitMap;
                     board.Material           -= ROOK_VALUE;
                     if (to == A1) board.castleWhite &= ~CANCASTLEOOO;
                     if (to == H1) board.castleWhite &= ~CANCASTLEOO;
                     break;
 
              case 7: // white queen:
                     board.whiteQueens          ^= toBitMap;
                     board.whitePieces          ^= toBitMap;
                     board.Material           -= QUEEN_VALUE;
                     break;
 
              case 9: // black pawn:
                     board.blackPawns           ^= toBitMap;
                     board.blackPieces          ^= toBitMap;
                     board.Material           += PAWN_VALUE;
                     break;
 
              case 10: // black king:
                     board.blackKing             ^= toBitMap;
                     board.blackPieces          ^= toBitMap;
                     break;
 
              case 11: // black knight:
                     board.blackKnights         ^= toBitMap;
                     board.blackPieces          ^= toBitMap;
                     board.Material           += KNIGHT_VALUE;
                     break;
 
              case 13: // black bishop:
                     board.blackBishops         ^= toBitMap;
                     board.blackPieces          ^= toBitMap;
                     board.Material           += BISHOP_VALUE;
                     break;
 
              case 14: // black rook:
                     board.blackRooks         ^= toBitMap;
                     board.blackPieces          ^= toBitMap;
                     board.Material           += ROOK_VALUE;
                     if (to == A8) board.castleBlack &= ~CANCASTLEOOO;
                     if (to == H8) board.castleBlack &= ~CANCASTLEOO;
                     break;
 
              case 15: // black queen:
                     board.blackQueens          ^= toBitMap;
                     board.blackPieces          ^= toBitMap;
                     board.Material           += QUEEN_VALUE;
                     break;
       }
       board.fiftyMove = 0;
}
 
void unmakeCapture(unsigned int &captured, unsigned int &to)
{
       // deals with all captures, except en-passant
       BitMap toBitMap;
       toBitMap = BITSET[to];
 
       switch (captured)
       {
              case 1: // white pawn:
                     board.whitePawns           ^= toBitMap;
                     board.whitePieces          ^= toBitMap;
                     board.square[to]             = WHITE_PAWN;
                     board.Material           += PAWN_VALUE;
                     break;
 
              case 2: // white king:
                     board.whiteKing             ^= toBitMap;
                     board.whitePieces          ^= toBitMap;
                     board.square[to]             = WHITE_KING;
                     break;
 
              case 3: // white knight:
                     board.whiteKnights         ^= toBitMap;
                     board.whitePieces          ^= toBitMap;
                     board.square[to]             = WHITE_KNIGHT;
                     board.Material           += KNIGHT_VALUE;
                     break;
 
              case 5: // white bishop:
                     board.whiteBishops         ^= toBitMap;
                     board.whitePieces          ^= toBitMap;
                     board.square[to]             = WHITE_BISHOP;
                     board.Material           += BISHOP_VALUE;
                     break;
 
              case 6: // white rook:
                     board.whiteRooks         ^= toBitMap;
                     board.whitePieces          ^= toBitMap;
                     board.square[to]             = WHITE_ROOK;
                     board.Material           += ROOK_VALUE;
                     break;
 
              case 7: // white queen:
                     board.whiteQueens          ^= toBitMap;
                     board.whitePieces          ^= toBitMap;
                     board.square[to]             = WHITE_QUEEN;
                     board.Material           += QUEEN_VALUE;
                     break;
 
              case 9: // black pawn:
                     board.blackPawns           ^= toBitMap;
                     board.blackPieces          ^= toBitMap;
                     board.square[to]             = BLACK_PAWN;
                     board.Material           -= PAWN_VALUE;
                     break;
 
              case 10: // black king:
                     board.blackKing             ^= toBitMap;
                     board.blackPieces          ^= toBitMap;
                     board.square[to]             = BLACK_KING;
                     break;
 
              case 11: // black knight:
                     board.blackKnights         ^= toBitMap;
                     board.blackPieces          ^= toBitMap;
                     board.square[to]             = BLACK_KNIGHT;
                     board.Material           -= KNIGHT_VALUE;
                     break;
 
              case 13: // black bishop:
                     board.blackBishops         ^= toBitMap;
                     board.blackPieces          ^= toBitMap;
                     board.square[to]             = BLACK_BISHOP;
                     board.Material           -= BISHOP_VALUE;
                     break;
 
              case 14: // black rook:
                     board.blackRooks         ^= toBitMap;
                     board.blackPieces          ^= toBitMap;
                     board.square[to]             = BLACK_ROOK;
                     board.Material           -= ROOK_VALUE;
                     break;
 
              case 15: // black queen:
                     board.blackQueens          ^= toBitMap;
                     board.blackPieces          ^= toBitMap;
                     board.square[to]             = BLACK_QUEEN;
                     board.Material           -= QUEEN_VALUE;
                     break;
       }
}
 
void makeWhitePromotion(unsigned int prom, unsigned int &to)
{
       BitMap toBitMap;
       toBitMap = BITSET[to];
 
       board.whitePawns ^= toBitMap;
       board.Material -= PAWN_VALUE;
 
       if (prom == 7)
       {
              board.whiteQueens          ^= toBitMap;
              board.Material           += QUEEN_VALUE;
       }
       else if (prom == 6)
       {
              board.whiteRooks         ^= toBitMap;
              board.Material           += ROOK_VALUE;
       }
       else if (prom == 5)
       {
              board.whiteBishops       ^= toBitMap;
              board.Material           += BISHOP_VALUE;
       }
       else if (prom == 3)
       {
              board.whiteKnights       ^= toBitMap;
              board.Material           += KNIGHT_VALUE;
       }
}
 
void unmakeWhitePromotion(unsigned int prom, unsigned int &to)
{
       BitMap toBitMap;
       toBitMap = BITSET[to];
 
       board.whitePawns ^= toBitMap;
       board.Material += PAWN_VALUE;
 
       if (prom == 7)
       {
              board.whiteQueens          ^= toBitMap;
              board.Material           -= QUEEN_VALUE;
       }
       else if (prom == 6)
       {
              board.whiteRooks         ^= toBitMap;
              board.Material           -= ROOK_VALUE;
       }
       else if (prom == 5)
       {
              board.whiteBishops       ^= toBitMap;
              board.Material           -= BISHOP_VALUE;
       }
       else if (prom == 3)
       {
              board.whiteKnights       ^= toBitMap;
              board.Material           -= KNIGHT_VALUE;
       }
}
 
 
void makeBlackPromotion(unsigned int prom, unsigned int &to)
{
       BitMap toBitMap;
       toBitMap = BITSET[to];
 
       board.blackPawns ^= toBitMap;
       board.Material += PAWN_VALUE;
 
       if (prom == 15)
       {
              board.blackQueens          ^= toBitMap;
              board.Material           -= QUEEN_VALUE;
       }
       else if (prom == 14)
       {
              board.blackRooks         ^= toBitMap;
              board.Material           -= ROOK_VALUE;
       }
       else if (prom == 13)
       {
              board.blackBishops       ^= toBitMap;
              board.Material           -= BISHOP_VALUE;
       }
       else if (prom == 11)
       {
              board.blackKnights       ^= toBitMap;
              board.Material           -= KNIGHT_VALUE;
       }
}
 
void unmakeBlackPromotion(unsigned int prom, unsigned int &to)
{
       BitMap toBitMap;
       toBitMap = BITSET[to];
 
       board.blackPawns ^= toBitMap;
       board.Material -= PAWN_VALUE;
 
       if (prom == 15)
       {
              board.blackQueens          ^= toBitMap;
              board.Material           += QUEEN_VALUE;
       }
       else if (prom == 14)
       {
              board.blackRooks         ^= toBitMap;
              board.Material           += ROOK_VALUE;
       }
       else if (prom == 13)
       {
              board.blackBishops       ^= toBitMap;
              board.Material           += BISHOP_VALUE;
       }
       else if (prom == 11)
       {
              board.blackKnights       ^= toBitMap;
              board.Material           += KNIGHT_VALUE;
       }
}
 
BOOLTYPE isOtherKingAttacked()
{
       // check to see if we are leaving our king in check
       if (board.nextMove)
       {
           return isAttacked(board.whiteKing, board.nextMove);
       }
       else
       {
           return isAttacked(board.blackKing, board.nextMove);
       }
}
 
BOOLTYPE isOwnKingAttacked()
{
       // check to see if we are leaving our king in check
       if (board.nextMove)
       {
           return isAttacked(board.blackKing, !board.nextMove);
       }
       else
       {
           return isAttacked(board.whiteKing, !board.nextMove);
       }
}
 
 
 
BOOLTYPE isValidTextMove(char *userMove, Move &move)
{
       // Checks if userMove is valid by comparing it with moves from the move generator
       // If found valid, the move is returned
 
       unsigned char userFrom, userTo, userPromote;
       BOOLTYPE moveFound;
       int i;
 
       if (strlen(userMove) > 3)
       {
              userFrom = userMove[0] - 97;
              userFrom += 8 * (userMove[1] - 49);
              userTo = userMove[2] - 97;
              userTo += 8 * (userMove[3] - 49);
       }
 
       userPromote = 0;
       if (strlen(userMove) > 4)
       {
              if (board.nextMove == WHITE_MOVE)
              {
                     switch (userMove[4])
                     {                   
                           case 'q': userPromote = WHITE_QUEEN; break;
                           case 'r': userPromote = WHITE_ROOK; break;
                           case 'b': userPromote = WHITE_BISHOP; break;
                           case 'n': userPromote = WHITE_KNIGHT; break;
                     }
              }
              else
                     switch (userMove[4])
                     {                   
                           case 'q': userPromote = BLACK_QUEEN; break;
                           case 'r': userPromote = BLACK_ROOK; break;
                           case 'b': userPromote = BLACK_BISHOP; break;
                           case 'n': userPromote = BLACK_KNIGHT; break;
                     }
       }
 
       moveFound = false;
       for (i = board.moveBufLen[0]; i < board.moveBufLen[1]; i++)
       {
              if ((board.moveBuffer[i].getFrom() == userFrom) && (board.moveBuffer[i].getTosq() == userTo))
              { 
                     if (((board.square[userFrom] == WHITE_PAWN) && (RANKS[userFrom] == 7)) ||
                         ((board.square[userFrom] == BLACK_PAWN) && (RANKS[userFrom] == 2)))
                     {
                           if (board.moveBuffer[i].getProm() == userPromote)
                           {
                                  move.moveInt = board.moveBuffer[i].moveInt;
                                  return true;
                           }
                     }
                     else
                     {
                           move.moveInt = board.moveBuffer[i].moveInt;
                           return true;
                     }
              }
       }
       move.moveInt = 0;
       return false;
}
 
#ifdef WINGLET_DEBUG_MOVES
 
void debugMoves(char *caller, Move &move)
{
 
       // check if board.square, piece bitmaps and whitepieces and blackpiese and occupied square are all consistent after (un)makmove
 
       char input[80];
       int mat, i, j;
 
       // check if both kings are present
       if ((bitCnt(board.whiteKing) != 1) || (bitCnt(board.blackKing) != 1))
       {
              std::cout << "king captured after  " << caller << std::endl;
              displayMove(move); std::cout << std::endl;
              for (j = 0 ; j < board.endOfSearch ; j++)
       {
                     std::cout << j+1 << ". ";
                     displayMove(board.gameLine[j].move);
                     std::cout <<std::endl;
              }
              board.display();
              std::cin >> input;
       }
 
       // check if board.square and piece bitmaps and whitepieces and blackpiese and occupied square are all telling the same
       for (i = 0 ; i < 64 ; i++)
       {
              if ((board.blackQueens & BITSET[i]) && (board.square[i] != BLACK_QUEEN))
              {
                     std::cout << "inconsistency in black queens after " << caller << std::endl;
                     displayMove(move); std::cout << std::endl;
                     for (j = 0 ; j < board.endOfSearch ; j++)
              {
                           std::cout << j+1 << ". ";
                           displayMove(board.gameLine[j].move);
                           std::cout <<std::endl;
                     }
                     board.display();
                     std::cin >> input;
              }
              if ((board.blackRooks & BITSET[i]) && (board.square[i] != BLACK_ROOK))
              {
                     std::cout << "inconsistency in black rooks after " << caller << std::endl;
                     displayMove(move); std::cout << std::endl;
                     for (j = 0 ; j < board.endOfSearch ; j++)
              {
                           std::cout << j+1 << ". ";
                           displayMove(board.gameLine[j].move);
                           std::cout <<std::endl;
                     }
                     board.display();
                     displayBitmap(board.blackRooks);
                     std::cin >> input;
              }
              if ((board.blackBishops & BITSET[i]) && (board.square[i] != BLACK_BISHOP))
              {
                     std::cout << "inconsistency in black bishops after " << caller << std::endl;
                     displayMove(move); std::cout << std::endl;
                     for (j = 0 ; j < board.endOfSearch ; j++)
              {
                           std::cout << j+1 << ". ";
                           displayMove(board.gameLine[j].move);
                           std::cout <<std::endl;
                     }
                     board.display();
                     std::cin >> input;
              }
              if ((board.blackKnights & BITSET[i]) && (board.square[i] != BLACK_KNIGHT))
              {
                     std::cout << "inconsistency in black knights after " << caller << std::endl;
                     displayMove(move); std::cout << std::endl;
                     displayMove(move);
                     for (j = 0 ; j < board.endOfSearch ; j++)
              {
                           std::cout << j+1 << ". ";
                           displayMove(board.gameLine[j].move);
                           std::cout <<std::endl;
                     }
                     board.display();
                     std::cin >> input;
              }
              if ((board.blackKing & BITSET[i]) && (board.square[i] != BLACK_KING))
              {
                     std::cout << "inconsistency in black king after " << caller << std::endl;
                     displayMove(move); std::cout << std::endl;
                     for (j = 0 ; j < board.endOfSearch ; j++)
              {
                           std::cout << j+1 << ". ";
                           displayMove(board.gameLine[j].move);
                           std::cout <<std::endl;
                     }
                     board.display();
                     std::cin >> input;
              }
              if ((board.blackPawns & BITSET[i]) && (board.square[i] != BLACK_PAWN))
              {
                     std::cout << "inconsistency in black pawns after " << caller << std::endl;
                     displayMove(move); std::cout << std::endl;
                     for (j = 0 ; j < board.endOfSearch ; j++)
              {
                           std::cout << j+1 << ". ";
                           displayMove(board.gameLine[j].move);
                           std::cout <<std::endl;
                     }
                     board.display();
                     displayBitmap(board.blackPawns);
                     std::cout.flush();
                     std::cin >> input;
              }
              if ((board.whiteQueens & BITSET[i]) && (board.square[i] != WHITE_QUEEN))
              {
                     std::cout << "inconsistency in white queens after " << caller << std::endl;
                     displayMove(move); std::cout << std::endl;
                     for (j = 0 ; j < board.endOfSearch ; j++)
              {
                           std::cout << j+1 << ". ";
                           displayMove(board.gameLine[j].move);
                           std::cout <<std::endl;
                     }
                     board.display();
                     std::cin >> input;
              }
              if ((board.whiteRooks & BITSET[i]) && (board.square[i] != WHITE_ROOK))
              {
                     std::cout << "inconsistency in white rooks after " << caller << std::endl;
                     displayMove(move); std::cout << std::endl;
                     for (j = 0 ; j < board.endOfSearch ; j++)
              {
                           std::cout << j+1 << ". ";
                           displayMove(board.gameLine[j].move);
                            std::cout <<std::endl;
                     }
                     board.display();
                     displayBitmap(board.whiteRooks);
                     std::cin >> input;
              }
              if ((board.whiteBishops & BITSET[i]) && (board.square[i] != WHITE_BISHOP))
              {
                     std::cout << "inconsistency in white bishops after " << caller << std::endl;
                     displayMove(move); std::cout << std::endl;
                     for (j = 0 ; j < board.endOfSearch ; j++)
              {
                           std::cout << j+1 << ". ";
                           displayMove(board.gameLine[j].move);
                           std::cout <<std::endl;
                     }
                     board.display();
                     std::cin >> input;
              }
              if ((board.whiteKnights & BITSET[i]) && (board.square[i] != WHITE_KNIGHT))
              {
                     std::cout << "inconsistency in white knights  after " << caller << std::endl;
                     displayMove(move); std::cout << std::endl;
                     for (j = 0 ; j < board.endOfSearch ; j++)
              {
                           std::cout << j+1 << ". ";
                           displayMove(board.gameLine[j].move);
                           std::cout <<std::endl;
                     }
                     board.display();
                     std::cin >> input;
              }
              if ((board.whiteKing & BITSET[i]) && (board.square[i] != WHITE_KING))
              {
                     std::cout << "inconsistency in white king after " << caller << std::endl;
                     displayMove(move); std::cout << std::endl;
                     for (j = 0 ; j < board.endOfSearch ; j++)
              {
                           std::cout << j+1 << ". ";
                           displayMove(board.gameLine[j].move);
                            std::cout <<std::endl;
                     }
                     board.display();
                     std::cin >> input;
              }
              if ((board.whitePawns & BITSET[i]) && (board.square[i] != WHITE_PAWN))
              {
                     std::cout << "inconsistency in white pawns after " << caller << std::endl;
                     displayMove(move); std::cout << std::endl;
                     for (j = 0 ; j < board.endOfSearch ; j++)
              {
                           std::cout << j+1 << ". ";
                           displayMove(board.gameLine[j].move);
                           std::cout <<std::endl;
                     }
                     board.display();
                     std::cin >> input;
              }
       }
 
       if (board.whitePieces != (board.whiteKing | board.whiteQueens | board.whiteRooks | board.whiteBishops | board.whiteKnights | board.whitePawns ))
       {
              std::cout << "inconsistency in whitePieces after " << caller << std::endl;
              displayMove(move); std::cout << std::endl;
              for (j = 0 ; j < board.endOfSearch ; j++)
       {
                     std::cout << j+1 << ". ";
                     displayMove(board.gameLine[j].move);
                     std::cout <<std::endl;
              }
              board.display();
              displayBitmap(board.whitePieces);
              std::cin >> input;
       }
 
       if (board.blackPieces != (board.blackKing | board.blackQueens | board.blackRooks | board.blackBishops | board.blackKnights | board.blackPawns ))
       {
              std::cout << "inconsistency in blackPieces after " << caller << std::endl;
              displayMove(move); std::cout << std::endl;
              for (j = 0 ; j < board.endOfSearch ; j++)
       {
                     std::cout << j+1 << ". ";
                     displayMove(board.gameLine[j].move);
                     std::cout <<std::endl;
              }
              board.display();
              displayBitmap(board.blackPieces);
              std::cin >> input;
       }
 
       if (board.occupiedSquares != (board.whitePieces | board.blackPieces))
       {
              std::cout << "inconsistency in occupiedSquares after " << caller << std::endl;
              displayMove(move); std::cout << std::endl;
              for (j = 0 ; j < board.endOfSearch ; j++)
       {
                     std::cout << j+1 << ". ";
                     displayMove(board.gameLine[j].move);
                     std::cout <<std::endl;
              }
              board.display();
              displayBitmap(board.occupiedSquares);
              std::cin >> input;
       }
 
       mat = bitCnt(board.whitePawns) * PAWN_VALUE +
                                  bitCnt(board.whiteKnights) * KNIGHT_VALUE +
                                  bitCnt(board.whiteBishops) * BISHOP_VALUE +
                                  bitCnt(board.whiteRooks) * ROOK_VALUE +
                                  bitCnt(board.whiteQueens) * QUEEN_VALUE;
       mat -= (bitCnt(board.blackPawns) * PAWN_VALUE +
                                  bitCnt(board.blackKnights) * KNIGHT_VALUE +
                                  bitCnt(board.blackBishops) * BISHOP_VALUE +
                                  bitCnt(board.blackRooks) * ROOK_VALUE +
                                  bitCnt(board.blackQueens) * QUEEN_VALUE);
       if (board.Material != mat)
       {
              std::cout << "inconsistency in material after " << caller << std::endl;
              displayMove(move);
              board.display();
              std::cin >> input;
       }
 
}
#endif

 


Home Previous Top Next

last update: Saturday 11 June 2011