Annotation of 43BSD/games/btlgammon.c, revision 1.1.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.