Beispiel #1
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);
        }
    }
}
Beispiel #2
0
/* returns -1 for stalemate or winner's color */
int playchess()
{
    int use_pondering = 0;
    
    printboard_and_time();
     
    for (;;)
    {
	long starttime, endtime;
	move m;
	int g;

	g = gameoverp(tomove());

	if (g)
	{
	    switch (g)
	    {
		case END_CHECKMATE:
		    if (tomove() == BLACK)
		    {
			return end(WHITE, "white mates");
		    }
		    else
		    {
			return end(BLACK, "black mates");
		    }
		case END_STALEMATE:
		    return end(-1, "stalemate");
		case NON_MATERIAL:
		    return end(-1, "insufficient material");
		case REP_DRAW:
		    if (!robo_mode)
		    {
			printf("drawable position\n");
		    }
		    if (computer[WHITE]||computer[BLACK])
		    {
			if (robo_mode)
			    tellics("draw\n");
			return end(-1, "draw by repetition of moves");
		    }
		    break;
	    }
	}
    
	starttime = get_ms();
	
	if (computer[tomove()])
	{
	    m = bce();

	    if ((m!=dummymove)&&(validmove(m)==1))
	    {
		printf("move %s\n", movestring(m));
	    }
	    else
	    {
		if (robo_mode)
		{
		    tellics("mailmoves\n");
		    tellics(
			"message madhacker valid? = %d, move = %s, wouldbeincheckp() = %d, wouldbeinfullcheckp() = %d, pv = %s\n",
			validmove(m),
			movestring(m),
			wouldbeincheckp(m),
			wouldbeincheckfullp(m),
			thoughts);
		    tellics("abort\n");
		}
		else
		{
		    printf("BCE returned invalid move: %s\n", movestring(m));
		    printf("valid? = %d\n", validmove(m));

		    fprintf(stdout, "random seed = %ld\n", seed);
		    fprintf(stdout, "hash = %lld\n", board->hash);
		    fprintf(stdout, "draw? = %d g = %d\n",
			    draw_by_rep(), g);
		    computer[1] = computer[0] = 0;
		}
	    }
	    use_pondering = 1;
	}
	else 
	{
	    if ((ponder_mode && computer[opp(tomove())])&&
		use_pondering)
	    {
		ponder();
		use_pondering = 0;
	    }
	    
	    m = usermove();
	    use_pondering = 0;
	}
    
	endtime = get_ms();
	chessclock[tomove()] -= (endtime-starttime);
	chessclock[tomove()] += clockinc;
    
	if (m)
	{
	    domove(m);
	    update_state(m);
	    printboard_and_time();
	}
    }
}