jordan83221

GenerateAllMoves

Dec 15th, 2022
671
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.73 KB | None | 0 0
  1. void GenerateAllMoves(const S_BOARD *pos, S_MOVELIST *list) {
  2.    
  3.     ASSERT(CheckBoard(pos));
  4.    
  5.     list->count = 0;   
  6.    
  7.     int pce = EMPTY;
  8.     int side = pos->side;
  9.     int sq = 0; int t_sq = 0;
  10.     int pceNum = 0;
  11.     int dir = 0;
  12.     int index = 0;
  13.     int pceIndex = 0;
  14.    
  15.     if(side == WHITE) {
  16.        
  17.         for(pceNum = 0; pceNum < pos->pceNum[wP]; ++pceNum) {
  18.             sq = pos->pList[wP][pceNum];
  19.             ASSERT(SqOnBoard(sq));
  20.            
  21.             if(pos->pieces[sq + 10] == EMPTY) {
  22.                 AddWhitePawnMove(pos, sq, sq+10, list);
  23.                 if(RanksBrd[sq] == RANK_2 && pos->pieces[sq + 20] == EMPTY) {
  24.                     AddQuietMove(pos, MOVE(sq,(sq+20),EMPTY,EMPTY,MFLAGPS),list);
  25.                 }
  26.             }
  27.            
  28.             if(!SQOFFBOARD(sq + 9) && PieceCol[pos->pieces[sq + 9]] == BLACK) {
  29.                 AddWhitePawnCapMove(pos, sq, sq+9, pos->pieces[sq + 9], list);
  30.             }  
  31.             if(!SQOFFBOARD(sq + 11) && PieceCol[pos->pieces[sq + 11]] == BLACK) {
  32.                 AddWhitePawnCapMove(pos, sq, sq+11, pos->pieces[sq + 11], list);
  33.             }
  34.            
  35.             if(sq + 9 == pos->enPas) {
  36.                 AddCaptureMove(pos, MOVE(sq,sq + 9,EMPTY,EMPTY,MFLAGEP), list);
  37.             }
  38.             if(sq + 11 == pos->enPas) {
  39.                 AddCaptureMove(pos, MOVE(sq,sq + 11,EMPTY,EMPTY,MFLAGEP), list);
  40.             }
  41.         }
  42.        
  43.         if(pos->castlePerm & WKCA) {
  44.             if(pos->pieces[F1] == EMPTY && pos->pieces[G1] == EMPTY) {
  45.                 if(!SqAttacked(E1,BLACK,pos) && !SqAttacked(F1,BLACK,pos) ) {
  46.                     AddQuietMove(pos, MOVE(E1, G1, EMPTY, EMPTY, MFLAGCA), list);
  47.                 }
  48.             }
  49.         }
  50.        
  51.         if(pos->castlePerm & WQCA) {
  52.             if(pos->pieces[D1] == EMPTY && pos->pieces[C1] == EMPTY && pos->pieces[B1] == EMPTY) {
  53.                 if(!SqAttacked(E1,BLACK,pos) && !SqAttacked(D1,BLACK,pos) ) {
  54.                     AddQuietMove(pos, MOVE(E1, C1, EMPTY, EMPTY, MFLAGCA), list);
  55.                 }
  56.             }
  57.         }
  58.        
  59.     } else {
  60.        
  61.         for(pceNum = 0; pceNum < pos->pceNum[bP]; ++pceNum) {
  62.             sq = pos->pList[bP][pceNum];
  63.             ASSERT(SqOnBoard(sq));
  64.            
  65.             if(pos->pieces[sq - 10] == EMPTY) {
  66.                 AddBlackPawnMove(pos, sq, sq-10, list);
  67.                 if(RanksBrd[sq] == RANK_7 && pos->pieces[sq - 20] == EMPTY) {
  68.                     AddQuietMove(pos, MOVE(sq,(sq-20),EMPTY,EMPTY,MFLAGPS),list);
  69.                 }
  70.             }
  71.            
  72.             if(!SQOFFBOARD(sq - 9) && PieceCol[pos->pieces[sq - 9]] == WHITE) {
  73.                 AddBlackPawnCapMove(pos, sq, sq-9, pos->pieces[sq - 9], list);
  74.             }
  75.            
  76.             if(!SQOFFBOARD(sq - 11) && PieceCol[pos->pieces[sq - 11]] == WHITE) {
  77.                 AddBlackPawnCapMove(pos, sq, sq-11, pos->pieces[sq - 11], list);
  78.             }
  79.            
  80.             if(sq - 9 == pos->enPas) {
  81.                 AddCaptureMove(pos, MOVE(sq,sq - 9,EMPTY,EMPTY,MFLAGEP), list);
  82.             }
  83.             if(sq - 11 == pos->enPas) {
  84.                 AddCaptureMove(pos, MOVE(sq,sq - 11,EMPTY,EMPTY,MFLAGEP), list);
  85.             }
  86.         }      
  87.        
  88.         // castling
  89.         if(pos->castlePerm &  BKCA) {
  90.             if(pos->pieces[F8] == EMPTY && pos->pieces[G8] == EMPTY) {
  91.                 if(!SqAttacked(E8,WHITE,pos) && !SqAttacked(F8,WHITE,pos) ) {
  92.                     AddQuietMove(pos, MOVE(E8, G8, EMPTY, EMPTY, MFLAGCA), list);
  93.                 }
  94.             }
  95.         }
  96.        
  97.         if(pos->castlePerm &  BQCA) {
  98.             if(pos->pieces[D8] == EMPTY && pos->pieces[C8] == EMPTY && pos->pieces[B8] == EMPTY) {
  99.                 if(!SqAttacked(E8,WHITE,pos) && !SqAttacked(D8,WHITE,pos) ) {
  100.                     AddQuietMove(pos, MOVE(E8, C8, EMPTY, EMPTY, MFLAGCA), list);
  101.                 }
  102.             }
  103.         }
  104.     }
  105.    
  106.     /* Loop for slide pieces */
  107.     pceIndex = LoopSlideIndex[side];
  108.     pce = LoopSlidePce[pceIndex++];
  109.     while( pce != 0) {
  110.         ASSERT(PieceValid(pce));       
  111.        
  112.         for(pceNum = 0; pceNum < pos->pceNum[pce]; ++pceNum) {
  113.             sq = pos->pList[pce][pceNum];
  114.             ASSERT(SqOnBoard(sq));
  115.            
  116.             for(index = 0; index < NumDir[pce]; ++index) {
  117.                 dir = PceDir[pce][index];
  118.                 t_sq = sq + dir;
  119.                
  120.                 while(!SQOFFBOARD(t_sq)) {             
  121.                     // BLACK ^ 1 == WHITE       WHITE ^ 1 == BLACK
  122.                     if(pos->pieces[t_sq] != EMPTY) {
  123.                         if( PieceCol[pos->pieces[t_sq]] == (side ^ 1)) {
  124.                             AddCaptureMove(pos, MOVE(sq, t_sq, pos->pieces[t_sq], EMPTY, 0), list);
  125.                         }
  126.                         break;
  127.                     }  
  128.                     AddQuietMove(pos, MOVE(sq, t_sq, EMPTY, EMPTY, 0), list);
  129.                     t_sq += dir;
  130.                 }
  131.             }
  132.         }
  133.        
  134.         pce = LoopSlidePce[pceIndex++];
  135.     }
  136.  
  137.     /* Loop for non slide */
  138.     pceIndex = LoopNonSlideIndex[side];
  139.     pce = LoopNonSlidePce[pceIndex++];
  140.    
  141.     while( pce != 0) {
  142.         ASSERT(PieceValid(pce));
  143.        
  144.         for(pceNum = 0; pceNum < pos->pceNum[pce]; ++pceNum) {
  145.             sq = pos->pList[pce][pceNum];
  146.             ASSERT(SqOnBoard(sq));
  147.            
  148.             for(index = 0; index < NumDir[pce]; ++index) {
  149.                 dir = PceDir[pce][index];
  150.                 t_sq = sq + dir;
  151.                
  152.                 if(SQOFFBOARD(t_sq)) {                 
  153.                     continue;
  154.                 }
  155.                
  156.                 // BLACK ^ 1 == WHITE       WHITE ^ 1 == BLACK
  157.                 if(pos->pieces[t_sq] != EMPTY) {
  158.                     if( PieceCol[pos->pieces[t_sq]] == (side ^ 1)) {
  159.                         AddCaptureMove(pos, MOVE(sq, t_sq, pos->pieces[t_sq], EMPTY, 0), list);
  160.                     }
  161.                     continue;
  162.                 }  
  163.                 AddQuietMove(pos, MOVE(sq, t_sq, EMPTY, EMPTY, 0), list);
  164.             }
  165.         }
  166.                
  167.         pce = LoopNonSlidePce[pceIndex++];
  168.     }
  169. }
  170.  
Advertisement
Add Comment
Please, Sign In to add comment