Annotation of 43BSD/games/wump.c, revision 1.1.1.1

1.1       root        1: 
                      2: static char sccsid[] = "       wump.c  4.1     82/10/24        ";
                      3: 
                      4: #
                      5: #include <stdio.h>
                      6: 
                      7: /*
                      8:  *     wumpus
                      9:  *     stolen from PCC Vol 2 No 1
                     10:  */
                     11: 
                     12: #define        NBAT    3
                     13: #define        NROOM   20
                     14: #define        NTUNN   3
                     15: #define        NPIT    3
                     16: #define BIGINT 2147483648.0
                     17: 
                     18: struct room
                     19: {
                     20:        int     tunn[NTUNN];
                     21:        int     flag;
                     22: } room[NROOM];
                     23: 
                     24: char   *intro[] =
                     25: {
                     26:        "\n",
                     27:        "Welcome to 'Hunt the Wumpus.'\n",
                     28:        "\n",
                     29:        "The Wumpus lives in a cave of %d rooms.\n",
                     30:        "Each room has %d tunnels leading to other rooms.\n",
                     31:        "\n",
                     32:        "Hazards:\n",
                     33:        "\n",
                     34:        "Bottomless Pits - Some rooms have Bottomless Pits in them.\n",
                     35:        "       If you go there, you fall into the pit and lose!\n",
                     36:        "Super Bats - Some other rooms have super bats.\n",
                     37:        "       If you go there, a bat will grab you and take you to\n",
                     38:        "       somewhere else in the cave where you could\n",
                     39:        "       fall into a pit or run into the . . .\n",
                     40:        "\n",
                     41:        "Wumpus:\n",
                     42:        "\n",
                     43:        "The Wumpus is not bothered by the hazards since\n",
                     44:        "he has sucker feet and is too big for a bat to lift.\n",
                     45:        "\n",
                     46:        "Usually he is asleep.\n",
                     47:        "Two things wake him up:\n",
                     48:        "       your entering his room\n",
                     49:        "       your shooting an arrow anywhere in the cave.\n",
                     50:        "If the wumpus wakes, he either decides to move one room or\n",
                     51:        "stay where he was.  But if he ends up where you are,\n",
                     52:        "he eats you up and you lose!\n",
                     53:        "\n",
                     54:        "You:\n",
                     55:        "\n",
                     56:        "Each turn you may either move or shoot a crooked arrow.\n",
                     57:        "\n",
                     58:        "Moving - You can move to one of the adjoining rooms;\n",
                     59:        "       that is, to one that has a tunnel connecting it with\n",
                     60:        "       the room you are in.\n",
                     61:        "\n",
                     62:        "Shooting - You have 5 arrows.  You lose when you run out.\n",
                     63:        "       Each arrow can go from 1 to 5 rooms.\n",
                     64:        "       You aim by telling the computer\n",
                     65:        "       The arrow's path is a list of room numbers\n",
                     66:        "       telling the arrow which room to go to next.\n",
                     67:        "       The list is terminated with a 0.\n",
                     68:        "       The first room in the path must be connected to the\n",
                     69:        "       room you are in.  Each succeeding room must be\n",
                     70:        "       connected to the previous room.\n",
                     71:        "       If there is no tunnel between two of the rooms\n",
                     72:        "       in the arrow's path, the arrow chooses one of the\n",
                     73:        "       three tunnels from the room it's in and goes its\n",
                     74:        "       own way.\n",
                     75:        "\n",
                     76:        "       If the arrow hits the wumpus, you win!\n",
                     77:        "       If the arrow hits you, you lose!\n",
                     78:        "\n",
                     79:        "Warnings:\n",
                     80:        "\n",
                     81:        "When you are one or two rooms away from the wumpus,\n",
                     82:        "the computer says:\n",
                     83:        "               'I smell a Wumpus'\n",
                     84:        "When you are one room away from some other hazard, it says:\n",
                     85:        "               Bat    - 'Bats nearby'\n",
                     86:        "               Pit    - 'I feel a draft'\n",
                     87:        "\n",
                     88:        0,
                     89: };
                     90: 
                     91: #define        BAT     01
                     92: #define        PIT     02
                     93: #define        WUMP    04
                     94: 
                     95: int    arrow;
                     96: int    loc;
                     97: int    wloc;
                     98: int    tchar;
                     99: 
                    100: main()
                    101: {
                    102:        register i, j;
                    103:        register struct room *p;
                    104:        int k, icomp();
                    105: 
                    106:        printf("Instructions? (y-n) ");
                    107:        if(rline() == 'y')
                    108:                for(i=0; intro[i]; i++)
                    109:                        printf(intro[i], i&1? NROOM: NTUNN);
                    110: 
                    111: 
                    112: /*
                    113:  * initialize the room connections
                    114:  */
                    115: 
                    116: init:
                    117:        p = &room[0];
                    118:        for(i=0; i<NROOM; i++) {
                    119:                for(j=0; j<NTUNN; j++)
                    120:                        p->tunn[j] = -1;
                    121:                p++;
                    122:        }
                    123:        k = 0;
                    124:        for(i=1; i<NROOM; ) {
                    125:                j = rnum(NROOM);
                    126:                p = &room[j];
                    127:                if(j == k || p->tunn[0] >= 0 || p->tunn[1] >= 0)
                    128:                        continue;
                    129:                p->tunn[1] = k;
                    130:                room[k].tunn[0] = j;
                    131:                k = j;
                    132:                i++;
                    133:        }
                    134:        p = &room[0];
                    135:        for(i=0; i<NROOM; i++) {
                    136:                for(j=0; j<NTUNN; j++) {
                    137:                        if(p->tunn[j] < 0)
                    138:                                p->tunn[j] = tunnel(i);
                    139:                        if(p->tunn[j] == i)
                    140:                                goto init;
                    141:                        for(k=0; k<j; k++)
                    142:                                if(p->tunn[j] == p->tunn[k])
                    143:                                        goto init;
                    144:                }
                    145:                qsort(&p->tunn[0], NTUNN, sizeof(p->tunn[0]), icomp);
                    146:                p++;
                    147:        }
                    148: 
                    149: /*
                    150:  * put in player, wumpus,
                    151:  * pits and bats
                    152:  */
                    153: 
                    154: setup:
                    155:        arrow = 5;
                    156:        p = &room[0];
                    157:        for(i=0; i<NROOM; i++) {
                    158:                p->flag = 0;
                    159:                p++;
                    160:        }
                    161:        for(i=0; i<NPIT; ) {
                    162:                p = &room[rnum(NROOM)];
                    163:                if((p->flag&PIT) == 0) {
                    164:                        p->flag |= PIT;
                    165:                        i++;
                    166:                }
                    167:        }
                    168:        for(i=0; i<NBAT; ) {
                    169:                p = &room[rnum(NROOM)];
                    170:                if((p->flag&(PIT|BAT)) == 0) {
                    171:                        p->flag |= BAT;
                    172:                        i++;
                    173:                }
                    174:        }
                    175:        i = rnum(NROOM);
                    176:        wloc = i;
                    177:        room[i].flag |= WUMP;
                    178:        for(;;) {
                    179:                i = rnum(NROOM);
                    180:                if((room[i].flag&(PIT|BAT|WUMP)) == 0) {
                    181:                        loc = i;
                    182:                        break;
                    183:                }
                    184:        }
                    185: 
                    186: /*
                    187:  *     main loop of the game
                    188:  */
                    189: 
                    190: loop:
                    191:        printf("You are in room %d\n", loc+1);
                    192:        p = &room[loc];
                    193:        if(p->flag&PIT) {
                    194:                printf("You fell into a pit\n");
                    195:                goto done;
                    196:        }
                    197:        if(p->flag&WUMP) {
                    198:                printf("You were eaten by the wumpus\n");
                    199:                goto done;
                    200:        }
                    201:        if(p->flag&BAT) {
                    202:                printf("Theres a bat in your room\n");
                    203:                loc = rnum(NROOM);
                    204:                goto loop;
                    205:        }
                    206:        for(i=0; i<NTUNN; i++)
                    207:        if(near(&room[p->tunn[i]], WUMP))
                    208:                goto nearwump;
                    209:        if (near(p, WUMP)) {
                    210:        nearwump:
                    211:                printf("I smell a wumpus\n");
                    212:        }
                    213:        if (near(p, BAT))
                    214:                printf("Bats nearby\n");
                    215:        if (near(p, PIT))
                    216:                printf("I feel a draft\n");
                    217:        printf("There are tunnels to");
                    218:        for(i=0; i<NTUNN; i++)
                    219:                printf(" %d", p->tunn[i]+1);
                    220:        printf("\n");
                    221: 
                    222: again:
                    223:        printf("Move or shoot (m-s) ");
                    224:        switch(rline()) {
                    225:        case 'm':
                    226:                if(tchar == '\n')
                    227:                        printf("which room? ");
                    228:                i = rin()-1;
                    229:                for(j=0; j<NTUNN; j++)
                    230:                        if(i == p->tunn[j])
                    231:                                goto groom;
                    232:                printf("You hit the wall\n");
                    233:                goto again;
                    234:        groom:
                    235:                loc = i;
                    236:                if(i == wloc)
                    237:                        goto mwump;
                    238:                goto loop;
                    239: 
                    240:        case 's':
                    241:                if(tchar == '\n')
                    242:                        printf("Give list of rooms terminated by 0\n");
                    243:                for(i=0; i<5; i++) {
                    244:                        j = rin()-1;
                    245:                        if(j == -1)
                    246:                                break;
                    247:                ranarw:
                    248:                        for(k=0; k<NTUNN; k++)
                    249:                                if(j == p->tunn[k])
                    250:                                        goto garow;
                    251:                        j = rnum(NROOM);
                    252:                        goto ranarw;
                    253:                garow:
                    254:                        p = &room[j];
                    255:                        if(j == loc) {
                    256:                                printf("You shot yourself\n");
                    257:                                goto done;
                    258:                        }
                    259:                        if(p->flag&WUMP) {
                    260:                                printf("You slew the wumpus\n");
                    261:                                goto done;
                    262:                        }
                    263:                }
                    264:                if(--arrow == 0) {
                    265:                        printf("That was your last shot\n");
                    266:                        goto done;
                    267:                }
                    268:                goto mwump;
                    269:        }
                    270: 
                    271:        goto again;
                    272: 
                    273: mwump:
                    274:        p = &room[wloc];
                    275:        p->flag &= ~WUMP;
                    276:        i = rnum(NTUNN+1);
                    277:        if(i != NTUNN)
                    278:                wloc = p->tunn[i];
                    279:        room[wloc].flag |= WUMP;
                    280:        goto loop;
                    281: 
                    282: done:
                    283:        drain();
                    284:        printf("Another game? (y-n) ");
                    285:        if(rline() != 'n') {
                    286:                drain();
                    287:                printf("Same room setup? (y-n) ");
                    288:                if(rline() != 'n')
                    289:                        goto setup;
                    290:                goto init;
                    291:        }
                    292: }
                    293: 
                    294: tunnel(i)
                    295: {
                    296:        register struct room *p;
                    297:        register n, j;
                    298:        int c;
                    299: 
                    300:        c = 20;
                    301: 
                    302: loop:
                    303:        n = rnum(NROOM);
                    304:        if(n == i)
                    305:                if(--c > 0)
                    306:                        goto loop;
                    307:        p = &room[n];
                    308:        for(j=0; j<NTUNN; j++)
                    309:        if(p->tunn[j] == -1) {
                    310:                p->tunn[j] = i;
                    311:                return(n);
                    312:        }
                    313:        goto loop;
                    314: }
                    315: 
                    316: rline()
                    317: {
                    318:        register char c, r;
                    319: 
                    320:        while((c=getchar()) == ' ');
                    321:        r = c;
                    322:        while(c != '\n' && c != ' ') {
                    323:                if(c == EOF)
                    324:                        exit();
                    325:                c = getchar();
                    326:        }
                    327:        tchar = c;
                    328:        return(r);
                    329: }
                    330: 
                    331: rnum(n)
                    332: {
                    333:        static short first[2];
                    334: 
                    335:        if(first[1] == 0) {
                    336:                time(first);
                    337:                if(first[1]==0) first[1] = 1;
                    338:                srand((first[1]*first[0])^first[1]);
                    339:        }
                    340:        return((int)((rand()/BIGINT) * n));
                    341: }
                    342: 
                    343: rin()
                    344: {
                    345:        register n, c;
                    346: 
                    347:        n = 0;
                    348:        c = getchar();
                    349:        while(c != '\n' && c != ' ') {
                    350:                if(c<'0' || c>'9') {
                    351:                        while(c != '\n') {
                    352:                                if(c == EOF)
                    353:                                        exit();
                    354:                                c = getchar();
                    355:                        }
                    356:                        return(0);
                    357:                }
                    358:                n = n*10 + c-'0';
                    359:                c = getchar();
                    360:        }
                    361:        return(n);
                    362: }
                    363: 
                    364: near(ap, ahaz)
                    365: struct room *ap;
                    366: {
                    367:        register struct room *p;
                    368:        register haz, i;
                    369: 
                    370:        p = ap;
                    371:        haz = ahaz;
                    372:        for(i=0; i<NTUNN; i++)
                    373:        if(room[p->tunn[i]].flag & haz)
                    374:                return (1);
                    375:        return(0);
                    376: }
                    377: 
                    378: icomp(p1, p2)
                    379: int *p1, *p2;
                    380: {
                    381: 
                    382:        return(*p1 - *p2);
                    383: }
                    384: #include <sgtty.h>
                    385: drain()
                    386: {
                    387:        register FILE *port = stdin;
                    388:        register int iodes = fileno(port);
                    389:        struct sgttyb arg;
                    390: 
                    391:        port->_cnt = 0;
                    392:        port->_ptr = port->_base;
                    393:        if(gtty(iodes,&arg) != -1) stty(iodes,&arg);
                    394: }

unix.superglobalmegacorp.com

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