1: /* 2: * Copyright (c) 1980 Regents of the University of California. 3: * All rights reserved. The Berkeley software License Agreement 4: * specifies the terms and conditions for redistribution. 5: */ 6: 7: #ifndef lint 8: static char sccsid[] = "@(#)extra.c 5.1 (Berkeley) 5/29/85"; 9: #endif not lint 10: 11: #include "back.h" 12: 13: #ifdef DEBUG 14: #include <stdio.h> 15: FILE *trace; 16: #endif 17: 18: /* 19: * dble() 20: * Have the current player double and ask opponent to accept. 21: */ 22: 23: dble () { 24: register int resp; /* response to y/n */ 25: 26: for (;;) { 27: writel (" doubles."); /* indicate double */ 28: 29: if (cturn == -pnum) { /* see if computer accepts */ 30: if (dblgood()) { /* guess not */ 31: writel (" Declined.\n"); 32: nexturn(); 33: cturn *= -2; /* indicate loss */ 34: return; 35: } else { /* computer accepts */ 36: writel (" Accepted.\n"); 37: gvalue *= 2; /* double game value */ 38: dlast = cturn; 39: if (tflag) 40: gwrite(); 41: return; 42: } 43: } 44: 45: /* ask if player accepts */ 46: writel (" Does "); 47: writel (cturn == 1? color[2]: color[3]); 48: writel (" accept?"); 49: 50: /* get response from yorn, 51: * a "2" means he said "p" 52: * for print board. */ 53: if ((resp = yorn ('R')) == 2) { 54: writel (" Reprint.\n"); 55: buflush(); 56: wrboard(); 57: writel (*Colorptr); 58: continue; 59: } 60: 61: /* check response */ 62: if (resp) { 63: /* accepted */ 64: gvalue *= 2; 65: dlast = cturn; 66: if (tflag) 67: gwrite(); 68: return; 69: } 70: 71: nexturn (); /* declined */ 72: cturn *= -2; 73: return; 74: } 75: } 76: 77: /* 78: * dblgood () 79: * Returns 1 if the computer would double in this position. This 80: * is not an exact science. The computer will decline a double that he 81: * would have made. Accumulated judgments are kept in the variable n, 82: * which is in "pips", i.e., the position of each man summed over all 83: * men, with opponent's totals negative. Thus, n should have a positive 84: * value of 7 for each move ahead, or a negative value of 7 for each one 85: * behind. 86: */ 87: 88: dblgood () { 89: register int n; /* accumulated judgment */ 90: register int OFFC = *offptr; /* no. of computer's men off */ 91: register int OFFO = *offopp; /* no. of player's men off */ 92: 93: #ifdef DEBUG 94: register int i; 95: if (trace == NULL) 96: trace = fopen ("bgtrace","w"); 97: #endif 98: 99: /* get real pip value */ 100: n = eval()*cturn; 101: #ifdef DEBUG 102: fputs ("\nDoubles:\nBoard: ",trace); 103: for (i = 0; i < 26; i++) 104: fprintf (trace," %d",board[i]); 105: fprintf (trace,"\n\tpip = %d, ",n); 106: #endif 107: 108: /* below adjusts pip value 109: * according to position 110: * judgments */ 111: 112: /* check men moving off 113: * board */ 114: if (OFFC > -15 || OFFO > -15) { 115: if (OFFC < 0 && OFFO < 0) { 116: OFFC += 15; 117: OFFO += 15; 118: n +=((OFFC-OFFO)*7)/2; 119: } else if (OFFC < 0) { 120: OFFC += 15; 121: n -= OFFO*7/2; 122: } else if (OFFO < 0) { 123: OFFO += 15; 124: n += OFFC*7/2; 125: } 126: if (OFFC < 8 && OFFO > 8) 127: n -= 7; 128: if (OFFC < 10 && OFFO > 10) 129: n -= 7; 130: if (OFFC < 12 && OFFO > 12) 131: n -= 7; 132: if (OFFO < 8 && OFFC > 8) 133: n += 7; 134: if (OFFO < 10 && OFFC > 10) 135: n += 7; 136: if (OFFO < 12 && OFFC > 12) 137: n += 7; 138: n += ((OFFC-OFFO)*7)/2; 139: } 140: 141: #ifdef DEBUG 142: fprintf (trace,"off = %d, ",n); 143: #endif 144: 145: /* see if men are trapped */ 146: n -= freemen(bar); 147: n += freemen(home); 148: n += trapped(home,-cturn); 149: n -= trapped(bar,cturn); 150: 151: #ifdef DEBUG 152: fprintf (trace,"free = %d\n",n); 153: fprintf (trace,"\tOFFC = %d, OFFO = %d\n",OFFC,OFFO); 154: fflush (trace); 155: #endif 156: 157: /* double if 2-3 moves ahead */ 158: if (n > 10+rnum(7)) 159: return(1); 160: return (0); 161: } 162: 163: freemen (b) 164: int b; 165: 166: { 167: register int i, inc, lim; 168: 169: odds(0,0,0); 170: if (board[b] == 0) 171: return (0); 172: inc = (b == 0? 1: -1); 173: lim = (b == 0? 7: 18); 174: for (i = b+inc; i != lim; i += inc) 175: if (board[i]*inc < -1) 176: odds(abs(b-i),0,abs(board[b])); 177: if (abs(board[b]) == 1) 178: return ((36-count())/5); 179: return (count()/5); 180: } 181: 182: trapped (n,inc) 183: int n, inc; 184: 185: { 186: register int i, j, k; 187: int c, l, ct; 188: 189: ct = 0; 190: l = n+7*inc; 191: for (i = n+inc; i != l; i += inc) { 192: odds (0,0,0); 193: c = abs(i-l); 194: if (board[i]*inc > 0) { 195: for (j = c; j < 13; j++) 196: if (board[i+inc*j]*inc < -1) { 197: if (j < 7) 198: odds (j,0,1); 199: for (k = 1; k < 7 && k < j; k++) 200: if (j-k < 7) 201: odds (k,j-k,1); 202: } 203: ct += abs(board[i])*(36-count()); 204: } 205: } 206: return (ct/5); 207: } 208: 209: eval () { 210: 211: register int i, j; 212: 213: for (j = i = 0; i < 26; i++) 214: j += (board[i] >= 0 ? i*board[i] : (25-i)*board[i]); 215: 216: if (off[1] >= 0) 217: j += 25*off[1]; 218: else 219: j += 25*(off[1]+15); 220: 221: if (off[0] >= 0) 222: j -= 25*off[0]; 223: else 224: j -= 25*(off[0]+15); 225: return (j); 226: }