Exemple #1
0
void PrintRecord(Gamerec *g)
{

int i, len, count;
unsigned char xside;
Position temp;

if(g->moves[0].mtype == EMPTY)  {
  printf("\nGame record is empty.\n");
  return;  }

StartPosition(&temp);

printf("\n***** GAME RECORD *****\n");

for(len = 1; len < MAXGAMESIZE; len++)  {
  if(g->moves[(len*(len-1)/2)].mtype != EMPTY) printf("\n     %2d. ", len);
  count = 0;
  if(temp.side == WHITE) xside = BLACK;
  else xside = WHITE;
  while(count < len && !IsCheck(&temp, xside))  {
    i = len * (len - 1) / 2 + count;
    if(g->moves[i].mtype != EMPTY)   {
      PrintMove(&temp, &(g->moves[i]));
      MakeMove(&temp, &(g->moves[i]));  }
    else  {
      printf("\n");
      return;  }
    count++;  
    }
  if(temp.side == WHITE) temp.side = BLACK;
  else temp.side = WHITE;
  }
}
Exemple #2
0
BOOL CALLBACK SettingsProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_INITDIALOG:
		SetWindowText(GetDlgItem(hWnd, IDC_EMUPATH), set.emupath);
		SendMessage(GetDlgItem(hWnd, IDC_LOADROMSTARTUP), BM_SETCHECK, set.romAtStartup, NULL);
		break;
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDC_ERASEEMUPATH:
			set.emupath[0] = '\0';
			SetWindowText(GetDlgItem(hWnd, IDC_EMUPATH), "");
			break;
		case IDC_LOADROMSTARTUP:
			set.romAtStartup = IsCheck(IDC_LOADROMSTARTUP);
			set.romAtStartup = set.romAtStartup;
			break;
		}
		break;
	case WM_CLOSE:
		EndDialog(hWnd, 0);
		break;
	}
	return 0;
}
Exemple #3
0
void Shogi::SetGenInfoPin( GEN_INFO& info ){
/************************************************
GEN_INFOの初期化(王手とピン)
************************************************/
	// 既に調べた事がある場合はそれを使う。
	if( kifu[know].chdir == NOJUDGE_CHECK ){
		kifu[know].chdir = info.check = IsCheck( &info.cnt, &info.pin );
		kifu[know].cnt = info.cnt;
		kifu[know].pin = info.pin;
	}
	else{
		info.check = kifu[know].chdir;
		info.cnt = kifu[know].cnt;
		info.pin = kifu[know].pin;
	}
}
void PrintDebugAI(PokerAI *ai, VarTran_t h, int flag, int type) {
#if DEBUG_AI
	
	h = VarTran(ai);

	char *CARDS[] = {"XX",                                                  \
	"2S", "2C", "2D", "2H", "3S", "3C", "3D", "3H", "4S", "4C", "4D", "4H", \
	"5S", "5C", "5D", "5H", "6S", "6C", "6D", "6H", "7S", "7C", "7D", "7H", \
	"8S", "8C", "8D", "8H", "9S", "9C", "9D", "9H", "TS", "TC", "TD", "TH", \
	"JS", "JC", "JD", "JH", "QS", "QC", "QD", "QH", "KS", "KC", "KD", "KH", \
	"AS", "AC", "AD", "AH"                                                  \
	};
	char action[20] = "";
	int  actionamount= ai->action.amount;
	int  mynewpot = 0;
	sprintf(action, "%s", ActionGetStringNoHuanHang(&(ai->action)));
	
	//if (h.grp <= 7.0) {
	if (flag || h.round == 600 || h.stack+h.money<=3*h.BB) {
		printf("{%dof%d|%d|%3dr}", h.my_pos, h.noPlayers, h.noPlaying, h.round);
		
		if (type == 0) {
			//preflop
			printf("{ pv:%2d          }", h.pv);
		} else {
			//flop
			printf("{ wp:%4.2f|eg:%4.1f}", h.wp, h.eg);
		}
		
		printf("{pos%d-%d|act:%dc,%dr,%drc}", h.pos, h.pos_type, h.call_no, h.raise_no, h.raise_no_c);
		
		printf("{%.15s:", action);
		if (IsFold()) {
			mynewpot = h.current_bet;
			printf("|%4dcXX>%4d", h.call_amount, mynewpot);
		}
		if (IsCall()) {
			mynewpot = h.call_amount+h.current_bet;
			printf("|%4dc-->%4d", h.call_amount, mynewpot);
		}
		if (IsCheck()){
			mynewpot = h.current_bet;
			printf("|%4db==>%4d", 0, mynewpot);
		}
		if (IsBet()){
			mynewpot = actionamount+h.call_amount+h.current_bet;
			printf("|%4db++>%4d", h.raise_amount, mynewpot);
		}		
		if (IsAllin()) {
			mynewpot = h.stack+h.current_bet;
			printf("|%4db!!>%4d", h.raise_amount, mynewpot);		
		}
		printf("}");
		
		printf("-[pot:%4d|sk%5d|c_m%4d|r_m%4d]", h.pot, h.stack, h.call_amount, h.raise_amount);
		
		printf("-[%2s %2s ", CARDS[ai->game.hand[0]], CARDS[ai->game.hand[1]]);
		
		if (type == 0) {
			//preflop
			
		} else {
			//flop
			//printf("| ");
			for (int i = 0; i < ai->game.communitysize; i++) {
				printf("%2s ", CARDS[ai->game.community[i]]);
			}			
		}
		printf("\b]\n");
	}	
#endif	
}
Exemple #5
0
int AnyLegalMoves(Position *pos)  {

int i, j, x, y, direc;
unsigned char side = pos->side, xside;
SQUARE board[12][12];
Listnode l, *ml = &l;

ClearMoves(ml);
for(i = 0; i < MAXLEGAL; i++) {
  ml->moves[i].oldep = pos->epstatus;
  ml->moves[i].oldcastle = pos->castle;  }

if(side == WHITE)  {
  xside = BLACK;  direc = 1;  }
else {
  xside = WHITE;  direc = -1;  }

memcpy(&(board[0][0]), &(pos->board[0][0]), sizeof(SQUARE) * 144);

for(i = 2; i < 10; i++)
  for(j = 2; j < 10; j++)  {
    if(board[i][j] != 0 && (board[i][j] & side))  {
      if(board[i][j] & KNIGHT)  {
        x = -1; y = -2;
	if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
        x = -1; y = 2;
        if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
        x = 1; y = -2;
	if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
      	x = 1; y = 2;
	if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
       	x = -2; y = -1;
	if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
        x = -2; y = 1;
	if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
        x = 2; y = -1;
	if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
        x = 2; y = 1;
	if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
      }
      if((board[i][j] & BISHOP) || (board[i][j] & QUEEN))  {
        for(x = 1; (board[i-x][j-x] != OFFBOARD) && (!(board[i-x][j-x] & side)); x++)
          if(board[i-x][j-x] & xside)  {  
            AddMove(ml, i, j, i-x, j-x, CAPTURE);
            break;  }
	  else AddMove(ml, i, j, i-x, j-x, NORMAL);
        for(x = 1; (board[i-x][j+x] != OFFBOARD) && (!(board[i-x][j+x] & side)); x++)
          if(board[i-x][j+x] & xside)  {  
            AddMove(ml, i, j, i-x, j+x, CAPTURE);
            break;  }
	  else AddMove(ml, i, j, i-x, j+x, NORMAL);
        for(x = 1; (board[i+x][j-x] != OFFBOARD) && (!(board[i+x][j-x] & side)); x++)
          if(board[i+x][j-x] & xside)  {  
            AddMove(ml, i, j, i+x, j-x, CAPTURE);
            break;  }
	  else AddMove(ml, i, j, i+x, j-x, NORMAL);
        for(x = 1; (board[i+x][j+x] != OFFBOARD) && (!(board[i+x][j+x] & side)); x++)
          if(board[i+x][j+x] & xside)  {  
            AddMove(ml, i, j, i+x, j+x, CAPTURE);
            break;  }
	  else AddMove(ml, i, j, i+x, j+x, NORMAL);
      }
      if((board[i][j] & ROOK) || (board[i][j] & QUEEN))  {
        for(x = 1; (board[i-x][j] != OFFBOARD) && (!(board[i-x][j] & side)); x++)
          if(board[i-x][j] & xside) {
            AddMove(ml, i, j, i-x, j, CAPTURE);
            break;  }
          else AddMove(ml, i, j, i-x, j, NORMAL);
        for(x = 1; (board[i+x][j] != OFFBOARD) && (!(board[i+x][j] & side)); x++)
          if(board[i+x][j] & xside) {
            AddMove(ml, i, j, i+x, j, CAPTURE);
            break;  }
          else AddMove(ml, i, j, i+x, j, NORMAL);
        for(x = 1; (board[i][j-x] != OFFBOARD) && (!(board[i][j-x] & side)); x++)
          if(board[i][j-x] & xside) {
            AddMove(ml, i, j, i, j-x, CAPTURE);
            break;  }
          else AddMove(ml, i, j, i, j-x, NORMAL);
        for(x = 1; (board[i][j+x] != OFFBOARD) && (!(board[i][j+x] & side)); x++)
          if(board[i][j+x] & xside) {
            AddMove(ml, i, j, i, j+x, CAPTURE);
            break;  }
          else AddMove(ml, i, j, i, j+x, NORMAL);
      }
      if(board[i][j] & KING)  {
        for(x = -1; x <= 1; x++)
          for(y = -1; y <= 1; y++)  {
            if(x == 0 && y == 0) continue;
            if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
              if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
              else AddMove(ml, i, j, i+x, j+y, NORMAL);
            }
          }
        }
      if(board[i][j] & PAWN)  {
        if(board[i][j+direc] == 0) {
          if((direc == -1 && j == 3) || (direc == 1 && j == 8))
            AddMove(ml, i, j, i, j+direc, PROMOTE);
          else AddMove(ml, i, j, i, j+direc, NORMAL);
        }
        if((direc == -1 && j == 8) || (direc == 1 && j == 3)) 
          if(board[i][j+direc+direc] == 0 && board[i][j+direc] == 0) 
            AddMove(ml, i, j, i, j+direc+direc, TWOMOVE);
        if((board[i-1][j+direc] != OFFBOARD) && (board[i-1][j+direc] & xside)) {
          if((direc == -1 && j == 3) || (direc == 1 && j == 8))
            AddMove(ml, i, j, i-1, j+direc, PROMCAP);
          else AddMove(ml, i, j, i-1, j+direc, CAPTURE);      
        }
        if((board[i+1][j+direc] != OFFBOARD) && (board[i+1][j+direc] & xside)) {
          if((direc == -1 && j == 3) || (direc == 1 && j == 8))
            AddMove(ml, i, j, i+1, j+direc, PROMCAP);
          else AddMove(ml, i, j, i+1, j+direc, CAPTURE); 
        }
        if(pos->epstatus > 0 && direc == 1)  /* there is at least one ep square */  {
          if(j == 6 && IsEpSquare(i-1, 6, pos->epstatus) == 1 && board[i-1][j+direc] == 0)
            AddMove(ml, i, j, i-1, j+direc, ENPASSANT);
          if(j == 6 && IsEpSquare(i+1, 6, pos->epstatus) == 1 && board[i+1][j+direc] == 0)
            AddMove(ml, i, j, i+1, j+direc, ENPASSANT);
        }

        if(pos->epstatus > 0 && direc == -1)  {
          if(j == 5 && IsEpSquare(i-1, 5, pos->epstatus) == 1 && board[i-1][j+direc] == 0)
            AddMove(ml, i, j, i-1, j+direc, ENPASSANT);
          if(j == 5 && IsEpSquare(i+1, 5, pos->epstatus) == 1 && board[i+1][j+direc] == 0)
            AddMove(ml, i, j, i+1, j+direc, ENPASSANT);   
         }

      }

      for(x = 0; ml->moves[x].mtype != EMPTY; x++)  {
        MakeMove(pos, &(ml->moves[x]));
        if(IsCheck(pos, side) == 1)  {
          UnmakeMove(pos, &(ml->moves[x]));
          ml->moves[x].mtype = EMPTY;
          ml->num--;  }
        else UnmakeMove(pos, &(ml->moves[x]));
        }

        if(ml->num > 0) {   return 1;  }

      }
    }

