Example #1
0
/* generate pawn captures and promotions */
void genattacksp(int f, int r, int c)
{
    int forward = dir(c);
    square loc = SQ(f,r);

    r += forward;

    if (f<7)
    {
        chesspiece p = getpiece(f+1, r);
        if (p&&chesspiececolor(p)!=c)
            pushmove(MV(loc, SQ(f+1, r)));
    }

    if (f>0)
    {
        chesspiece p = getpiece(f-1,r);
        if (p&&chesspiececolor(p)!=c)
            pushmove(MV(loc, SQ(f-1, r)));
    }

    if (c==WHITE)
    {
        if ((r==6)&&emptyp(f,r))
            pushmove(MV(loc, SQ(f,r)));
    }
    else
    {
        if ((r==1)&&emptyp(f,r))
            pushmove(MV(loc, SQ(f,r)));
    }

    /* get en passante */
    if (doublepushp())
    {
        square start;
        square end;
        move m;

        m = lastmove();

        start = FR(m);
        end = TO(m);

        r -= forward;		/* restore to original r */
        if (R(end) == r)
        {
            if (((f+1) == F(start))||
                    ((f-1) == F(start)))
                pushmove(MV(loc, SQ(F(start),forward+r)));
        }
    }
}
Example #2
0
void genmoves_nocastles()
{
    int f,r;

    int col = tomove();
    for (f=0;f<8;f++)
    {
	for (r=0;r<8;r++)
	{
	    chesspiece p = getpiece(f,r);
	    if (p && (chesspiececolor(p) == col))
	    {
		int v = chesspiecevalue(p);
		if (v==king)
		{
		    getmovesk_nocastles(f,r,col);
		}
		else
		{
		    generators[v](f,r,col);
		}
	    }
	}
    }
}
Example #3
0
void getmovesn(int f, int r, int c)
{
    int i, nf, nr;
    int o;
    chesspiece p;
    square s1;

    s1 = SQ(f,r);
    o = opp(c);

    for (i=0;i<8;i++)
    {
	nf = f+df[i];
	nr = r+dr[i];

	if (offboardp(nf,nr))
	    continue;

	p = getpiece(nf, nr);
	if (!p || (c != chesspiececolor(p)))
	{
	    pushmove(MV(s1, SQ(nf, nr)));
	}
    }
}
Example #4
0
void getsliders(int f, int r, int df, int dr, int color)
{
    square s1 = SQ(f,r);
    chesspiece p;
    
    for (;;)
    {
	f += df;
	r += dr;

	if (offboardp(f,r)) return;
	
	p = getpiece(f,r);
	
	if (p == empty)
	    pushmove(MV(s1, SQ(f,r)));
	else if (chesspiececolor(p)==color)
	    return;
	else
	{
	    pushmove(MV(s1, SQ(f,r)));
	    return;
	}
    }
}
Example #5
0
void gensliderattacksDEC(square s, int dd, int color)
{
    chesspiece p;
    square s2 = s;

    for (;;)
    {
        s2 += dd;		/* dd should be negative */

        if ((s2&001)==0)	/* if at RANK 8 then we have looped  */
            break;
        if ((s2&~(077))!=0)
            break;

        p = getpiece__(s2);

        if (p)
        {
            if (chesspiececolor(p) != color)
            {
                pushmove(MV(s, s2));
                return;
            }
            return;
        }
    }
}
Example #6
0
void gensliderattacksINC(square s, int dd, int color)
{
    chesspiece p;
    square s2 = s;

    for (;;)
    {
        s2 += dd;

        if ((s2&007)==0)	/* if at RANK 1 we have looped */
            break;
        if ((s2&~(077))!=0)
            break;

        p = getpiece__(s2);

        if (p)
        {
            if (chesspiececolor(p) != color)
            {
                pushmove(MV(s, s2));
                return;
            }
            return;
        }
    }
}
Example #7
0
void gensliderattacks(int f, int r, int df, int dr, int color)
{
    chesspiece p;
    square s1=SQ(f,r);

    for (;;)
    {
        f += df;
        r += dr;

        if (offboardp (f,r)) return;

        p = getpiece(f,r);

        if (p)
        {
            if (chesspiececolor(p) != color)
            {
                pushmove(MV(s1, SQ(f,r)));
                return;
            }
            return;
        }
    }
}
Example #8
0
void genmoves()
{
    int f,r;

    int col = tomove();
    for (f=0; f<8; f++)
        for (r=0; r<8; r++)
        {
            chesspiece p = getpiece(f,r);
            if (p && (chesspiececolor(p) == col))
            {
                int v = chesspiecevalue(p);
                generators[v](f,r,col);
            }
        }
}
Example #9
0
void genattacks()
{
    int f,r;

    int col = tomove();
    for (f=0; f<8; f++)
        for (r=0; r<8; r++)
        {
            chesspiece p = getpiece(f,r);

            if (p && (chesspiececolor(p)==col))
            {
                int v;
                v = chesspiecevalue(p);
                attackgens[v](f,r,col);
            }
        }
}
Example #10
0
void cmd_board(char *s)
{
    int f,r;
    for (r=7;r>=0;r--)
    {
	for (f=0;f<8;f++)
	{
	    chesspiece p=getpiece(f,r);
	    printf("%c %2d %2d\t", rep(p),
		   chesspiececolor(p), chesspiecevalue(p));
	}
	printf("\n");
    }
    printf("piece counts [%2d %2d]\n", board->piececount[0], board->piececount[1]);
    
    for (f=WPAWN;f<=BKING;f++)
    {
	printf("%c = %2d\n", rep(f), board->pieces[f]);
    }
}
Example #11
0
void getmovesk_nocastles(int f, int r, int c)
{
    int df, dr, nf, nr;
    int o;
    chesspiece p;
    
    square s1 = SQ(f,r);
    o = opp(c);
    
    for (df=-1;df<2;df++)
    for (dr=-1;dr<2;dr++)
    {
	if (!df && !dr) continue;
	
	nf = f+df;
	nr = r+dr;
	p = getpiece(nf, nr);
	if (!offboardp(nf, nr) && (!p || (c != chesspiececolor(p))))
	    pushmove(MV(s1, SQ(nf, nr)));
    }
}
Example #12
0
void getmovesk(int f, int r, int c)
{
    int df, dr, nf, nr;
    int o;
    chesspiece p;

    square s1 = SQ(f,r);
    o = opp(c);

    for (df=-1; df<2; df++)
        for (dr=-1; dr<2; dr++)
        {
            if (!df && !dr) continue;

            nf = f+df;
            nr = r+dr;
            p = getpiece(nf, nr);
            if (!offboardp(nf, nr) && (!p || (c != chesspiececolor(p))))
                pushmove(MV(s1, SQ(nf, nr)));
        }

    if (c==WHITE)
    {
        if (wqcastlep()&&
                !getpiece__(D1)&&
                !getpiece__(C1)&&
                !getpiece__(B1)&&
                !incheckp(c)&&
                !wouldbeincheckp(THRUWQ))
        {
            pushmove(WQC);
        }
        if (wkcastlep()&&
                !getpiece__(F1)&&
                !getpiece__(G1)&&
                !incheckp(c)&&
                !wouldbeincheckp(THRUWK))
        {
            pushmove(WKC);
        }
    }
    else
    {
        if (bqcastlep()&&
                !getpiece__(D8)&&
                !getpiece__(C8)&&
                !getpiece__(B8)&&
                !incheckp(c)&&
                !wouldbeincheckp(THRUBQ))
        {
            pushmove(BQC);
        }
        if (bkcastlep()&&
                !getpiece__(F8)&&
                !getpiece__(G8)&&
                !incheckp(c)&&
                !wouldbeincheckp(THRUBK))
        {
            pushmove(BKC);
        }
    }
}