Annotation of 43BSDReno/old/btlgammon/btlgammon.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)btlgammon.c        1.2 (Berkeley) 9/20/87";
        !             3: #endif not lint
        !             4: 
        !             5: /*
        !             6: **     The game of Backgammon
        !             7: */
        !             8: 
        !             9: #include       <stdio.h>
        !            10: 
        !            11: #define        WHITE           0
        !            12: #define        BROWN           1
        !            13: #define        NIL             (-1)
        !            14: #define        MAXGMOV         10
        !            15: #define        MAXIMOVES       1000
        !            16: #define        RULES           "/usr/games/lib/backrules"
        !            17: 
        !            18: char   level;          /*'b'=beginner, 'i'=intermediate, 'e'=expert*/
        !            19: 
        !            20: int    die1;
        !            21: int    die2;
        !            22: int    i;
        !            23: int    j;
        !            24: int    l;
        !            25: int    m;
        !            26: int    pflg = 1;
        !            27: int    nobroll = 0;
        !            28: int    count;
        !            29: int    imoves;
        !            30: int    goodmoves[MAXGMOV];
        !            31: int    probmoves[MAXGMOV];
        !            32: 
        !            33: int    brown[] = {             /* brown position table */
        !            34:        0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 
        !            35:        0, 0, 0, 0, 3, 0, 5, 0, 0, 0, 0, 0, 
        !            36:        0, 0, 0, 0, 0, 0
        !            37: };
        !            38: 
        !            39: int    white[] = {             /* white position table */
        !            40:        0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 
        !            41:        0, 0, 0, 0, 3, 0, 5, 0, 0, 0, 0, 0, 
        !            42:        0, 0, 0, 0, 0, 0
        !            43: };
        !            44: 
        !            45: int    probability[] = {
        !            46:        0, 11, 12, 13, 14, 15, 16, 
        !            47:        06, 05, 04, 03, 02, 01
        !            48: };
        !            49: 
        !            50: struct {
        !            51:        int     pos[4];
        !            52:        int     mov[4];
        !            53: } moves[MAXIMOVES];
        !            54: 
        !            55: main()
        !            56: {
        !            57:        int     go[5], tvec[2];
        !            58:        int     k, n, pid, ret, rpid, t;
        !            59:        char    s[100];
        !            60: 
        !            61:        srand(time(0));
        !            62:        go[5] = NIL;
        !            63:        fprintf(stdout, "Instructions? ");
        !            64:        gets(s);
        !            65:        if(*s == 'y')
        !            66:                instructions();
        !            67:        putchar('\n');
        !            68:        fprintf(stdout, "Opponent's level: b - beginner,\n");
        !            69:        fprintf(stdout, "i - intermediate, e - expert? ");
        !            70:        level='e';
        !            71:        gets(s);
        !            72:        if(*s == 'b')
        !            73:                level = 'b';
        !            74:        else if(*s == 'i')
        !            75:                level = 'i';
        !            76:        putchar('\n');
        !            77:        fprintf(stdout, "You will play brown.\n\n");
        !            78:        fprintf(stdout, "Would you like to roll your own dice? ");
        !            79:        gets(s);
        !            80:        putchar('\n');
        !            81:        if(*s == 'y')
        !            82:                nobroll = 1;
        !            83:        fprintf(stdout, "Would you like to go first? ");
        !            84:        gets(s);
        !            85:        putchar('\n');
        !            86:        if(*s == 'y')
        !            87:                goto nowhmove;
        !            88: whitesmv:
        !            89:        roll(WHITE);
        !            90:        fprintf(stdout, "white rolls %d, %d\n", die1, die2);
        !            91:        fprintf(stdout, "white's move is:");
        !            92:        if(nextmove(white, brown) == NIL)
        !            93:                goto nowhmove;
        !            94:        if(piececount(white, 0, 24) == 0){
        !            95:                fprintf(stdout, "White wins");
        !            96:                if(piececount(brown, 0, 6) != 0)
        !            97:                        fprintf(stdout, " with a Backgammon!\n");
        !            98:                else if (piececount(brown, 0, 24) == 24)
        !            99:                        fprintf(stdout, " with a Gammon.\n");
        !           100:                else
        !           101:                        fprintf(stdout, ".\n");
        !           102:                exit(0);
        !           103:        }
        !           104: nowhmove:
        !           105:        if(pflg)
        !           106:                prtbrd();
        !           107:        roll(BROWN);
        !           108: retry:
        !           109:        fprintf(stdout, "\nYour roll is %d  %d\n", die1, die2);
        !           110:        fprintf(stdout, "Move? ");
        !           111:        gets(s);
        !           112:        switch(*s) {
        !           113:                case '\0':                      /* empty line */
        !           114:                        fprintf(stdout, "Brown's move skipped.\n");
        !           115:                        goto whitesmv;
        !           116: 
        !           117:                case 'b':                       /* how many beared off? */
        !           118:                        fprintf(stdout, "Brown:   %d\n", piececount(brown, 0, 24) - 15);
        !           119:                        fprintf(stdout, "White:   %d\n", piececount(white, 0, 24) - 15);
        !           120:                        goto retry;
        !           121: 
        !           122:                case 'p':                       /* print board */
        !           123:                        prtbrd();
        !           124:                        goto retry;
        !           125: 
        !           126:                case 's':                       /* stop auto printing of board */
        !           127:                        pflg = 0;
        !           128:                        goto retry;
        !           129: 
        !           130:                case 'r':                       /* resume auto printing */
        !           131:                        pflg = 1;
        !           132:                        goto retry;
        !           133: 
        !           134:                case 'm':                       /* print possible moves */
        !           135:                        pmoves();
        !           136:                        goto retry;
        !           137: 
        !           138:                case 'q':                       /* i give up */
        !           139:                        exit(0);
        !           140: 
        !           141:                case '!':                       /* escape to Shell */
        !           142: #ifdef ADD_A_MAJOR_SECURITY_HOLE
        !           143:                        if(s[1] != '\0')
        !           144:                                system(s+1);
        !           145:                        else
        !           146: #endif
        !           147:                        if (!(pid = vfork()) == 0) {
        !           148:                                (void)setuid(getuid());
        !           149:                                (void)setgid(getgid());
        !           150:                                execl("/bin/sh", "sh", "-", 0);
        !           151:                                fprintf(stderr, "back: cannot exec /bin/sh!\n");
        !           152:                                exit(2);
        !           153:                        }
        !           154:                        while((rpid = wait(&ret)) != pid && rpid != -1)
        !           155:                                ;
        !           156:                        goto retry;
        !           157: 
        !           158:                case '?':                       /* well, what can i do? */
        !           159:                        fprintf(stdout, "<newline>      skip this move\n");
        !           160:                        fprintf(stdout, "b              number beared off\n");
        !           161:                        fprintf(stdout, "p              print board\n");
        !           162:                        fprintf(stdout, "q              quit\n");
        !           163:                        fprintf(stdout, "r              resume auto print of board\n");
        !           164:                        fprintf(stdout, "s              stop auto print of board\n");
        !           165:                        fprintf(stdout, "!              escape to Shell\n");
        !           166:                        goto retry;
        !           167:        }
        !           168:        n = sscanf(s,"%d%d%d%d%d",&go[0],&go[1],&go[2],&go[3],&go[4]);
        !           169:        if((die1 != die2 && n > 2) || n > 4){
        !           170:                fprintf(stdout, "Too many moves.\n");
        !           171:                goto retry;
        !           172:        }
        !           173:        go[n] = NIL;
        !           174:        if(*s=='-'){
        !           175:                go[0]= -go[0];
        !           176:                t=die1;
        !           177:                die1=die2;
        !           178:                die2=t;
        !           179:        }
        !           180:        for(k = 0; k < n; k++){
        !           181:                if(0 <= go[k] && go[k] <= 24)
        !           182:                        continue;
        !           183:                else{
        !           184:                        fprintf(stdout, "Move %d illegal.\n", go[k]);
        !           185:                        goto retry;
        !           186:                }
        !           187:        }
        !           188:        if(play(brown, white, go))
        !           189:                goto retry;
        !           190:        if(piececount(brown, 0, 24) == 0){
        !           191:                fprintf(stdout, "Brown wins");
        !           192:                if(piececount(white, 0, 6) != 0)
        !           193:                        fprintf(stdout, " with a Backgammon.\n");
        !           194:                else if(piececount(white, 0, 24) == 24)
        !           195:                        fprintf(stdout, " with a gammon.\n");
        !           196:                else
        !           197:                        fprintf(stdout, ".\n");
        !           198:                exit(0);
        !           199:        }
        !           200:        goto whitesmv;
        !           201: }
        !           202: 
        !           203: play(player,playee,pos)
        !           204: int *player,*playee,pos[];
        !           205: {
        !           206:        int     k, n, die, ipos;
        !           207: 
        !           208:        for(k=0; k < player[0]; k++){  /*blots on player[0] must be moved first*/
        !           209:                if(pos[k] == NIL)
        !           210:                        break;
        !           211:                if(pos[k] != 0){
        !           212:                        fprintf(stdout, "Stone on bar must be moved first.\n");
        !           213:                        return(NIL);
        !           214:                }
        !           215:        }
        !           216:        for(k = 0; (ipos=pos[k]) != NIL; k++){
        !           217:                die = k?die2:die1;
        !           218:                n = 25-ipos-die;
        !           219:                if(player[ipos] == 0)
        !           220:                        goto badmove;
        !           221:                if(n > 0 && playee[n] >= 2)
        !           222:                        goto badmove;
        !           223:                if(n <= 0){
        !           224:                        if(piececount(player,0,18) != 0)
        !           225:                                goto badmove;
        !           226:                        if((ipos+die) != 25 && piececount(player,19,24-die)!=0)
        !           227:                                goto badmove;
        !           228:                }
        !           229:                player[ipos]--;
        !           230:                player[ipos+die]++;
        !           231:        }
        !           232:        for(k = 0; pos[k] != NIL; k++){
        !           233:                die = k?die2:die1;
        !           234:                n = 25-pos[k]-die;
        !           235:                if(n>0 && playee[n]==1){
        !           236:                        playee[n]=0;
        !           237:                        playee[0]++;
        !           238:                }
        !           239:        }
        !           240:        return(0);
        !           241: 
        !           242: badmove:
        !           243:        fprintf(stdout, "Move %d illegal.\n", ipos);
        !           244:        while(k--){
        !           245:                die=k?die2:die1;
        !           246:                player[pos[k]]++;
        !           247:                player[pos[k]+die]--;
        !           248:        }
        !           249:        return(NIL);
        !           250: }
        !           251: nextmove(player,playee)
        !           252: int *player,*playee;
        !           253: {
        !           254:        int     k;
        !           255: 
        !           256:        imoves=0;
        !           257:        movegen(player,playee);
        !           258:        if(die1!=die2){
        !           259:                k=die1;
        !           260:                die1=die2;
        !           261:                die2=k;
        !           262:                movegen(player,playee);
        !           263:        }
        !           264:        if(imoves==0){
        !           265:                fprintf(stdout, "no move possible.\n");
        !           266:                return(NIL);
        !           267:        }
        !           268:        k=strategy(player,playee);              /*select kth possible move*/
        !           269:        prtmov(k);
        !           270:        update(player,playee,k);
        !           271:        return(0);
        !           272: }
        !           273: prtmov(k)
        !           274: int k;
        !           275: {
        !           276:        int     n;
        !           277: 
        !           278:        if(k == NIL)
        !           279:                fprintf(stdout, "No move possible\n");
        !           280:        else for(n = 0; n < 4; n++){
        !           281:                if(moves[k].pos[n] == NIL)
        !           282:                        break;
        !           283:                fprintf(stdout, "    %d, %d",25-moves[k].pos[n],moves[k].mov[n]);
        !           284:        }
        !           285:        fprintf(stdout, "\n");
        !           286: }
        !           287: update(player,playee,k)
        !           288: int *player,*playee,k;
        !           289: {
        !           290:        int     n,t;
        !           291: 
        !           292:        for(n = 0; n < 4; n++){
        !           293:                if(moves[k].pos[n] == NIL)
        !           294:                        break;
        !           295:                player[moves[k].pos[n]]--;
        !           296:                player[moves[k].pos[n]+moves[k].mov[n]]++;
        !           297:                t=25-moves[k].pos[n]-moves[k].mov[n];
        !           298:                if(t>0 && playee[t]==1){
        !           299:                        playee[0]++;
        !           300:                        playee[t]--;
        !           301:                }
        !           302:        }
        !           303: }
        !           304: piececount(player,startrow,endrow)
        !           305: int *player,startrow,endrow;
        !           306: {
        !           307:        int     sum;
        !           308: 
        !           309:        sum=0;
        !           310:        while(startrow <= endrow)
        !           311:                sum += player[startrow++];
        !           312:        return(sum);
        !           313: }
        !           314: pmoves()
        !           315: {
        !           316:        int     i1, i2;
        !           317: 
        !           318:        fprintf(stdout, "Possible moves are:\n");
        !           319:        for(i1 = 0; i1 < imoves; i1++){
        !           320:                fprintf(stdout, "\n%d",i1);
        !           321:                 for (i2 = 0; i2<4; i2++){
        !           322:                        if(moves[i1].pos[i2] == NIL)
        !           323:                                break;
        !           324:                        fprintf(stdout, "%d, %d",moves[i1].pos[i2],moves[i1].mov[i2]);
        !           325:                }
        !           326:        }
        !           327:        fprintf(stdout, "\n");
        !           328: }
        !           329: 
        !           330: roll(who)
        !           331: {
        !           332:        register n;
        !           333:        char     s[10];
        !           334: 
        !           335:        if(who == BROWN && nobroll) {
        !           336:                fprintf(stdout, "Roll? ");
        !           337:                gets(s);
        !           338:                n = sscanf(s, "%d%d", &die1, &die2);
        !           339:                if(n != 2 || die1 < 1 || die1 > 6 || die2 < 1 || die2 > 6)
        !           340:                        fprintf(stdout, "Illegal - I'll do it!\n");
        !           341:                else
        !           342:                        return;
        !           343:        }
        !           344:        die1 = ((rand()>>8) % 6) + 1;
        !           345:        die2 = ((rand()>>8) % 6) + 1;
        !           346: }
        !           347: 
        !           348: movegen(mover,movee)
        !           349: int *mover,*movee;
        !           350: {
        !           351:        int     k;
        !           352: 
        !           353:        for(i = 0; i <= 24; i++){
        !           354:                count = 0;
        !           355:                if(mover[i] == 0)
        !           356:                        continue;
        !           357:                if((k=25-i-die1) > 0 && movee[k] >= 2)
        !           358:                        if(mover[0] > 0)
        !           359:                                break;
        !           360:                else
        !           361:                        continue;
        !           362:                if(k <= 0){
        !           363:                        if(piececount(mover, 0, 18) != 0)
        !           364:                                break;
        !           365:                        if((i+die1) != 25 && piececount(mover,19,i-1) != 0)
        !           366:                                break;
        !           367:                }
        !           368:                mover[i]--;
        !           369:                mover[i+die1]++;
        !           370:                count = 1;
        !           371:                for(j = 0; j <= 24; j++){
        !           372:                        if(mover[j]==0)
        !           373:                                continue;
        !           374:                        if((k=25-j-die2) > 0 && movee[k] >= 2)
        !           375:                                if(mover[0] > 0)
        !           376:                                        break;
        !           377:                        else
        !           378:                                continue;
        !           379:                        if(k <= 0){
        !           380:                                if(piececount(mover,0,18) != 0)
        !           381:                                        break;
        !           382:                                if((j+die2) != 25 && piececount(mover,19,j-1) != 0)
        !           383:                                        break;
        !           384:                        }
        !           385:                        mover[j]--;
        !           386:                        mover[j+die2]++;
        !           387:                        count = 2;
        !           388:                        if(die1 != die2){
        !           389:                                moverecord(mover);
        !           390:                                if(mover[0] > 0)
        !           391:                                        break;
        !           392:                                else
        !           393:                                        continue;
        !           394:                        }
        !           395:                        for(l = 0; l <= 24; l++){
        !           396:                                if(mover[l] == 0)
        !           397:                                        continue;
        !           398:                                if((k=25-l-die1) > 0 && movee[k] >= 2)
        !           399:                                        if(mover[0] > 0)
        !           400:                                                break;
        !           401:                                else
        !           402:                                        continue;
        !           403:                                if(k <= 0){
        !           404:                                        if(piececount(mover, 0, 18) != 0)
        !           405:                                                break;
        !           406:                                        if((l+die2) != 25 && piececount(mover,19,l-1) != 0)
        !           407:                                                break;
        !           408:                                }
        !           409:                                mover[l]--;
        !           410:                                mover[l+die1]++;
        !           411:                                count=3;
        !           412:                                for(m=0;m<=24;m++){
        !           413:                                        if(mover[m]==0)
        !           414:                                                continue;
        !           415:                                        if((k=25-m-die1) >= 0 && movee[k] >= 2)
        !           416:                                                if(mover[0] > 0)
        !           417:                                                        break;
        !           418:                                        else
        !           419:                                                continue;
        !           420:                                        if(k <= 0){
        !           421:                                                if(piececount(mover,0,18) != 0)
        !           422:                                                        break;
        !           423:                                                if((m+die2) != 25 && piececount(mover,19,m-1) != 0)
        !           424:                                                        break;
        !           425:                                        }
        !           426:                                        count=4;
        !           427:                                        moverecord(mover);
        !           428:                                        if(mover[0] > 0)
        !           429:                                                break;
        !           430:                                }
        !           431:                                if(count == 3)
        !           432:                                        moverecord(mover);
        !           433:                                else{
        !           434:                                        mover[l]++;
        !           435:                                        mover[l+die1]--;
        !           436:                                }
        !           437:                                if(mover[0] > 0)
        !           438:                                        break;
        !           439:                        }
        !           440:                        if(count == 2)
        !           441:                                moverecord(mover);
        !           442:                        else{
        !           443:                                mover[j]++;
        !           444:                                mover[j+die1]--;
        !           445:                        }
        !           446:                        if(mover[0] > 0)
        !           447:                                break;
        !           448:                }
        !           449:                if(count == 1)
        !           450:                        moverecord(mover);
        !           451:                else{
        !           452:                        mover[i]++;
        !           453:                        mover[i+die1]--;
        !           454:                }
        !           455:                if(mover[0] > 0)
        !           456:                        break;
        !           457:        }
        !           458: }
        !           459: moverecord(mover)
        !           460: int *mover;
        !           461: {
        !           462:        int     t;
        !           463: 
        !           464:        if(imoves < MAXIMOVES) {
        !           465:                for(t = 0; t <= 3; t++)
        !           466:                        moves[imoves].pos[t] = NIL;
        !           467:                switch(count) {
        !           468:                case 4:
        !           469:                        moves[imoves].pos[3]=m;
        !           470:                        moves[imoves].mov[3]=die1;
        !           471: 
        !           472:                case 3:
        !           473:                        moves[imoves].pos[2]=l;
        !           474:                        moves[imoves].mov[2]=die1;
        !           475: 
        !           476:                case 2:
        !           477:                        moves[imoves].pos[1]=j;
        !           478:                        moves[imoves].mov[1]=die2;
        !           479: 
        !           480:                case 1:
        !           481:                        moves[imoves].pos[0]=i;
        !           482:                        moves[imoves].mov[0]=die1;
        !           483:                        imoves++;
        !           484:                }
        !           485:        }
        !           486:        switch(count) {
        !           487:        case 4:
        !           488:                break;
        !           489: 
        !           490:        case 3:
        !           491:                mover[l]++;
        !           492:                mover[l+die1]--;
        !           493:                break;
        !           494: 
        !           495:        case 2:
        !           496:                mover[j]++;
        !           497:                mover[j+die2]--;
        !           498:                break;
        !           499: 
        !           500:        case 1:
        !           501:                mover[i]++;
        !           502:                mover[i+die1]--;
        !           503:        }
        !           504: }
        !           505: 
        !           506: strategy(player,playee)
        !           507: int *player,*playee;
        !           508: {
        !           509:        int     k, n, nn, bestval, moveval, prob;
        !           510: 
        !           511:        n = 0;
        !           512:        if(imoves == 0)
        !           513:                return(NIL);
        !           514:        goodmoves[0] = NIL;
        !           515:        bestval = -32000;
        !           516:        for(k = 0; k < imoves; k++){
        !           517:                if((moveval=eval(player,playee,k,&prob)) < bestval)
        !           518:                        continue;
        !           519:                if(moveval > bestval){
        !           520:                        bestval = moveval;
        !           521:                        n = 0;
        !           522:                }
        !           523:                if(n<MAXGMOV){
        !           524:                        goodmoves[n]=k;
        !           525:                        probmoves[n++]=prob;
        !           526:                }
        !           527:        }
        !           528:        if(level=='e' && n>1){
        !           529:                nn=n;
        !           530:                n=0;
        !           531:                prob=32000;
        !           532:                for(k = 0; k < nn; k++){
        !           533:                        if((moveval=probmoves[k]) > prob)
        !           534:                                continue;
        !           535:                        if(moveval<prob){
        !           536:                                prob=moveval;
        !           537:                                n=0;
        !           538:                        }
        !           539:                        goodmoves[n]=goodmoves[k];
        !           540:                        probmoves[n++]=probmoves[k];
        !           541:                }
        !           542:        }
        !           543:        return(goodmoves[(rand()>>4)%n]);
        !           544: }
        !           545: 
        !           546: eval(player,playee,k,prob)
        !           547: int *player,*playee,k,*prob;
        !           548: {
        !           549:        int     newtry[31], newother[31], *r, *q, *p, n, sum, first;
        !           550:        int     ii, lastwhite, lastbrown;
        !           551: 
        !           552:        *prob = sum = 0;
        !           553:        r = player+25;
        !           554:        p = newtry;
        !           555:        q = newother;
        !           556:        while(player<r){
        !           557:                *p++= *player++;
        !           558:                *q++= *playee++;
        !           559:        }
        !           560:        q=newtry+31;
        !           561:        for(p = newtry+25; p < q; p++)          /* zero out spaces for hit pieces */
        !           562:                *p = 0;
        !           563:        for(n = 0; n < 4; n++){
        !           564:                if(moves[k].pos[n] == NIL)
        !           565:                        break;
        !           566:                newtry[moves[k].pos[n]]--;
        !           567:                newtry[ii=moves[k].pos[n]+moves[k].mov[n]]++;
        !           568:                if(ii<25 && newother[25-ii]==1){
        !           569:                        newother[25-ii]=0;
        !           570:                        newother[0]++;
        !           571:                        if(ii<=15 && level=='e')                /* hit if near other's home */
        !           572:                                sum++;
        !           573:                }
        !           574:        }
        !           575:        for(lastbrown = 0; newother[lastbrown] == 0; lastbrown++);
        !           576:                ;
        !           577:        for(lastwhite = 0; newtry[lastwhite] == 0; lastwhite++)
        !           578:                ;
        !           579:        lastwhite = 25-lastwhite;
        !           580:        if(lastwhite<=6 && lastwhite<lastbrown)
        !           581:                sum=1000;
        !           582:                                                                        /* experts running game. */
        !           583:                                                                        /* first priority is to */
        !           584:                                                                        /* get all pieces into */
        !           585:                                                                        /* white's home */
        !           586:        if(lastwhite<lastbrown && level=='e' && lastwhite>6) {
        !           587:                for(sum = 1000; lastwhite > 6; lastwhite--)
        !           588:                        sum = sum-lastwhite*newtry[25-lastwhite];
        !           589:        }
        !           590:        for(first = 0; first < 25; first++)
        !           591:                if(newother[first] != 0)                /*find other's first piece*/
        !           592:                        break;
        !           593:        q = newtry+25;
        !           594:        for(p = newtry+1; p < q;)                       /* blocked points are good */
        !           595:                if(*p++ > 1)
        !           596:                        sum++;
        !           597:        if(first > 5) {                                 /* only stress removing pieces if */
        !           598:                                                        /* homeboard cannot be hit */
        !           599:                q = newtry+31;
        !           600:                p=newtry+25;
        !           601:                for(n = 6; p < q; n--)
        !           602:                        sum += *p++ * n;                        /*remove pieces, but just barely*/
        !           603:        }
        !           604:        if(level != 'b'){
        !           605:                r = newtry+25-first;    /*singles past this point can't be hit*/
        !           606:                for(p = newtry+7; p < r; )
        !           607:                        if(*p++ == 1)           /*singles are bad after 1st 6 points if they can be hit*/
        !           608:                                sum--;
        !           609:                q = newtry+3;
        !           610:                for(p = newtry; p < q; )           /*bad to be on 1st three points*/
        !           611:                        sum -= *p++;
        !           612:        }
        !           613: 
        !           614:        for(n = 1; n <= 4; n++)
        !           615:                *prob += n*getprob(newtry,newother,6*n-5,6*n);
        !           616:        return(sum);
        !           617: }
        !           618: instructions()
        !           619: {
        !           620:        register fd, r;
        !           621:        char     buf[BUFSIZ];
        !           622: 
        !           623:        if((fd = open(RULES, 0)) < 0) {
        !           624:                fprintf(stderr, "back: cannot open %s\n", RULES);
        !           625:                return;
        !           626:        }
        !           627:        while(r = read(fd, buf, BUFSIZ))
        !           628:                write(1, buf, r);
        !           629: }
        !           630: 
        !           631: getprob(player,playee,start,finish)
        !           632: int *player,*playee,start,finish;
        !           633: {                      /*returns the probability (times 102) that any
        !           634:                          pieces belonging to 'player' and lying between
        !           635:                          his points 'start' and 'finish' will be hit
        !           636:                          by a piece belonging to playee
        !           637:                        */
        !           638:        int     k, n, sum;
        !           639: 
        !           640:        sum = 0;
        !           641:        for(; start <= finish; start++){
        !           642:                if(player[start] == 1){
        !           643:                        for(k = 1; k <= 12; k++){
        !           644:                                if((n=25-start-k) < 0)
        !           645:                                        break;
        !           646:                                if(playee[n] != 0)
        !           647:                                        sum += probability[k];
        !           648:                        }
        !           649:                }
        !           650:        }
        !           651:        return(sum);
        !           652: }
        !           653: prtbrd()
        !           654: {
        !           655:        int     k;
        !           656:        static char undersc[]="______________________________________________________";
        !           657: 
        !           658:        fprintf(stdout, "White's Home\n%s\r",undersc);
        !           659:        for(k = 1; k <= 6; k++)
        !           660:                fprintf(stdout, "%4d",k);
        !           661:        fprintf(stdout, "    ");
        !           662:        for(k = 7; k <= 12; k++)
        !           663:                fprintf(stdout, "%4d",k); 
        !           664:        putchar('\n');
        !           665:        numline(brown, white, 1, 6);
        !           666:        fprintf(stdout, "    ");
        !           667:        numline(brown, white, 7, 12);
        !           668:        putchar('\n');
        !           669:        colorline(brown, 'B', white, 'W', 1, 6);
        !           670:        fprintf(stdout, "    ");
        !           671:        colorline(brown, 'B', white, 'W', 7, 12);
        !           672:        putchar('\n');
        !           673:        if(white[0] != 0)
        !           674:                fprintf(stdout, "%28dW\n",white[0]);
        !           675:        else
        !           676:                putchar('\n');
        !           677:        if(brown[0] != 0)
        !           678:                fprintf(stdout, "%28dB\n", brown[0]);
        !           679:        else
        !           680:                putchar('\n');
        !           681:        colorline(white, 'W', brown, 'B', 1, 6);
        !           682:        fprintf(stdout, "    ");
        !           683:        colorline(white, 'W', brown, 'B', 7, 12);
        !           684:        fprintf(stdout, "\n%s\r",undersc);
        !           685:        numline(white, brown, 1, 6);
        !           686:        fprintf(stdout, "    ");
        !           687:        numline(white, brown, 7, 12);
        !           688:        putchar('\n');
        !           689:        for(k = 24; k >= 19; k--)
        !           690:                fprintf(stdout, "%4d",k);
        !           691:        fprintf(stdout, "    ");
        !           692:        for(k = 18; k >= 13; k--)
        !           693:                fprintf(stdout, "%4d",k);
        !           694:        fprintf(stdout, "\nBrown's Home\n\n\n\n\n");
        !           695: }
        !           696: numline(upcol,downcol,start,fin)
        !           697: int *upcol,*downcol,start,fin;
        !           698: {
        !           699:        int     k, n;
        !           700: 
        !           701:        for(k = start; k <= fin; k++){
        !           702:                if((n = upcol[k]) != 0 || (n = downcol[25-k]) != 0)
        !           703:                        fprintf(stdout, "%4d", n);
        !           704:                else
        !           705:                        fprintf(stdout, "    ");
        !           706:        }
        !           707: }
        !           708: colorline(upcol,c1,downcol,c2,start,fin)
        !           709: int *upcol,*downcol,start,fin;
        !           710: char c1,c2;
        !           711: {
        !           712:        int     k;
        !           713:        char    c;
        !           714: 
        !           715:        for(k = start; k <= fin; k++){
        !           716:                c = ' ';
        !           717:                if(upcol[k] != 0)
        !           718:                        c = c1;
        !           719:                if(downcol[25-k] != 0)
        !           720:                        c = c2;
        !           721:                fprintf(stdout, "   %c",c);
        !           722:        }
        !           723: }

unix.superglobalmegacorp.com

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