return 0;

}
Exemple #6
0
void GenerateMoves(Listnode *ml, Position *pos)
{

int i, j, x, y, direc, cancastle;
unsigned char side = pos->side, xside;
SQUARE board[12][12];

if(side == WHITE)  {
  xside = BLACK;  direc = 1;  }
else {
  xside = WHITE;  direc = -1;  }

ClearMoves(ml);
for(i = 0; i < MAXLEGAL; i++) {
  ml->moves[i].oldep = pos->epstatus;
  ml->moves[i].oldcastle = pos->castle;  }

memcpy(&(board[0][0]), &(pos->board[0][0]), sizeof(SQUARE) * 144);

for(i = 2; i < 10; i++)  {
  for(j = 2; j < 10; j++)  {
    if(board[i][j] != 0 && (board[i][j] & side))  {
      if(board[i][j] & KNIGHT)  {
        x = -1; y = -2;
	if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
        x = -1; y = 2;
        if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
        x = 1; y = -2;
	if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
      	x = 1; y = 2;
	if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
       	x = -2; y = -1;
	if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
        x = -2; y = 1;
	if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
        x = 2; y = -1;
	if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
        x = 2; y = 1;
	if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
      }
      if((board[i][j] & BISHOP) || (board[i][j] & QUEEN))  {
        for(x = 1; (board[i-x][j-x] != OFFBOARD) && (!(board[i-x][j-x] & side)); x++)
          if(board[i-x][j-x] & xside)  {  
            AddMove(ml, i, j, i-x, j-x, CAPTURE);
            break;  }
	  else AddMove(ml, i, j, i-x, j-x, NORMAL);
        for(x = 1; (board[i-x][j+x] != OFFBOARD) && (!(board[i-x][j+x] & side)); x++)
          if(board[i-x][j+x] & xside)  {  
            AddMove(ml, i, j, i-x, j+x, CAPTURE);
            break;  }
	  else AddMove(ml, i, j, i-x, j+x, NORMAL);
        for(x = 1; (board[i+x][j-x] != OFFBOARD) && (!(board[i+x][j-x] & side)); x++)
          if(board[i+x][j-x] & xside)  {  
            AddMove(ml, i, j, i+x, j-x, CAPTURE);
            break;  }
	  else AddMove(ml, i, j, i+x, j-x, NORMAL);
        for(x = 1; (board[i+x][j+x] != OFFBOARD) && (!(board[i+x][j+x] & side)); x++)
          if(board[i+x][j+x] & xside)  {  
            AddMove(ml, i, j, i+x, j+x, CAPTURE);
            break;  }
	  else AddMove(ml, i, j, i+x, j+x, NORMAL);
        }
      if((board[i][j] & ROOK) || (board[i][j] & QUEEN))  {
        for(x = 1; (board[i-x][j] != OFFBOARD) && (!(board[i-x][j] & side)); x++)
          if(board[i-x][j] & xside) {
            AddMove(ml, i, j, i-x, j, CAPTURE);
            break;  }
          else AddMove(ml, i, j, i-x, j, NORMAL);
        for(x = 1; (board[i+x][j] != OFFBOARD) && (!(board[i+x][j] & side)); x++)
          if(board[i+x][j] & xside) {
            AddMove(ml, i, j, i+x, j, CAPTURE);
            break;  }
          else AddMove(ml, i, j, i+x, j, NORMAL);
        for(x = 1; (board[i][j-x] != OFFBOARD) && (!(board[i][j-x] & side)); x++)
          if(board[i][j-x] & xside) {
            AddMove(ml, i, j, i, j-x, CAPTURE);
            break;  }
          else AddMove(ml, i, j, i, j-x, NORMAL);
        for(x = 1; (board[i][j+x] != OFFBOARD) && (!(board[i][j+x] & side)); x++)
          if(board[i][j+x] & xside) {
            AddMove(ml, i, j, i, j+x, CAPTURE);
            break;  }
          else AddMove(ml, i, j, i, j+x, NORMAL);
        }
      if(board[i][j] & KING)  {
        for(x = -1; x <= 1; x++)
          for(y = -1; y <= 1; y++)  {
            if(x == 0 && y == 0) continue;
            if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
              if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
              else AddMove(ml, i, j, i+x, j+y, NORMAL);
            }
          }
        }
      if(board[i][j] & PAWN)  {
        if(board[i][j+direc] == 0) {
          if((direc == -1 && j == 3) || (direc == 1 && j == 8))
            AddMove(ml, i, j, i, j+direc, PROMOTE);
          else AddMove(ml, i, j, i, j+direc, NORMAL);
        }
        if((direc == -1 && j == 8) || (direc == 1 && j == 3))
          if(board[i][j+direc+direc] == 0 && board[i][j+direc] == 0) 
            AddMove(ml, i, j, i, j+direc+direc, TWOMOVE);
        if((board[i-1][j+direc] != OFFBOARD) && (board[i-1][j+direc] & xside)) {
          if((direc == -1 && j == 3) || (direc == 1 && j == 8))
            AddMove(ml, i, j, i-1, j+direc, PROMCAP);
          else AddMove(ml, i, j, i-1, j+direc, CAPTURE);      
        }
        if((board[i+1][j+direc] != OFFBOARD) && (board[i+1][j+direc] & xside)) {
          if((direc == -1 && j == 3) || (direc == 1 && j == 8))
            AddMove(ml, i, j, i+1, j+direc, PROMCAP);
          else AddMove(ml, i, j, i+1, j+direc, CAPTURE); 
        }
        /* there is at least one ep square */  
        if(pos->epstatus > 0 && direc == 1) {
          if(j == 6 && IsEpSquare(i-1, 6, pos->epstatus) == 1 && board[i-1][j+direc] == 0)
            AddMove(ml, i, j, i-1, j+direc, ENPASSANT);
          if(j == 6 && IsEpSquare(i+1, 6, pos->epstatus) == 1 && board[i+1][j+direc] == 0)
            AddMove(ml, i, j, i+1, j+direc, ENPASSANT);
        }

        if(pos->epstatus > 0 && direc == -1)  {
          if(j == 5 && IsEpSquare(i-1, 5, pos->epstatus) == 1 && board[i-1][j+direc] == 0)
            AddMove(ml, i, j, i-1, j+direc, ENPASSANT);
          if(j == 5 && IsEpSquare(i+1, 5, pos->epstatus) == 1 && board[i+1][j+direc] == 0)
            AddMove(ml, i, j, i+1, j+direc, ENPASSANT);   
        }
      }
    }
  }
}

