Annotation of 42BSD/games/btlgammon.c, revision 1.1

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

unix.superglobalmegacorp.com

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