Example #1
0
static bool kbpk_draw (int wp, int wb, int bk) {

   ASSERT(SQUARE_IS_OK(wp));
   ASSERT(SQUARE_IS_OK(wb));
   ASSERT(SQUARE_IS_OK(bk));

   if (SQUARE_FILE(wp) == FileA
    && DISTANCE(bk,A8) <= 1
    && SQUARE_COLOUR(wb) != SQUARE_COLOUR(A8)) {
      return true;
   }

   return false;
}
Example #2
0
bool move_is_pseudo( int move, board_t *board )
{

	int me, opp;
	int from, to;
	int piece, capture;

	ASSERT(move_is_ok(move));
	ASSERT(board != NULL);
	// init

	me = board->turn;
	opp = COLOUR_OPP(board->turn);

	// from

	from = MOVE_FROM(move);
	ASSERT(SQUARE_IS_OK(from));

	piece = board->square[from];	
	if(INDEX_TO_COLOUR(piece) != me)
		return false;

	// to
	to = MOVE_TO(move);
	ASSERT(SQUARE_IS_OK(to));

	capture = board->square[to];	
	if( INDEX_TO_COLOUR(capture) == me )
		return false;

	// move 
	switch(INDEX_TO_PIECE(piece))
	{
	case RedKing:
		if(KING_IN_CITY(to) && KLegalDt[to - from + 256]) return true;
		if(EQUAL_FILE(from, to) && INDEX_TO_PIECE(capture) == BlackKing)
		{
			int row=SQUARE_RANK(from) - 3;
			int col=SQUARE_FILE(from) - 3;
			if(FileCapMin[row][board->file[col]] + col == to) return true;
		}

		return false;

	case BlackKing:
		if(KING_IN_CITY(to) && KLegalDt[to - from + 256]) return true;
		if(EQUAL_FILE(from, to) && INDEX_TO_PIECE(capture) ==RedKing)
		{
			int row=SQUARE_RANK(from) - 3;
			int col=SQUARE_FILE(from) - 3;
			if(FileCapMax[row][board->file[col]] + col == to) return true;
		}

		return false;

	case RedAdvisor:
	case BlackAdvisor:
		if(ADVISOR_IN_CITY(to) && ALegalDt[to - from + 256]) return true;
		return false;

	case RedBishop:
	case BlackBishop:
		if(BISHOP_IN_CITY(to) &&
			BLegalDt[to - from + 256] &&
			board->square[(to + from) >> 1] == PieceNone)//
			return true;
		return false;

	case RedKnight:
	case BlackKnight:
		if(NLegalDt[to - from + 256] && board->square[from + NLegalDt[to - from + 256]] == PieceNone)//
			return true;
		return false;

	case RedRook:
	case BlackRook:
		if(capture)
		{
			if(EQUAL_FILE(from, to))
			{
				int row=SQUARE_RANK(from) - 3;
				int col=SQUARE_FILE(from) - 3;
				if(FileCapMax[row][board->file[col]] + col == to || FileCapMin[row][board->file[col]] + col == to)
					return true;
			}
			else if(EQUAL_RANK(from, to))
			{
				int row=SQUARE_RANK(from) - 3;
				int col=SQUARE_FILE(from) - 3;
				if(RankCapMax[col][board->rank[row]] + (row << 4) == to ||
					RankCapMin[col][board->rank[row]] + (row << 4) == to)
					return true;
			}

		}
		else
		{
			int row=SQUARE_RANK(from) - 3;
			int col=SQUARE_FILE(from) - 3;
			int to_row = SQUARE_RANK(to) - 3;
			int to_col = SQUARE_FILE(to) - 3;
			int rowbit = board->rank[row];
			int colbit = board->file[col];
			if(EQUAL_FILE(from, to))
			{
				//if(FileNonCapMin[row][board->file[col]] + col <= to && to <= FileNonCapMax[row][board->file[col]] + col)
                if(PinNb[row][to_row][colbit] == 0)
					return true;
			}
			else if(EQUAL_RANK(from, to))
			{
				//if(RankNonCapMin[col][board->rank[row]] + (row << 4) <= to && to <= RankNonCapMax[col][board->rank[row]] + (row << 4))
				 if(PinNb[col][to_col][rowbit] == 0)
				    return true;
			}

		}

		return false;

	case RedCannon:
	case BlackCannon:
		if(capture)
		{
			if(EQUAL_RANK(from, to))
			{
				int row=SQUARE_RANK(from) - 3;
				int col=SQUARE_FILE(from) - 3;
				if(CannonRankCapMax[col][board->rank[row]] + (row << 4) == to ||
					CannonRankCapMin[col][board->rank[row]] + (row << 4) == to)
					return true;
			}
			else if(EQUAL_FILE(from, to))
			{
				int row=SQUARE_RANK(from) - 3;
				int col=SQUARE_FILE(from) - 3;
				if(CannonFileCapMax[row][board->file[col]] + col == to ||
					CannonFileCapMin[row][board->file[col]] + col == to)
					return true;
			}
		}
		else
		{
			int row=SQUARE_RANK(from) - 3;
			int col=SQUARE_FILE(from) - 3;
			int to_row = SQUARE_RANK(to) - 3;
			int to_col = SQUARE_FILE(to) - 3;
			int rowbit = board->rank[row];
			int colbit = board->file[col];

			if(EQUAL_RANK(from, to))
			{
				//if(RankNonCapMin[col][board->rank[row]] + (row << 4) <= to && to <= RankNonCapMax[col][board->rank[row]] + (row << 4))
				if(PinNb[col][to_col][rowbit] == 0)
					return true;
			}
			else if(EQUAL_FILE(from, to))
			{
				//if(FileNonCapMin[row][board->file[col]] + col <= to&& to <= FileNonCapMax[row][board->file[col]] + col)
				if(PinNb[row][to_row][colbit] == 0)
					return true;
			}
		}

		return false;

	case BlackPawn:

		if((from + 16) == to) return true;
		if(SQUARE_COLOUR(from) == Red)
		{
			if((from - 1) == to || (from + 1) == to)
				return true;
		}

		return false;

	case RedPawn:

		if((from - 16) == to) return true;
		if(SQUARE_COLOUR(from) == Black)
		{
			if((from - 1) == to || (from + 1) == to)
				return true;
		}

	default:
		return false;
	}


	return false;
}
Example #3
0
bool recog_draw(const board_t * board, int ThreadId) {

   material_info_t mat_info[1];

   ASSERT(board!=NULL);

   // material

   if (board->piece_nb > 4) return false;

   material_get_info(mat_info,board,ThreadId);

   if ((mat_info->flags & DrawNodeFlag) == 0) return false;

   // recognisers

   if (false) {

   } else if (mat_info->recog == MAT_KK) {

      // KK

      return true;

   } else if (mat_info->recog == MAT_KBK) {

      // KBK (white)

      return true;

   } else if (mat_info->recog == MAT_KKB) {

      // KBK (black)

      return true;

   } else if (mat_info->recog == MAT_KNK) {

      // KNK (white)

      return true;

   } else if (mat_info->recog == MAT_KKN) {

      // KNK (black)

      return true;

   } else if (mat_info->recog == MAT_KPK) {

      // KPK (white)

      int me, opp;
      int wp, wk, bk;

      me = White;
      opp = COLOUR_OPP(me);

      wp = board->pawn[me][0];
      wk = KING_POS(board,me);
      bk = KING_POS(board,opp);

      if (SQUARE_FILE(wp) >= FileE) {
         wp = SQUARE_FILE_MIRROR(wp);
         wk = SQUARE_FILE_MIRROR(wk);
         bk = SQUARE_FILE_MIRROR(bk);
      }

      if (kpk_draw(wp,wk,bk,board->turn)) {
         return true;
      }

   } else if (mat_info->recog == MAT_KKP) {

      // KPK (black)

      int me, opp;
      int wp, wk, bk;

      me = Black;
      opp = COLOUR_OPP(me);

      wp = SQUARE_RANK_MIRROR(board->pawn[me][0]);
      wk = SQUARE_RANK_MIRROR(KING_POS(board,me));
      bk = SQUARE_RANK_MIRROR(KING_POS(board,opp));

      if (SQUARE_FILE(wp) >= FileE) {
         wp = SQUARE_FILE_MIRROR(wp);
         wk = SQUARE_FILE_MIRROR(wk);
         bk = SQUARE_FILE_MIRROR(bk);
      }

      if (kpk_draw(wp,wk,bk,COLOUR_OPP(board->turn))) {
         return true;
      }

   } else if (mat_info->recog == MAT_KBKB) {

      // KBKB

      int wb, bb;

      wb = board->piece[White][1];
      bb = board->piece[Black][1];

      if (SQUARE_COLOUR(wb) == SQUARE_COLOUR(bb)) { // bishops on same colour
         return true;
      }

   } else if (mat_info->recog == MAT_KBPK) {

      // KBPK (white)

      int me, opp;
      int wp, wb, bk;

      me = White;
      opp = COLOUR_OPP(me);

      wp = board->pawn[me][0];
      wb = board->piece[me][1];
      bk = KING_POS(board,opp);

      if (SQUARE_FILE(wp) >= FileE) {
         wp = SQUARE_FILE_MIRROR(wp);
         wb = SQUARE_FILE_MIRROR(wb);
         bk = SQUARE_FILE_MIRROR(bk);
      }

      if (kbpk_draw(wp,wb,bk)) return true;

   } else if (mat_info->recog == MAT_KKBP) {

      // KBPK (black)

      int me, opp;
      int wp, wb, bk;

      me = Black;
      opp = COLOUR_OPP(me);

      wp = SQUARE_RANK_MIRROR(board->pawn[me][0]);
      wb = SQUARE_RANK_MIRROR(board->piece[me][1]);
      bk = SQUARE_RANK_MIRROR(KING_POS(board,opp));

      if (SQUARE_FILE(wp) >= FileE) {
         wp = SQUARE_FILE_MIRROR(wp);
         wb = SQUARE_FILE_MIRROR(wb);
         bk = SQUARE_FILE_MIRROR(bk);
      }

      if (kbpk_draw(wp,wb,bk)) return true;

   } else {

      ASSERT(false);
   }

   return false;
}