if((pos->castle & WKC) && side == WHITE)  {
  cancastle = 1;
  for(i = KFILE; i <= 8; i++) 
    if(Attacked(pos, i, 2, xside) == 1) cancastle = 0;
  for(i = Minval(7, KFILE); i <= 8; i++)
    if(i != KFILE && i != KRFILE && board[i][2] != 0) cancastle = 0;
 if(cancastle == 1)
    AddMove(ml, KFILE, 2, 8, 2, KSCASTLE);  }
if((pos->castle & BKC) && side == BLACK)  {
  cancastle = 1;
  for(i = KFILE; i <= 8; i++) 
    if(Attacked(pos, i, 9, xside) == 1) cancastle = 0;
  for(i = Minval(7, KFILE); i <= 8; i++)
    if(i != KFILE && i != KRFILE && board[i][9] != 0) cancastle = 0;
 if(cancastle == 1)
    AddMove(ml, KFILE, 9, 8, 9, KSCASTLE);  }
if((pos->castle & WQC) && side == WHITE)  {
  cancastle = 1;
  for(i = Minval(4, KFILE); i <= Maxval(4, KFILE); i++) 
    if(Attacked(pos, i, 2, xside) == 1) cancastle = 0;
  for(i = Minval(QRFILE + 1, 4); i <= Maxval(5, KFILE); i++)
    if(i != KFILE && i != QRFILE && board[i][2] != 0) cancastle = 0;
 if(cancastle == 1)
    AddMove(ml, KFILE, 2, 4, 2, QSCASTLE);  }
if((pos->castle & BQC) && side == BLACK)  {
  cancastle = 1;
  for(i = Minval(4, KFILE); i <= Maxval(4, KFILE); i++) 
    if(Attacked(pos, i, 9, xside) == 1) cancastle = 0;
  for(i = Minval(QRFILE + 1, 4); i <= Maxval(5, KFILE); i++)
    if(i != KFILE && i != QRFILE && board[i][9] != 0) cancastle = 0;
 if(cancastle == 1)
    AddMove(ml, KFILE, 9, 4, 9, QSCASTLE);  }

for(i = 0; ml->moves[i].mtype != EMPTY; i++)  {
  MakeMove(pos, &(ml->moves[i]));
  if(IsCheck(pos, side) == 1)  {
    UnmakeMove(pos, &(ml->moves[i]));
    ml->moves[i].mtype = EMPTY;
    ml->num--;  }
  else UnmakeMove(pos, &(ml->moves[i]));
  }

}