/* * 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); } } }
clrest () { register int r, c, j; r = curr; c = curc; for (j = r+1; j < 24; j++) { curmove (j,0); cline(); } curmove (r,c); }
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; }
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); } }
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); }
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(); }
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); }
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); }
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); }
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]); }
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(); }
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; } } }
/* 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 */ }
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); }
/* 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 */ }