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