|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.