void generateallcaps(const S_BOARD *pos, S_MOVELIST *list) { //printf("generate checkboard assert"); ASSERT(checkboard(pos)); list->count = 0; int pce = EMPTY; int side = pos->side; int sq = 0; int t_sq =0; int pceNum = 0; int dir =0; int i =0; int pceindex =0; //printf("\n\n Side: %d\n",side); if(side == WHITE) { for(pceNum =0; pceNum < pos->pceNum[wp];pceNum++) { sq = pos->plist[wp][pceNum]; ASSERT(sqonboard(sq)); if(!SQOFFBOARD(sq+9) && piececol[pos->pieces[sq+9]]==BLACK) addwhitepawncapmove(pos,sq,sq+9,pos->pieces[sq+9],list); if(!SQOFFBOARD(sq+11) && piececol[pos->pieces[sq+11]]==BLACK) addwhitepawncapmove(pos,sq,sq+11,pos->pieces[sq+11],list); //enpassnt if(!SQOFFBOARD(sq+9) && sq+9==pos->enpass) addenpassantmove(pos,MOVE(sq,sq+9,EMPTY,EMPTY,MFLAGEP),list); if(!SQOFFBOARD(sq+11) && sq+11==pos->enpass) addenpassantmove(pos,MOVE(sq,sq+11,EMPTY,EMPTY,MFLAGEP),list); } //for ended } else { for(pceNum =0; pceNum < pos->pceNum[bp];pceNum++) { sq = pos->plist[bp][pceNum]; ASSERT(sqonboard(sq)); if(!SQOFFBOARD(sq-9) && piececol[pos->pieces[sq-9]]==WHITE) addblackpawncapmove(pos,sq,sq-9,pos->pieces[sq-9],list); if(!SQOFFBOARD(sq-11) && piececol[pos->pieces[sq-11]]==WHITE) addblackpawncapmove(pos,sq,sq-11,pos->pieces[sq-11],list); //enpassnt if(!SQOFFBOARD(sq-9) && sq-9==pos->enpass) addenpassantmove(pos,MOVE(sq,sq-9,EMPTY,EMPTY,MFLAGEP),list); if(!SQOFFBOARD(sq-11) && sq-11==pos->enpass) addenpassantmove(pos,MOVE(sq,sq-11,EMPTY,EMPTY,MFLAGEP),list); } } /* Loop for slide pieces */ pceindex = loopslideindex[side]; pce = loopslidepce[pceindex++]; while(pce != 0) { ASSERT(piecevalid(pce)); //printf("slider pceindex:%d pce : %d\n",pceindex,pce); for(pceNum =0; pceNum < pos->pceNum[pce];pceNum++) { sq=pos->plist[pce][pceNum]; ASSERT(sqonboard(sq)); //printf("Piece : %c on %s\n",pcechar[pce],prsq(sq)); for(i=0;i<numdir[pce];i++) { dir = pcedir[pce][i]; t_sq = sq +dir; while(!SQOFFBOARD(t_sq)) { if(pos->pieces[t_sq] != EMPTY) { if(piececol[pos->pieces[t_sq]]== side^1) {//printf("\t\tCapture on %s \n", prsq(t_sq)); addcapturemove(pos,MOVE(sq,t_sq,pos->pieces[t_sq],EMPTY,0),list); } break; } t_sq += dir; } } } pce = loopslidepce[pceindex++]; } /* Loop for slide pieces */ /* Loop for non slide pieces */ pceindex = loopnonslideindex[side]; pce = loopnonslidepce[pceindex++]; while(pce != 0) { ASSERT(piecevalid(pce)); //printf("non slider pceindex:%d pce : %d\n",pceindex,pce); for(pceNum =0; pceNum <pos->pceNum[pce];pceNum++) { sq=pos->plist[pce][pceNum]; ASSERT(sqonboard(sq)); //printf("Piece : %c on %s\n",pcechar[pce],prsq(sq)); for(i=0;i<numdir[pce];i++) { dir = pcedir[pce][i]; t_sq = sq +dir; if(SQOFFBOARD(t_sq)) continue; // BLACK ^ 1 == WHITE WHITE ^ 1 == BLACK if(pos->pieces[t_sq] != EMPTY) { if(piececol[pos->pieces[t_sq]] == side ^ 1) {//printf("\t\tCapture on %s\n",prsq(t_sq)); addcapturemove(pos,MOVE(sq,t_sq,pos->pieces[t_sq],EMPTY,0),list);} continue; } //printf("\t\tNormal on %s \n",prsq(t_sq)); } } pce = loopnonslidepce[pceindex++]; } /* Loop for non slide pieces */ }
void GenerateAllCaps(const CHESS_BOARD *pos, MOVELIST *list) { ASSERT(CheckBoard(pos)); list->count = 0; int pce = EMPTY; int side = pos->side; int sq = 0; int t_sq = 0; int pceNum = 0; int dir = 0; int index = 0; int pceIndex = 0; if (side == WHITE) { for (pceNum = 0; pceNum < pos->pieceNum[wP]; ++pceNum) { sq = pos->pList[wP][pceNum]; ASSERT(SqOnBoard(sq)); if (!SQOFFBOARD(sq + 9) && PieceCol[pos->pieces[sq + 9]] == BLACK) { AddWhitePawnCapMove(pos, sq, sq + 9, pos->pieces[sq + 9], list); } if (!SQOFFBOARD(sq + 11) && PieceCol[pos->pieces[sq + 11]] == BLACK) { AddWhitePawnCapMove(pos, sq, sq + 11, pos->pieces[sq + 11], list); } if (pos->enPas != NO_SQ) { if (sq + 9 == pos->enPas) { AddEnPassantMove(pos, MOVE(sq, sq + 9, EMPTY, EMPTY, MFLAGEP), list); } if (sq + 11 == pos->enPas) { AddEnPassantMove(pos, MOVE(sq, sq + 11, EMPTY, EMPTY, MFLAGEP), list); } } } } else { for (pceNum = 0; pceNum < pos->pieceNum[bP]; ++pceNum) { sq = pos->pList[bP][pceNum]; ASSERT(SqOnBoard(sq)); if (!SQOFFBOARD(sq - 9) && PieceCol[pos->pieces[sq - 9]] == WHITE) { AddBlackPawnCapMove(pos, sq, sq - 9, pos->pieces[sq - 9], list); } if (!SQOFFBOARD(sq - 11) && PieceCol[pos->pieces[sq - 11]] == WHITE) { AddBlackPawnCapMove(pos, sq, sq - 11, pos->pieces[sq - 11], list); } if (pos->enPas != NO_SQ) { if (sq - 9 == pos->enPas) { AddEnPassantMove(pos, MOVE(sq, sq - 9, EMPTY, EMPTY, MFLAGEP), list); } if (sq - 11 == pos->enPas) { AddEnPassantMove(pos, MOVE(sq, sq - 11, EMPTY, EMPTY, MFLAGEP), list); } } } } /* Loop for slide pieces */ pceIndex = LoopSlideIndex[side]; pce = LoopSlidePce[pceIndex++]; while (pce != 0) { ASSERT(PieceValid(pce)); for (pceNum = 0; pceNum < pos->pieceNum[pce]; ++pceNum) { sq = pos->pList[pce][pceNum]; ASSERT(SqOnBoard(sq)); for (index = 0; index < NumDir[pce]; ++index) { dir = PceDir[pce][index]; t_sq = sq + dir; while (!SQOFFBOARD(t_sq)) { // BLACK ^ 1 == WHITE WHITE ^ 1 == BLACK if (pos->pieces[t_sq] != EMPTY) { if (PieceCol[pos->pieces[t_sq]] == (side ^ 1)) { AddCaptureMove(pos, MOVE(sq, t_sq, pos->pieces[t_sq], EMPTY, 0), list); } break; } t_sq += dir; } } } pce = LoopSlidePce[pceIndex++]; } /* Loop for non slide */ pceIndex = LoopNonSlideIndex[side]; pce = LoopNonSlidePce[pceIndex++]; while (pce != 0) { ASSERT(PieceValid(pce)); for (pceNum = 0; pceNum < pos->pieceNum[pce]; ++pceNum) { sq = pos->pList[pce][pceNum]; ASSERT(SqOnBoard(sq)); for (index = 0; index < NumDir[pce]; ++index) { dir = PceDir[pce][index]; t_sq = sq + dir; if (SQOFFBOARD(t_sq)) { continue; } // BLACK ^ 1 == WHITE WHITE ^ 1 == BLACK if (pos->pieces[t_sq] != EMPTY) { if (PieceCol[pos->pieces[t_sq]] == (side ^ 1)) { AddCaptureMove(pos, MOVE(sq, t_sq, pos->pieces[t_sq], EMPTY, 0), list); } continue; } } } pce = LoopNonSlidePce[pceIndex++]; } ASSERT(MoveListOk(list, pos)); }
void generateallmoves(const S_BOARD *pos, S_MOVELIST *list) { //printf("generate checkboard assert"); ASSERT(checkboard(pos)); list->count = 0; int pce = EMPTY; int side = pos->side; int sq = 0; int t_sq =0; int pceNum = 0; int dir =0; int i =0; int pceindex =0; //printf("\n\n Side: %d\n",side); if(side == WHITE) { for(pceNum =0; pceNum < pos->pceNum[wp];pceNum++) { sq = pos->plist[wp][pceNum]; ASSERT(sqonboard(sq)); if(pos->pieces[sq + 10] == EMPTY) { addwhitepawnmove(pos,sq,sq+10,list); if(ranksbrd[sq]== RANK_2 && pos-> pieces[sq + 20]==EMPTY) addquietmove(pos,MOVE(sq,(sq+20),EMPTY,EMPTY,MFLAGPS),list); } if(!SQOFFBOARD(sq+9) && piececol[pos->pieces[sq+9]]==BLACK) addwhitepawncapmove(pos,sq,sq+9,pos->pieces[sq+9],list); if(!SQOFFBOARD(sq+11) && piececol[pos->pieces[sq+11]]==BLACK) addwhitepawncapmove(pos,sq,sq+11,pos->pieces[sq+11],list); //enpassnt if(!SQOFFBOARD(sq+9) && sq+9==pos->enpass) addenpassantmove(pos,MOVE(sq,sq+9,EMPTY,EMPTY,MFLAGEP),list); if(!SQOFFBOARD(sq+11) && sq+11==pos->enpass) addenpassantmove(pos,MOVE(sq,sq+11,EMPTY,EMPTY,MFLAGEP),list); } //for ended /* castle move */ if(pos->castle & WO_O) { if(pos->pieces[F1]==EMPTY && pos->pieces[G1] == EMPTY) if(!sqattacked(E1,BLACK,pos) && !sqattacked(F1,BLACK,pos) && !sqattacked(G1,BLACK,pos)) { //printf("WO_O MoveGen\n"); addquietmove(pos,MOVE(E1,G1,EMPTY,EMPTY,MFLAGCA),list); } } if(pos->castle & WO_O_O) { if(pos->pieces[D1]==EMPTY && pos->pieces[C1] == EMPTY && pos->pieces[B1]==EMPTY) if(!sqattacked(E1,BLACK,pos) && !sqattacked(D1,BLACK,pos) && !sqattacked(C1,BLACK,pos)) { //printf("WO_O_O MoveGen\n"); addquietmove(pos,MOVE(E1,C1,EMPTY,EMPTY,MFLAGCA),list); } } /* castle move */ } else { for(pceNum =0; pceNum < pos->pceNum[bp];pceNum++) { sq = pos->plist[bp][pceNum]; ASSERT(sqonboard(sq)); if(pos->pieces[sq - 10] == EMPTY) { addblackpawnmove(pos,sq,sq-10,list); if(ranksbrd[sq]== RANK_7 && pos-> pieces[sq-20]==EMPTY) { addquietmove(pos,MOVE(sq,(sq-20),EMPTY,EMPTY,MFLAGPS),list); } } if(!SQOFFBOARD(sq-9) && piececol[pos->pieces[sq-9]]==WHITE) addblackpawncapmove(pos,sq,sq-9,pos->pieces[sq-9],list); if(!SQOFFBOARD(sq-11) && piececol[pos->pieces[sq-11]]==WHITE) addblackpawncapmove(pos,sq,sq-11,pos->pieces[sq-11],list); //enpassnt if(!SQOFFBOARD(sq-9) && sq-9==pos->enpass) addenpassantmove(pos,MOVE(sq,sq-9,EMPTY,EMPTY,MFLAGEP),list); if(!SQOFFBOARD(sq-11) && sq-11==pos->enpass) addenpassantmove(pos,MOVE(sq,sq-11,EMPTY,EMPTY,MFLAGEP),list); } /* castle move */ if(pos->castle & BO_O) { if(pos->pieces[F8]==EMPTY && pos->pieces[G8] == EMPTY) if(!sqattacked(E8,WHITE,pos) && !sqattacked(F8,WHITE,pos) && !sqattacked(G8,WHITE,pos)) { //printf("BO_O MoveGen\n"); addquietmove(pos,MOVE(E8,G8,EMPTY,EMPTY,MFLAGCA),list); } } if(pos->castle & BO_O_O) { if(pos->pieces[D8]==EMPTY && pos->pieces[C8] == EMPTY && pos->pieces[B8]==EMPTY) if(!sqattacked(E8,WHITE,pos) && !sqattacked(D8,WHITE,pos) && !sqattacked(C8,WHITE,pos)) { //printf("BO_O_O MoveGen\n"); addquietmove(pos,MOVE(E8,C8,EMPTY,EMPTY,MFLAGCA),list); } } /* castle move */ } /* Loop for slide pieces */ pceindex = loopslideindex[side]; pce = loopslidepce[pceindex++]; while(pce != 0) { ASSERT(piecevalid(pce)); //printf("slider pceindex:%d pce : %d\n",pceindex,pce); for(pceNum =0; pceNum < pos->pceNum[pce];pceNum++) { sq=pos->plist[pce][pceNum]; ASSERT(sqonboard(sq)); //printf("Piece : %c on %s\n",pcechar[pce],prsq(sq)); for(i=0;i<numdir[pce];i++) { dir = pcedir[pce][i]; t_sq = sq +dir; while(!SQOFFBOARD(t_sq)) { if(pos->pieces[t_sq] != EMPTY) { if(piececol[pos->pieces[t_sq]]== side^1) {//printf("\t\tCapture on %s \n", prsq(t_sq)); addcapturemove(pos,MOVE(sq,t_sq,pos->pieces[t_sq],EMPTY,0),list); } break; } //printf("\t\tNormal on %s\n",prsq(t_sq)); addquietmove(pos,MOVE(sq,t_sq,EMPTY,EMPTY,0),list); t_sq += dir; } } } pce = loopslidepce[pceindex++]; } /* Loop for slide pieces */ /* Loop for non slide pieces */ pceindex = loopnonslideindex[side]; pce = loopnonslidepce[pceindex++]; while(pce != 0) { ASSERT(piecevalid(pce)); //printf("non slider pceindex:%d pce : %d\n",pceindex,pce); for(pceNum =0; pceNum <pos->pceNum[pce];pceNum++) { sq=pos->plist[pce][pceNum]; ASSERT(sqonboard(sq)); //printf("Piece : %c on %s\n",pcechar[pce],prsq(sq)); for(i=0;i<numdir[pce];i++) { dir = pcedir[pce][i]; t_sq = sq +dir; if(SQOFFBOARD(t_sq)) continue; // BLACK ^ 1 == WHITE WHITE ^ 1 == BLACK if(pos->pieces[t_sq] != EMPTY) { if(piececol[pos->pieces[t_sq]] == side ^ 1) {//printf("\t\tCapture on %s\n",prsq(t_sq)); addcapturemove(pos,MOVE(sq,t_sq,pos->pieces[t_sq],EMPTY,0),list);} continue; } //printf("\t\tNormal on %s \n",prsq(t_sq)); addquietmove(pos,MOVE(sq,t_sq,EMPTY,EMPTY,0),list); } } pce = loopnonslidepce[pceindex++]; } /* Loop for non slide pieces */ }
void GenerateAllMoves(const CHESS_BOARD *pos, MOVELIST *list) { ASSERT(CheckBoard(pos)); list->count = 0; int pce = EMPTY; int side = pos->side; int sq = 0; int t_sq = 0; int pceNum = 0; int dir = 0; int index = 0; int pceIndex = 0; if (side == WHITE) { for (pceNum = 0; pceNum < pos->pieceNum[wP]; ++pceNum) { sq = pos->pList[wP][pceNum]; ASSERT(SqOnBoard(sq)); if (pos->pieces[sq + 10] == EMPTY) { AddWhitePawnMove(pos, sq, sq + 10, list); if (RanksBrd[sq] == RANK_2 && pos->pieces[sq + 20] == EMPTY) { AddQuietMove(pos, MOVE(sq, (sq + 20), EMPTY, EMPTY, MFLAGPS), list); } } if (!SQOFFBOARD(sq + 9) && PieceCol[pos->pieces[sq + 9]] == BLACK) { AddWhitePawnCapMove(pos, sq, sq + 9, pos->pieces[sq + 9], list); } if (!SQOFFBOARD(sq + 11) && PieceCol[pos->pieces[sq + 11]] == BLACK) { AddWhitePawnCapMove(pos, sq, sq + 11, pos->pieces[sq + 11], list); } if (pos->enPas != NO_SQ) { if (sq + 9 == pos->enPas) { AddEnPassantMove(pos, MOVE(sq, sq + 9, EMPTY, EMPTY, MFLAGEP), list); } if (sq + 11 == pos->enPas) { AddEnPassantMove(pos, MOVE(sq, sq + 11, EMPTY, EMPTY, MFLAGEP), list); } } } if (pos->castlePerm & WKCA) { if (pos->pieces[F1] == EMPTY && pos->pieces[G1] == EMPTY) { if (!SqAttacked(E1, BLACK, pos) && !SqAttacked(F1, BLACK, pos)) { AddQuietMove(pos, MOVE(E1, G1, EMPTY, EMPTY, MFLAGCA), list); } } } if (pos->castlePerm & WQCA) { if (pos->pieces[D1] == EMPTY && pos->pieces[C1] == EMPTY && pos->pieces[B1] == EMPTY) { if (!SqAttacked(E1, BLACK, pos) && !SqAttacked(D1, BLACK, pos)) { AddQuietMove(pos, MOVE(E1, C1, EMPTY, EMPTY, MFLAGCA), list); } } } } else { for (pceNum = 0; pceNum < pos->pieceNum[bP]; ++pceNum) { sq = pos->pList[bP][pceNum]; ASSERT(SqOnBoard(sq)); if (pos->pieces[sq - 10] == EMPTY) { AddBlackPawnMove(pos, sq, sq - 10, list); if (RanksBrd[sq] == RANK_7 && pos->pieces[sq - 20] == EMPTY) { AddQuietMove(pos, MOVE(sq, (sq - 20), EMPTY, EMPTY, MFLAGPS), list); } } if (!SQOFFBOARD(sq - 9) && PieceCol[pos->pieces[sq - 9]] == WHITE) { AddBlackPawnCapMove(pos, sq, sq - 9, pos->pieces[sq - 9], list); } if (!SQOFFBOARD(sq - 11) && PieceCol[pos->pieces[sq - 11]] == WHITE) { AddBlackPawnCapMove(pos, sq, sq - 11, pos->pieces[sq - 11], list); } if (pos->enPas != NO_SQ) { if (sq - 9 == pos->enPas) { AddEnPassantMove(pos, MOVE(sq, sq - 9, EMPTY, EMPTY, MFLAGEP), list); } if (sq - 11 == pos->enPas) { AddEnPassantMove(pos, MOVE(sq, sq - 11, EMPTY, EMPTY, MFLAGEP), list); } } } // castling if (pos->castlePerm & BKCA) { if (pos->pieces[F8] == EMPTY && pos->pieces[G8] == EMPTY) { if (!SqAttacked(E8, WHITE, pos) && !SqAttacked(F8, WHITE, pos)) { AddQuietMove(pos, MOVE(E8, G8, EMPTY, EMPTY, MFLAGCA), list); } } } if (pos->castlePerm & BQCA) { if (pos->pieces[D8] == EMPTY && pos->pieces[C8] == EMPTY && pos->pieces[B8] == EMPTY) { if (!SqAttacked(E8, WHITE, pos) && !SqAttacked(D8, WHITE, pos)) { AddQuietMove(pos, MOVE(E8, C8, EMPTY, EMPTY, MFLAGCA), list); } } } } /* Loop for slide pieces */ pceIndex = LoopSlideIndex[side]; pce = LoopSlidePce[pceIndex++]; while (pce != 0) { ASSERT(PieceValid(pce)); for (pceNum = 0; pceNum < pos->pieceNum[pce]; ++pceNum) { sq = pos->pList[pce][pceNum]; ASSERT(SqOnBoard(sq)); for (index = 0; index < NumDir[pce]; ++index) { dir = PceDir[pce][index]; t_sq = sq + dir; while (!SQOFFBOARD(t_sq)) { // BLACK ^ 1 == WHITE WHITE ^ 1 == BLACK if (pos->pieces[t_sq] != EMPTY) { if (PieceCol[pos->pieces[t_sq]] == (side ^ 1)) { AddCaptureMove(pos, MOVE(sq, t_sq, pos->pieces[t_sq], EMPTY, 0), list); } break; } AddQuietMove(pos, MOVE(sq, t_sq, EMPTY, EMPTY, 0), list); t_sq += dir; } } } pce = LoopSlidePce[pceIndex++]; } /* Loop for non slide */ pceIndex = LoopNonSlideIndex[side]; pce = LoopNonSlidePce[pceIndex++]; while (pce != 0) { ASSERT(PieceValid(pce)); for (pceNum = 0; pceNum < pos->pieceNum[pce]; ++pceNum) { sq = pos->pList[pce][pceNum]; ASSERT(SqOnBoard(sq)); for (index = 0; index < NumDir[pce]; ++index) { dir = PceDir[pce][index]; t_sq = sq + dir; if (SQOFFBOARD(t_sq)) { continue; } // BLACK ^ 1 == WHITE WHITE ^ 1 == BLACK if (pos->pieces[t_sq] != EMPTY) { if (PieceCol[pos->pieces[t_sq]] == (side ^ 1)) { AddCaptureMove(pos, MOVE(sq, t_sq, pos->pieces[t_sq], EMPTY, 0), list); } continue; } AddQuietMove(pos, MOVE(sq, t_sq, EMPTY, EMPTY, 0), list); } } pce = LoopNonSlidePce[pceIndex++]; } //ASSERT(MoveListOk(list, pos)); }