Annotation of 43BSD/games/worms.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: char copyright[] =
        !             3: "@(#) Copyright (c) 1980 Regents of the University of California.\n\
        !             4:  All rights reserved.\n";
        !             5: #endif not lint
        !             6: 
        !             7: #ifndef lint
        !             8: static char sccsid[] = "@(#)worms.c    5.3 (Berkeley) 7/15/85";
        !             9: #endif not lint
        !            10: 
        !            11: #define BSD
        !            12: 
        !            13: /*
        !            14: 
        !            15:         @@@        @@@    @@@@@@@@@@     @@@@@@@@@@@    @@@@@@@@@@@@
        !            16:         @@@        @@@   @@@@@@@@@@@@    @@@@@@@@@@@@   @@@@@@@@@@@@@
        !            17:         @@@        @@@  @@@@      @@@@   @@@@           @@@@ @@@  @@@@
        !            18:         @@@   @@   @@@  @@@        @@@   @@@            @@@  @@@   @@@
        !            19:         @@@  @@@@  @@@  @@@        @@@   @@@            @@@  @@@   @@@
        !            20:         @@@@ @@@@ @@@@  @@@        @@@   @@@            @@@  @@@   @@@
        !            21:          @@@@@@@@@@@@   @@@@      @@@@   @@@            @@@  @@@   @@@
        !            22:           @@@@  @@@@     @@@@@@@@@@@@    @@@            @@@  @@@   @@@
        !            23:            @@    @@       @@@@@@@@@@     @@@            @@@  @@@   @@@
        !            24: 
        !            25:                                 Eric P. Scott
        !            26:                          Caltech High Energy Physics
        !            27:                                 October, 1980
        !            28: 
        !            29: */
        !            30: #include <stdio.h>
        !            31: #ifdef USG
        !            32: #include <termio.h>
        !            33: #else
        !            34: #include <sgtty.h>
        !            35: #endif
        !            36: #include <signal.h>
        !            37: #define cursor(col,row) tputs(tgoto(CM,col,row),1,fputchar)
        !            38: extern char *UP;
        !            39: extern short ospeed;
        !            40: int Wrap;
        !            41: short *ref[24];
        !            42: static char flavor[]={
        !            43:     'O', '*', '#', '$', '%', '0'
        !            44: };
        !            45: static short xinc[]={
        !            46:      1,  1,  1,  0, -1, -1, -1,  0
        !            47: }, yinc[]={
        !            48:     -1,  0,  1,  1,  1,  0, -1, -1
        !            49: };
        !            50: static struct worm {
        !            51:     int orientation, head;
        !            52:     short *xpos, *ypos;
        !            53: } worm[40];
        !            54: static char *field;
        !            55: static int length=16, number=3, trail=' ';
        !            56: static struct options {
        !            57:     int nopts;
        !            58:     int opts[3];
        !            59: } normal[8]={
        !            60:     { 3, { 7, 0, 1 } },
        !            61:     { 3, { 0, 1, 2 } },
        !            62:     { 3, { 1, 2, 3 } },
        !            63:     { 3, { 2, 3, 4 } },
        !            64:     { 3, { 3, 4, 5 } },
        !            65:     { 3, { 4, 5, 6 } },
        !            66:     { 3, { 5, 6, 7 } },
        !            67:     { 3, { 6, 7, 0 } }
        !            68: }, upper[8]={
        !            69:     { 1, { 1, 0, 0 } },
        !            70:     { 2, { 1, 2, 0 } },
        !            71:     { 0, { 0, 0, 0 } },
        !            72:     { 0, { 0, 0, 0 } },
        !            73:     { 0, { 0, 0, 0 } },
        !            74:     { 2, { 4, 5, 0 } },
        !            75:     { 1, { 5, 0, 0 } },
        !            76:     { 2, { 1, 5, 0 } }
        !            77: }, left[8]={
        !            78:     { 0, { 0, 0, 0 } },
        !            79:     { 0, { 0, 0, 0 } },
        !            80:     { 0, { 0, 0, 0 } },
        !            81:     { 2, { 2, 3, 0 } },
        !            82:     { 1, { 3, 0, 0 } },
        !            83:     { 2, { 3, 7, 0 } },
        !            84:     { 1, { 7, 0, 0 } },
        !            85:     { 2, { 7, 0, 0 } }
        !            86: }, right[8]={
        !            87:     { 1, { 7, 0, 0 } },
        !            88:     { 2, { 3, 7, 0 } },
        !            89:     { 1, { 3, 0, 0 } },
        !            90:     { 2, { 3, 4, 0 } },
        !            91:     { 0, { 0, 0, 0 } },
        !            92:     { 0, { 0, 0, 0 } },
        !            93:     { 0, { 0, 0, 0 } },
        !            94:     { 2, { 6, 7, 0 } }
        !            95: }, lower[8]={
        !            96:     { 0, { 0, 0, 0 } },
        !            97:     { 2, { 0, 1, 0 } },
        !            98:     { 1, { 1, 0, 0 } },
        !            99:     { 2, { 1, 5, 0 } },
        !           100:     { 1, { 5, 0, 0 } },
        !           101:     { 2, { 5, 6, 0 } },
        !           102:     { 0, { 0, 0, 0 } },
        !           103:     { 0, { 0, 0, 0 } }
        !           104: }, upleft[8]={
        !           105:     { 0, { 0, 0, 0 } },
        !           106:     { 0, { 0, 0, 0 } },
        !           107:     { 0, { 0, 0, 0 } },
        !           108:     { 0, { 0, 0, 0 } },
        !           109:     { 0, { 0, 0, 0 } },
        !           110:     { 1, { 3, 0, 0 } },
        !           111:     { 2, { 1, 3, 0 } },
        !           112:     { 1, { 1, 0, 0 } }
        !           113: }, upright[8]={
        !           114:     { 2, { 3, 5, 0 } },
        !           115:     { 1, { 3, 0, 0 } },
        !           116:     { 0, { 0, 0, 0 } },
        !           117:     { 0, { 0, 0, 0 } },
        !           118:     { 0, { 0, 0, 0 } },
        !           119:     { 0, { 0, 0, 0 } },
        !           120:     { 0, { 0, 0, 0 } },
        !           121:     { 1, { 5, 0, 0 } }
        !           122: }, lowleft[8]={
        !           123:     { 3, { 7, 0, 1 } },
        !           124:     { 0, { 0, 0, 0 } },
        !           125:     { 0, { 0, 0, 0 } },
        !           126:     { 1, { 1, 0, 0 } },
        !           127:     { 2, { 1, 7, 0 } },
        !           128:     { 1, { 7, 0, 0 } },
        !           129:     { 0, { 0, 0, 0 } },
        !           130:     { 0, { 0, 0, 0 } }
        !           131: }, lowright[8]={
        !           132:     { 0, { 0, 0, 0 } },
        !           133:     { 1, { 7, 0, 0 } },
        !           134:     { 2, { 5, 7, 0 } },
        !           135:     { 1, { 5, 0, 0 } },
        !           136:     { 0, { 0, 0, 0 } },
        !           137:     { 0, { 0, 0, 0 } },
        !           138:     { 0, { 0, 0, 0 } },
        !           139:     { 0, { 0, 0, 0 } }
        !           140: };
        !           141: char *TE;
        !           142: main(argc,argv)
        !           143: int argc;
        !           144: char *argv[];
        !           145: {
        !           146:     extern fputchar();
        !           147:     char *malloc();
        !           148:     char *getenv();
        !           149:     char *tgetstr(), *tgoto();
        !           150:     int quit();
        !           151:     float ranf();
        !           152:     register int x, y;
        !           153:     register int n;
        !           154:     register struct worm *w;
        !           155:     register struct options *op;
        !           156:     register int h;
        !           157:     register short *ip;
        !           158:     char *AL, *BC, *CM, *EI, *HO, *IC, *IM, *IP, *SR;
        !           159:     int CO, IN, LI, last, bottom;
        !           160:     char *tcp;
        !           161:     register char *term;
        !           162:     char tcb[100];
        !           163: #ifdef USG
        !           164:     struct termio sg;
        !           165: #else
        !           166:     struct sgttyb sg;
        !           167: #endif
        !           168:     setbuf(stdout,malloc(BUFSIZ));
        !           169:     for (x=1;x<argc;x++) {
        !           170:        register char *p;
        !           171:        p=argv[x];
        !           172:        if (*p=='-') p++;
        !           173:        switch (*p) {
        !           174:        case 'f':
        !           175:            field="WORM";
        !           176:            break;
        !           177:        case 'l':
        !           178:            if (++x==argc) goto usage;
        !           179:            if ((length=atoi(argv[x]))<2||length>1024) {
        !           180:                fprintf(stderr,"%s: Invalid length\n",*argv);
        !           181:                exit(1);
        !           182:            }
        !           183:            break;
        !           184:        case 'n':
        !           185:            if (++x==argc) goto usage;
        !           186:            if ((number=atoi(argv[x]))<1||number>40) {
        !           187:                fprintf(stderr,"%s: Invalid number of worms\n",*argv);
        !           188:                exit(1);
        !           189:            }
        !           190:            break;
        !           191:        case 't':
        !           192:            trail='.';
        !           193:            break;
        !           194:        default:
        !           195:        usage:
        !           196:            fprintf(stderr,
        !           197:                "usage: %s [-field] [-length #] [-number #] [-trail]\n",*argv);
        !           198:            exit(1);
        !           199:            break;
        !           200:        }
        !           201:     }
        !           202:     if (!(term=getenv("TERM"))) {
        !           203:        fprintf(stderr,"%s: TERM: parameter not set\n",*argv);
        !           204:        exit(1);
        !           205:     }
        !           206:     if (tgetent(malloc(1024),term)<=0) {
        !           207:        fprintf(stderr,"%s: %s: unknown terminal type\n",*argv,term);
        !           208:        exit(1);
        !           209:     }
        !           210:     tcp=tcb;
        !           211:     if (!(CM=tgetstr("cm",&tcp))) {
        !           212:        fprintf(stderr,"%s: terminal not capable of cursor motion\n",*argv);
        !           213:        exit(1);
        !           214:     }
        !           215:     AL=tgetstr("al",&tcp);
        !           216:     BC=tgetflag("bs") ? "\b" : tgetstr("bc",&tcp);
        !           217:     if ((CO=tgetnum("co"))<=0) CO=80;
        !           218:     last=CO-1;
        !           219:     EI=tgetstr("ei",&tcp);
        !           220:     HO=tgetstr("ho",&tcp);
        !           221:     IC=tgetstr("ic",&tcp);
        !           222:     IM=tgetstr("im",&tcp);
        !           223:     IN=tgetflag("in");
        !           224:     IP=tgetstr("ip",&tcp);
        !           225:     if ((LI=tgetnum("li"))<=0) LI=24;
        !           226:     bottom=LI-1;
        !           227:     SR=tgetstr("sr",&tcp);
        !           228:     TE=tgetstr("te",&tcp);
        !           229:     UP=tgetstr("up",&tcp);
        !           230: #ifdef USG
        !           231:     ioctl(fileno(stdout),TCGETA,&sg);
        !           232:     ospeed=sg.c_cflag&CBAUD;
        !           233: #else
        !           234:     gtty(fileno(stdout),&sg);
        !           235:     ospeed=sg.sg_ospeed;
        !           236: #endif
        !           237:     Wrap=tgetflag("am");
        !           238:     ip=(short *)malloc(LI*CO*sizeof (short));
        !           239:     for (n=0;n<LI;) {
        !           240:        ref[n++]=ip; ip+=CO;
        !           241:     }
        !           242:     for (ip=ref[0],n=LI*CO;--n>=0;) *ip++=0;
        !           243:     if (Wrap) ref[bottom][last]=1;
        !           244:     for (n=number, w= &worm[0];--n>=0;w++) {
        !           245:        w->orientation=w->head=0;
        !           246:        if (!(ip=(short *)malloc(length*sizeof (short)))) {
        !           247:            fprintf(stderr,"%s: out of memory\n",*argv);
        !           248:            exit(1);
        !           249:        }
        !           250:        w->xpos=ip;
        !           251:        for (x=length;--x>=0;) *ip++ = -1;
        !           252:        if (!(ip=(short *)malloc(length*sizeof (short)))) {
        !           253:            fprintf(stderr,"%s: out of memory\n",*argv);
        !           254:            exit(1);
        !           255:        }
        !           256:        w->ypos=ip;
        !           257:        for (y=length;--y>=0;) *ip++ = -1;
        !           258:     }
        !           259:     signal(SIGINT, quit);
        !           260:     tputs(tgetstr("ti",&tcp),1,fputchar);
        !           261:     tputs(tgetstr("cl",&tcp),1,fputchar);
        !           262:     if (field) {
        !           263:        register char *p;
        !           264:        p=field;
        !           265:        for (y=bottom;--y>=0;) {
        !           266:            for (x=CO;--x>=0;) {
        !           267:                putchar(*p++);
        !           268:                if (!*p) p=field;
        !           269:            }
        !           270:             if (!Wrap) putchar('\n');
        !           271:             fflush(stdout);
        !           272:         }
        !           273:        if (Wrap) {
        !           274:            if (IM&&!IN) {
        !           275:                for (x=last;--x>0;) {
        !           276:                    putchar(*p++);
        !           277:                    if (!*p) p=field;
        !           278:                }
        !           279:                y= *p++; if (!*p) p=field;
        !           280:                putchar(*p);
        !           281:                if (BC) tputs(BC,1,fputchar);
        !           282:                else cursor(last-1,bottom);
        !           283:                tputs(IM,1,fputchar);
        !           284:                if (IC) tputs(IC,1,fputchar);
        !           285:                putchar(y);
        !           286:                if (IP) tputs(IP,1,fputchar);
        !           287:                tputs(EI,1,fputchar);
        !           288:            }
        !           289:            else if (SR||AL) {
        !           290:                if (HO) tputs(HO,1,fputchar);
        !           291:                else cursor(0,0);
        !           292:                if (SR) tputs(SR,1,fputchar);
        !           293:                else tputs(AL,LI,fputchar);
        !           294:                for (x=CO;--x>=0;) {
        !           295:                    putchar(*p++);
        !           296:                    if (!*p) p=field;
        !           297:                }
        !           298:            }
        !           299:            else for (x=last;--x>=0;) {
        !           300:                    putchar(*p++);
        !           301:                    if (!*p) p=field;
        !           302:            }
        !           303:        }
        !           304:        else for (x=CO;--x>=0;) {
        !           305:            putchar(*p++);
        !           306:            if (!*p) p=field;
        !           307:        }
        !           308:     }
        !           309:     fflush(stdout);
        !           310:     for (;;) {
        !           311:        for (n=0,w= &worm[0];n<number;n++,w++) {
        !           312:            if ((x=w->xpos[h=w->head])<0) {
        !           313:                cursor(x=w->xpos[h]=0,y=w->ypos[h]=bottom);
        !           314:                putchar(flavor[n%6]);
        !           315:                ref[y][x]++;
        !           316:            }
        !           317:            else y=w->ypos[h];
        !           318:            if (++h==length) h=0;
        !           319:            if (w->xpos[w->head=h]>=0) {
        !           320:                register int x1, y1;
        !           321:                x1=w->xpos[h]; y1=w->ypos[h];
        !           322:                if (--ref[y1][x1]==0) {
        !           323:                    cursor(x1,y1); putchar(trail);
        !           324:                }
        !           325:            }
        !           326:             op= &(x==0 ? (y==0 ? upleft : (y==bottom ? lowleft : left)) :
        !           327:                 (x==last ? (y==0 ? upright : (y==bottom ? lowright : right)) :
        !           328:                (y==0 ? upper : (y==bottom ? lower : normal))))[w->orientation];
        !           329:            switch (op->nopts) {
        !           330:            case 0:
        !           331:                fflush(stdout);
        !           332:                abort();
        !           333:                return;
        !           334:            case 1:
        !           335:                w->orientation=op->opts[0];
        !           336:                break;
        !           337:            default:
        !           338:                w->orientation=op->opts[(int)(ranf()*(float)op->nopts)];
        !           339:            }
        !           340:            cursor(x+=xinc[w->orientation], y+=yinc[w->orientation]);
        !           341:            if (!Wrap||x!=last||y!=bottom) putchar(flavor[n%6]);
        !           342:            ref[w->ypos[h]=y][w->xpos[h]=x]++;
        !           343:        }
        !           344:        fflush(stdout);
        !           345:     }
        !           346: }
        !           347: quit()
        !           348: {
        !           349:     signal(SIGINT, SIG_IGN);
        !           350:     tputs(TE,1,fputchar);
        !           351:     exit(0);
        !           352: }
        !           353: fputchar(c)
        !           354: char c;
        !           355: {
        !           356:     putchar(c);
        !           357: }
        !           358: float ranf() {
        !           359: #ifdef BSD
        !           360:     return((float)rand()/2147483647.);
        !           361: #else
        !           362:     return((float)rand()/32767.);
        !           363: #endif
        !           364: }

unix.superglobalmegacorp.com

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