Annotation of 43BSDTahoe/games/backgammon/extra.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.