Example #1
0
/*
 * bsect (b,rpos,cpos,cnext)
 *	Print the contents of a board position.  "b" has the value of the
 * position, "rpos" is the row to start printing, "cpos" is the column to
 * start printing, and "cnext" is positive if the position starts at the top
 * and negative if it starts at the bottom.  The value of "cpos" is checked
 * to see if the position is a player's home, since those are printed
 * differently.
 */
static void
bsect(int b, int rpos, int cpos, int cnext)
{
	int     j;		/* index */
	int     n;		/* number of men on position */
	int     bct;		/* counter */
	int     k;		/* index */
	char    pc;		/* color of men on position */

	bct = 0;
	n = abs(b);		/* initialize n and pc */
	pc = (b > 0 ? 'r' : 'w');

	if (n < 6 && cpos < 54)	/* position cursor at start */
		curmove(rpos, cpos + 1);
	else
		curmove(rpos, cpos);

	for (j = 0; j < 5; j++) {	/* print position row by row */

		for (k = 0; k < 15; k += 5)	/* print men */
			if (n > j + k)
				fancyc(pc);

		if (j < 4) {	/* figure how far to back up for next row */
			if (n < 6) {	/* stop if none left */
				if (j + 1 == n)
					break;
				bct = 1;	/* single column */
			} else {
				if (n < 11) {	/* two columns */
					if (cpos == 54) {	/* home pos */
						if (j + 5 >= n)
							bct = 1;
						else
							bct = 2;
					}
					if (cpos < 54) {	/* not home */
						if (j + 6 >= n)
							bct = 1;
						else
							bct = 2;
					}
				} else {	/* three columns */
					if (j + 10 >= n)
						bct = 2;
					else
						bct = 3;
				}
			}
			/* reposition cursor */			
			curmove(curr + cnext, curc - bct);
		}
	}
}
Example #2
0
clrest ()  {
	register int	r, c, j;

	r = curr;
	c = curc;
	for (j = r+1; j < 24; j++)  {
		curmove (j,0);
		cline();
	}
	curmove (r,c);
}
Example #3
0
void
roll(struct move *mm)
{
	char    c;
	int     row;
	int     col;

	row = col = 0;
	if (iroll) {
		if (tflag) {
			row = curr;
			col = curc;
			curmove(17, 0);
		} else
			writec('\n');
		writel("ROLL: ");
		c = readc();
		if (c != '\n') {
			while (c < '1' || c > '6')
				c = readc();
			mm->D0 = c - '0';
			writec(' ');
			writec(c);
			c = readc();
			while (c < '1' || c > '6')
				c = readc();
			mm->D1 = c - '0';
			writec(' ');
			writec(c);
			if (tflag) {
				curmove(17, 0);
				cline();
				curmove(row, col);
			} else
				writec('\n');
			return;
		}
		if (tflag) {
			curmove(17, 0);
			cline();
			curmove(row, col);
		} else
			writec('\n');
	}
	mm->D0 = rnum(6) + 1;
	mm->D1 = rnum(6) + 1;
	mm->d0 = 0;
}
Example #4
0
void
gwrite(void)
{
	int     r, c;

	r = c = 0;
	if (tflag) {
		r = curr;
		c = curc;
		curmove(16, 0);
	}
	if (gvalue > 1) {
		writel("Game value:  ");
		wrint(gvalue);
		writel(".  ");
		if (dlast == -1)
			writel(color[0]);
		else
			writel(color[1]);
		writel(" doubled last.");
	} else {
		switch (pnum) {
		case -1:	/* player is red */
			writel(plred);
			break;
		case 0:	/* player is both colors */
			writel(nocomp);
			break;
		case 1:	/* player is white */
			writel(plwhite);
		}
	}

	if (rscore || wscore) {
		writel("  ");
		wrscore();
	}
	if (tflag) {
		cline();
		curmove(r, c);
	}
}
Example #5
0
void
getout(int dummy __unused)
{
	/* go to bottom of screen */
	if (tflag) {
		curmove(23, 0);
		cline();
	} else
		writec('\n');

	/* fix terminal status */
	fixtty(&old);
	exit(0);
}
Example #6
0
void
refresh(void)
{
	int     i, r, c;

	r = curr;		/* save current position */
	c = curc;

	for (i = 12; i > 6; i--)/* fix positions 12-7 */
		if (board[i] != oldb[i]) {
			fixpos(oldb[i], board[i], 13, 1 + (12 - i) * 4, -1);
			oldb[i] = board[i];
		}
	if (board[0] != oldb[0]) {	/* fix red men on bar */
		fixpos(oldb[0], board[0], 13, 25, -1);
		oldb[0] = board[0];
	}
	for (i = 6; i > 0; i--)	/* fix positions 6-1 */
		if (board[i] != oldb[i]) {
			fixpos(oldb[i], board[i], 13, 29 + (6 - i) * 4, -1);
			oldb[i] = board[i];
		}
	i = -(off[0] < 0 ? off[0] + 15 : off[0]);	/* fix white's home */
	if (oldw != i) {
		fixpos(oldw, i, 13, 54, -1);
		oldw = i;
	}
	for (i = 13; i < 19; i++)	/* fix positions 13-18 */
		if (board[i] != oldb[i]) {
			fixpos(oldb[i], board[i], 3, 1 + (i - 13) * 4, 1);
			oldb[i] = board[i];
		}
	if (board[25] != oldb[25]) {	/* fix white men on bar */
		fixpos(oldb[25], board[25], 3, 25, 1);
		oldb[25] = board[25];
	}
	for (i = 19; i < 25; i++)	/* fix positions 19-24 */
		if (board[i] != oldb[i]) {
			fixpos(oldb[i], board[i], 3, 29 + (i - 19) * 4, 1);
			oldb[i] = board[i];
		}
	i = (off[1] < 0 ? off[1] + 15 : off[1]);	/* fix red's home */
	if (oldr != i) {
		fixpos(oldr, i, 3, 54, 1);
		oldr = i;
	}
	curmove(r, c);		/* return to saved position */
	newpos();
	buflush();
}
Example #7
0
void
moverr(int i)
{
	int j;

	if (tflag)
		curmove(20, 0);
	else
		writec('\n');
	writel("Error:  ");
	for (j = 0; j <= i; j++) {
		wrint(p[j]);
		writec('-');
		wrint(g[j]);
		if (j < i)
			writec(',');
	}
	writel("... ");
	movback(i);
}
Example #8
0
int
quit(struct move *mm)
{

	if (tflag) {
		curmove(20, 0);
		clend();
	} else
		writec('\n');
	writel("Are you sure you want to quit?");
	if (yorn(0)) {
		if (rfl) {
			writel("Would you like to save this game?");
			if (yorn(0))
				save(mm, 0);
		}
		cturn = 0;
		return (1);
	}
	return (0);
}
Example #9
0
int
text(const char *const *txt)
{
	const char *a;
	char b;
	const char *c;
	int i;

	fixtty(noech);
	while (*txt) {
		a = *(txt++);
		if (*a != '\0') {
			c = a;
			for (i = 0; *(c++) != '\0'; i--)
			    ; /* nothing */
			writel(a);
			writec('\n');
		} else {
			fixtty(raw);
			writel(prompt);
			for (;;) {
				if ((b = readc()) == '?') {
					if (tflag) {
						if (begscr) {
							curmove(18, 0);
							clend();
						} else
							clear();
					} else
						writec('\n');
					text(list);
					writel(prompt);
					continue;
				}
				i = 0;
				if (b == '\n')
					break;
				while (i < 11) {
					if (b == opts[i])
						break;
					i++;
				}
				if (i == 11)
					writec('\007');
				else
					break;
			}
			if (tflag) {
				if (begscr) {
					curmove(18, 0);
					clend();
				} else
					clear();
			} else
				writec('\n');
			if (i)
				return (i);
			fixtty(noech);
			if (tflag)
				curmove(curr, 0);
		}
	}
	fixtty(raw);
	return (0);
}
Example #10
0
fboard ()  {
	register int	i, j, l;

	curmove (0,0);				/* do top line */
	for (i = 0; i < 53; i++)
		fancyc ('_');

	curmove (15,0);				/* do botttom line */
	for (i = 0; i < 53; i++)
		fancyc ('_');

	l = 1;					/* do vertical lines */
	for (i = 52; i > -1; i -= 28)  {
		curmove ( (l == 1? 1: 15) ,i);
		fancyc ('|');
		for (j = 0; j < 14; j++)  {
			curmove (curr+l,curc-1);
			fancyc ('|');
		}
		if (i == 24)
			i += 32;
		l = -l;				/* alternate directions */
	}

	curmove (2,1);				/* label positions 13-18 */
	for (i = 13; i < 18; i++)  {
		fancyc ('1');
		fancyc ((i % 10)+'0');
		curmove (curr,curc+2);
	}
	fancyc ('1');
	fancyc ('8');

	curmove (2,29);				/* label positions 19-24 */
	fancyc ('1');
	fancyc ('9');
	for (i = 20; i < 25; i++)  {
		curmove (curr,curc+2);
		fancyc ('2');
		fancyc ((i % 10)+'0');
	}

	curmove (14,1);				/* label positions 12-7 */
	fancyc ('1');
	fancyc ('2');
	for (i = 11; i > 6; i--)  {
		curmove (curr,curc+2);
		fancyc (i > 9? '1': ' ');
		fancyc ((i % 10)+'0');
	}

	curmove (14,30);			/* label positions 6-1 */
	fancyc ('6');
	for (i = 5; i > 0; i--) {
		curmove (curr,curc+3);
		fancyc (i+'0');
	}

	for (i = 12; i > 6; i--)		/* print positions 12-7 */
		if (board[i])
			bsect (board[i],13,1+4*(12-i),-1);

	if (board[0])				/* print red men on bar */
		bsect (board[0],13,25,-1);

	for (i = 6; i > 0; i--)			/* print positions 6-1 */
		if (board[i])
			bsect (board[i],13,29+4*(6-i),-1);

	l = (off[1] < 0? off[1]+15: off[1]);	/* print white's home */
	bsect (l,3,54,1);

	curmove (8,25);				/* print the word BAR */
	fancyc ('B');
	fancyc ('A');
	fancyc ('R');

	for (i = 13; i < 19; i++)		/* print positions 13-18 */
		if (board[i])
			bsect (board[i],3,1+4*(i-13),1);

	if (board[25])				/* print white's men on bar */
		bsect (board[25],3,25,1);

	for (i = 19; i < 25; i++)		/* print positions 19-24 */
		if (board[i])
			bsect (board[i],3,29+4*(i-19),1);

	l = (off[0] < 0? off[0]+15: off[0]);	/* print red's home */
	bsect (-l,13,54,-1);

	for (i = 0; i < 26; i++)		/* save board position
						 * for refresh later */
		oldb[i] = board[i];
	oldr = (off[1] < 0? off[1]+15: off[1]);
	oldw = -(off[0] < 0? off[0]+15: off[0]);
}
Example #11
0
tutor ()  {
	register int	i, j;

	i = 0;
	begscr = 18;
	cturn = -1;
	home = 0;
	bar = 25;
	inptr = &in[0];
	inopp = &in[1];
	offptr = &off[0];
	offopp = &off[1];
	Colorptr = &color[0];
	colorptr = &color[2];
	colen = 5;
	wrboard();

	while (1)  {
		if (! brdeq(test[i].brd,board))  {
			if (tflag && curr == 23)
				curmove (18,0);
			writel (better);
			nexturn();
			movback (mvlim);
			if (tflag)  {
				refresh();
				clrest ();
			}
			if ((! tflag) || curr == 19)  {
				proll();
				writec ('\t');
			}
			else
				curmove (curr > 19? curr-2: curr+4,25);
			getmove();
			if (cturn == 0)
				leave();
			continue;
		}
		if (tflag)
			curmove (18,0);
		text (*test[i].com);
		if (! tflag)
			writec ('\n');
		if (i == maxmoves)
			break;
		D0 = test[i].roll1;
		D1 = test[i].roll2;
		d0 = 0;
		mvlim = 0;
		for (j = 0; j < 4; j++)  {
			if (test[i].mp[j] == test[i].mg[j])
				break;
			p[j] = test[i].mp[j];
			g[j] = test[i].mg[j];
			mvlim++;
		}
		if (mvlim)
			for (j = 0; j < mvlim; j++)
				if (makmove(j))
					writel ("AARGH!!!\n");
		if (tflag)
			refresh();
		nexturn();
		D0 = test[i].new1;
		D1 = test[i].new2;
		d0 = 0;
		i++;
		mvlim = movallow();
		if (mvlim)  {
			if (tflag)
				clrest();
			proll();
			writec('\t');
			getmove();
			if (tflag)
				refresh();
			if (cturn == 0)
				leave();
		}
	}
	leave();
}
Example #12
0
getmove ()  {
	register int	i, c;

	c = 0;
	for (;;)  {
		i = checkmove(c);

		switch (i)  {
		case -1:
			if (movokay(mvlim))  {
				if (tflag)
					curmove (20,0);
				else
					writec ('\n');
				for (i = 0; i < mvlim; i++)
					if (h[i])
						wrhit(g[i]);
				nexturn();
				if (*offopp == 15)
					cturn *= -2;
				if (tflag && pnum)
					bflag = pnum;
				return;
			}

		case -4:
		case 0:
			if (tflag)
				refresh();
			if (i != 0 && i != -4)
				break;
			if (tflag)
				curmove (20,0);
			else
				writec ('\n');
			writel (*Colorptr);
			if (i == -4)
				writel (" must make ");
			else
				writel (" can only make ");
			writec (mvlim+'0');
			writel (" move");
			if (mvlim > 1)
				writec ('s');
			writec ('.');
			writec ('\n');
			break;

		case -3:
			if (quit())
				return;
		}

		if (! tflag)
			proll ();
		else  {
			curmove (cturn == -1? 18: 19,39);
			cline ();
			c = -1;
		}
	}
}
Example #13
0
/* zero if first move */
void
move(int okay)
{
    int i;			/* index */
    int l;			/* last man */

    l = 0;
    if (okay) {
        /* see if comp should double */
        if (gvalue < 64 && dlast != cturn && dblgood()) {
            writel(*Colorptr);
            dble();		/* double */
            /* return if declined */
            if (cturn != 1 && cturn != -1)
                return;
        }
        roll();
    }

    race = 0;
    for (i = 0; i < 26; i++) {
        if (board[i] < 0)
            l = i;
    }
    for (i = 0; i < l; i++) {
        if (board[i] > 0)
            break;
    }
    if (i == l)
        race = 1;

    /* print roll */
    if (tflag)
        curmove(cturn == -1 ? 18 : 19, 0);
    writel(*Colorptr);
    writel(" rolls ");
    writec(D0 + '0');
    writec(' ');
    writec(D1 + '0');
    /* make tty interruptable while thinking */
    if (tflag)
        cline();
    fixtty(noech);

    /* find out how many moves */
    mvlim = movallow();
    if (mvlim == 0) {
        writel(" but cannot use it.\n");
        nexturn();
        fixtty(raw);
        return;
    }

    /* initialize */
    for (i = 0; i < 4; i++)
        cp[i] = cg[i] = 0;

    /* strategize */
    trymove(0, 0);
    pickmove();

    /* print move */
    writel(" and moves ");
    for (i = 0; i < mvlim; i++) {
        if (i > 0)
            writec(',');
        wrint(p[i] = cp[i]);
        writec('-');
        wrint(g[i] = cg[i]);
        makmove(i);
    }
    writec('.');

    /* print blots hit */
    if (tflag)
        curmove(20, 0);
    else
        writec('\n');
    for (i = 0; i < mvlim; i++)
        if (h[i])
            wrhit(g[i]);
    /* get ready for next move */
    nexturn();
    if (!okay) {
        buflush();
        sleep(3);
    }
    fixtty(raw);		/* no more tty interrupt */
}
Example #14
0
void wrboard(void)
{
    int l;
    static const char bl[] = "|                       |   |                       |\n";
    static const char sv[] = "|                       |   |                       |    \n";

    fixtty(&noech);
    clear();

    if (tflag) {
	fboard();
	goto lastline;
    }
    writel("_____________________________________________________\n");
    writel(bl);
    strcpy(ln, bl);
    for (j = 1; j < 50; j += 4) {
	k = j / 4 + (j > 24 ? 12 : 13);
	ln[j + 1] = k % 10 + '0';
	ln[j] = k / 10 + '0';
	if (j == 21)
	    j += 4;
    }
    writel(ln);
    for (i = 0; i < 5; i++) {
	strcpy(ln, sv);
	for (j = 1; j < 50; j += 4) {
	    k = j / 4 + (j > 24 ? 12 : 13);
	    wrbsub();
	    if (j == 21)
		j += 4;
	}
	if (-board[25] > i)
	    ln[26] = 'w';
	if (-board[25] > i + 5)
	    ln[25] = 'w';
	if (-board[25] > i + 10)
	    ln[27] = 'w';
	l = 53;
	if (off[1] > i || (off[1] < 0 && off[1] + 15 > i)) {
	    ln[54] = 'r';
	    l = 55;
	}
	if (off[1] > i + 5 || (off[1] < 0 && off[1] + 15 > i + 5)) {
	    ln[55] = 'r';
	    l = 56;
	}
	if (off[1] > i + 10 || (off[1] < 0 && off[1] + 15 > i + 10)) {
	    ln[56] = 'r';
	    l = 57;
	}
	ln[l++] = '\n';
	ln[l] = '\0';
	writel(ln);
    }
    strcpy(ln, bl);
    ln[25] = 'B';
    ln[26] = 'A';
    ln[27] = 'R';
    writel(ln);
    strcpy(ln, sv);
    for (i = 4; i > -1; i--) {
	for (j = 1; j < 50; j += 4) {
	    k = ((j > 24 ? 53 : 49) - j) / 4;
	    wrbsub();
	    if (j == 21)
		j += 4;
	}
	if (board[0] > i)
	    ln[26] = 'r';
	if (board[0] > i + 5)
	    ln[25] = 'r';
	if (board[0] > i + 10)
	    ln[27] = 'r';
	l = 53;
	if (off[0] > i || (off[0] < 0 && off[0] + 15 > i)) {
	    ln[54] = 'w';
	    l = 55;
	}
	if (off[0] > i + 5 || (off[0] < 0 && off[0] + 15 > i + 5)) {
	    ln[55] = 'w';
	    l = 56;
	}
	if (off[0] > i + 10 || (off[0] < 0 && off[0] + 15 > i + 10)) {
	    ln[56] = 'w';
	    l = 57;
	}
	ln[l++] = '\n';
	ln[l] = '\0';
	writel(ln);
    }
    strcpy(ln, bl);
    for (j = 1; j < 50; j += 4) {
	k = ((j > 24 ? 53 : 49) - j) / 4;
	ln[j + 1] = k % 10 + '0';
	if (k > 9)
	    ln[j] = k / 10 + '0';
	if (j == 21)
	    j += 4;
    }
    writel(ln);
    writel("|_______________________|___|_______________________|\n");

  lastline:
    gwrite();
    if (tflag)
	curmove(18, 0);
    else {
	writec('\n');
	writec('\n');
    }
    fixtty(&bg_raw);
}
Example #15
0
/* zero if first move */
void
move(struct move *mm, int okay)
{
	int     i;		/* index */
	int     l;		/* last man */

	l = 0;
	if (okay) {
		/* see if comp should double */
		if (gvalue < 64 && dlast != cturn && dblgood()) {
			writel(*Colorptr);
			dble();	/* double */
			/* return if declined */
			if (cturn != 1 && cturn != -1)
				return;
		}
		roll(mm);
	}
	race = 0;
	for (i = 0; i < 26; i++) {
		if (board[i] < 0)
			l = i;
	}
	for (i = 0; i < l; i++) {
		if (board[i] > 0)
			break;
	}
	if (i == l)
		race = 1;

	/* print roll */
	if (tflag)
		curmove(cturn == -1 ? 18 : 19, 0);
	writel(*Colorptr);
	writel(" rolls ");
	writec(mm->D0 + '0');
	writec(' ');
	writec(mm->D1 + '0');
	/* make tty interruptable while thinking */
	if (tflag)
		cline();
	fixtty(&noech);

	/* find out how many moves */
	mm->mvlim = movallow(mm);
	if (mm->mvlim == 0) {
		writel(" but cannot use it.\n");
		nexturn();
		fixtty(&raw);
		return;
	}
	/* initialize */
	for (i = 0; i < 4; i++)
		cp[i] = cg[i] = 0;

	/* strategize */
	trymove(mm, 0, 0);
	pickmove(mm);

	/* print move */
	writel(" and moves ");
	for (i = 0; i < mm->mvlim; i++) {
		if (i > 0)
			writec(',');
		wrint(mm->p[i] = cp[i]);
		writec('-');
		wrint(mm->g[i] = cg[i]);
		makmove(mm, i);

		/*
		 * This assertion persuades gcc 4.5 that the loop
		 * doesn't result in signed overflow of i. mvlim
		 * isn't, or at least shouldn't be, changed by makmove
		 * at all.
		 */
		assert(mm->mvlim >= 0 && mm->mvlim <= 5);
	}
	writec('.');

	/* print blots hit */
	if (tflag)
		curmove(20, 0);
	else
		writec('\n');
	for (i = 0; i < mm->mvlim; i++)
		if (mm->h[i])
			wrhit(mm->g[i]);
	/* get ready for next move */
	nexturn();
	if (!okay) {
		buflush();
		sleep(3);
	}
	fixtty(&raw);		/* no more tty interrupt */
}