Exemple #1
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)));
	}
    }
}
Exemple #2
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;
	}
    }
}
Exemple #3
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;
        }
    }
}
Exemple #4
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)));
    }
}
Exemple #5
0
move easydecode(char *str)
{
    if (!strcmp(str,"o")||!strcmp(str,"o-o")||
	!strcmp(str,"0-0")||!strcmp("O-O",str))
    {
	return (tomove() == WHITE) ? WKC : BKC;
    }

    if (!strcmp(str,"o-")||!strcmp(str,"o-o-o")||
	!strcmp(str,"0-0-0")||!strcmp("O-O-O",str))
    {
	return (tomove() == WHITE) ? WQC : BQC;
    }

    strip(str);

    if (strlen(str)==5)
    {
	/* assume this is the form a7a8q */
	/* get promo and remove from string */
	chesspiece p = lookup(str[4]);
	promopiece = chesspiecevalue(p);

	if ((promopiece<=0)||(promopiece>king))
	    return dummymove;
	
	str[4]=0;
    }
    
    /* e4 */
    if (strlen(str)==2)
    {
	int ef, er;
	square s1, s2;

	ef = str[0]-'a';
	er = str[1]-'1';

	if (strchr("abcdefgh", str[0]) &&
	    strchr("abcdefgh", str[1]))
	{
	    return decode_pawn_cap(str);
	}
	
	if (offboardp(ef, er))
	    return dummymove;
	
	s2 = SQ(ef,er);
	s1 = findstart(makepiece(tomove(), pawn), ef, er, 8, 8);
	return MV(s1,s2);
    }

    /* Pe4 ab4 */
    if (strlen(str)==3)
    {
	int sf, ef, er;
	square s1 = dummymove, s2;

	ef = str[1]-'a';
	er = str[2]-'1';

	if (offboardp(ef, er))
	    return dummymove;

	s2 = SQ(ef,er);
	if (str[0]=='b')
	{
	    /* if its a valid pawn move it,
	       else look for valid Bishop move
	    */
	    int v = chesspiecevalue(lookup(str[0]));
	    sf = str[0] - 'a';
	    s1 = findstart(makepiece(tomove(), pawn), ef, er, sf, 8);
	    if (s1!=dummysq)
	    {
		return MV(s1,s2);
	    }
	    else if (v)
	    {
		s1 = findstart(makepiece(tomove(), v), ef, er, 8, 8);
		return MV(s1,s2);
	    }
	    else
		return dummysq;
	}
	else if (lookup(str[0]))
	{
	    int v = chesspiecevalue(lookup(str[0]));
	    s1 = findstart(makepiece(tomove(), v), ef, er, 8, 8);
	}
	else
	{
	    sf = str[0] - 'a';
	    s1 = findstart(makepiece(tomove(), pawn), ef, er, sf, 8);
	}
	return (MV(s1,s2));
    }
    
    /* e2e4 Nbd7 N8d7*/
    else if (strlen(str)==4)
    {
	int sf, sr, ef, er, v;
	square s1, s2;
	
	sf = str[0]-'a';
	sr = str[1]-'1';
	ef = str[2]-'a';
	er = str[3]-'1';

	if (offboardp(ef, er))
	    return dummymove;

	if (!offboardp(sf, sr))
	    return MV(SQ(sf,sr),SQ(ef,er));
	
	s2 = SQ(ef, er);
	s1 = SQ(sf, sr);
	
	switch (str[0])
	{
	    case 'P': case 'p':
	    case 'N': case 'n':
	    case 'B': case 'b':
	    case 'R': case 'r':
	    case 'Q': case 'q':
	    case 'K': case 'k':
		sf = str[1]-'a';
		sr = str[1]-'1';
		v = chesspiecevalue(lookup(str[0]));
		if ((sf>=0)&&(sf<=7))
		{
		    s1 = findstart(makepiece(tomove(), v), ef, er, sf, 8);
		    return MV(s1, s2);
		}
		else
		{
		    s1 = findstart(makepiece(tomove(), v), ef, er, 8, sr);
		    return MV(s1, s2);
		}
		
	    default:
		return dummymove;
	}
    }
    else
	return dummymove;
}
Exemple #6
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);
        }
    }
}