Annotation of 42BSD/games/backgammon/extra.c, revision 1.1

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: }

unix.superglobalmegacorp.com

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