Annotation of 43BSD/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.  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: }

unix.superglobalmegacorp.com

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