X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=superhack.c;h=8ddd148cfec9e9095ad0b9ad88974a0db3b51c12;hb=534e3e36786bd08665285fa3a7bf4dd3cc174e7b;hp=eacb8eb2d9befc0e91a9c3d7663e5a1ca92dfc0f;hpb=b709cdac8d6ce287a2d71a40f864b4e47f0ac265;p=wumpus.git diff --git a/superhack.c b/superhack.c index eacb8eb..8ddd148 100644 --- a/superhack.c +++ b/superhack.c @@ -8,16 +8,23 @@ * * Any resemblance to persons living or dead is strictly coincidental. And * if you believe *that*... + * + * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include +#include +#include +#include +#include static int path[5]; static int j, k, scratchloc, pies; static char inp[BUFSIZ]; /* common input buffer */ +#define NUMBERS "0123456789" #define YOU 0 #define RMS 1 #define STARLET1 2 @@ -34,6 +41,8 @@ static int loc[LOCS]; #define LOSE -1 static int finished; +#define IGNORE(r) do{if(r);}while(0) + static int cave[20][3] = { {1,4,7}, @@ -68,8 +77,9 @@ int getlet(prompt) char *prompt; { (void) printf("%s? ", prompt); - if(fgets(inp, sizeof(inp), stdin)) + if (fgets(inp, sizeof(inp), stdin)) { return(tolower(inp[0])); + } else { fputs("\n",stdout); exit(1); @@ -80,8 +90,6 @@ char *prompt; void print_instructions() { - char ebuf[BUFSIZ]; - PM("Welcome to `Hunt the Superhack'\n") PM(" The superhack lives on the 9th floor of 45 Technology Square in"); @@ -104,7 +112,7 @@ PM("Cambridge, Massachusetts. Your mission is to throw a pie in his face.\n"); PM(" If a pie hits the superhack, you win. If it hits you, you lose!\n"); (void) fputs("", stdout); - (void) fgets(inp, sizeof(inp), stdin); + IGNORE(fgets(inp, sizeof(inp), stdin)); (void) putchar('\n'); PM("Hazards:"); @@ -158,9 +166,11 @@ int where; retry: newloc = FNA(); - for (j = 0; j < LOCS; j++) - if (loc[j] == newloc) + for (j = 0; j < LOCS; j++) { + if (loc[j] == newloc) { goto retry; + } + } loc[where] = newloc; } @@ -206,14 +216,18 @@ void check_hazards() { int room = cave[loc[YOU]][k]; - if (room == loc[RMS]) + if (room == loc[RMS]) { (void) puts("I smell a superhack!"); - else if (room == loc[STARLET1] || room == loc[STARLET2]) + } + else if (room == loc[STARLET1] || room == loc[STARLET2]) { (void) puts("I smell perfume!"); - else if (room == loc[DROID1] || room == loc[DROID2]) + } + else if (room == loc[DROID1] || room == loc[DROID2]) { (void) puts("Droids nearby!"); - else if (room == loc[LUSER1] || room == loc[LUSER2]) + } + else if (room == loc[LUSER1] || room == loc[LUSER2]) { (void) puts("Lusers nearby!"); + } } } @@ -222,20 +236,22 @@ void throw() extern void check_shot(), move_superhack(); int j9; - j9 = sscanf(inp + isalpha(inp[0]), "%d %d %d %d %d", + j9 = sscanf(inp + strcspn(inp, NUMBERS), "%d %d %d %d %d", &path[0], &path[1], &path[2], &path[3], &path[4]); + if (j9 < 1) { PM("Sorry, I didn't see any room numbers after your throw command."); return; } - for (k = 0; k < j9; k++) - if (path[k] == path[k - 2]) + for (k = 0; k < j9; k++) { + if (k >= 2 && path[k] == path[k - 2]) { (void) puts("Pies can't fly that crookedly --- try again."); return; } + } scratchloc = loc[YOU]; @@ -249,8 +265,9 @@ void throw() { scratchloc = path[k]; check_shot(); - if (finished != NOT) + if (finished != NOT) { return; + } } } @@ -261,7 +278,6 @@ void throw() } - ammo: if (finished == NOT) { (void) puts("You missed."); @@ -270,8 +286,9 @@ void throw() move_superhack(); - if (--pies <= 0) + if (--pies <= 0) { finished = LOSE; + } } } @@ -295,11 +312,13 @@ void move_superhack() { k = FNC(); - if (k < 3) + if (k < 3) { loc[RMS] = cave[loc[RMS]][k]; + } - if (loc[RMS] != loc[YOU]) + if (loc[RMS] != loc[YOU]) { return; + } (void) puts("The superhack flames you to a crisp. You lose!"); @@ -309,7 +328,7 @@ void move_superhack() void move() { - if (sscanf(inp + isalpha(inp[0]), "%d", &scratchloc) < 1) + if (sscanf(inp + strcspn(inp, NUMBERS), "%d", &scratchloc) < 1) { PM("Sorry, I didn't see a room number after your `m' command."); return; @@ -317,9 +336,11 @@ void move() scratchloc--; - for (k = 0; k < 3; k++) - if (cave[loc[YOU]][k] == scratchloc) - goto goodmove; + for (k = 0; k < 3; k++) { + if (cave[loc[YOU]][k] == scratchloc) { + goto goodmove; + } + } PM("You can't get there from here!"); return; @@ -350,27 +371,32 @@ goodmove: } } -main(argc, argv) -int argc; -char *argv[]; +int main(int argc, char *argv[]) { - if (argc >= 2 && strcmp(argv[1], "-s") == 0) - srand(atoi(argv[2])); - else - srand((int)time((long *) 0)); + if (argc >= 2 && strcmp(argv[1], "-s") == 0) { + srand(atoi(argv[2])); + } + else { + srand((int)time((long *) 0)); + } for (;;) { badlocs: - for (j = 0; j < LOCS; j++) - loc[j] = FNA(); + for (j = 0; j < LOCS; j++) { + loc[j] = FNA(); + } - for (j = 0; j < LOCS; j++) - for (k = 0; k < LOCS; k++) - if (j == k) - continue; - else if (loc[j] == loc[k]) - goto badlocs; + for (j = 0; j < LOCS; j++) { + for (k = 0; k < LOCS; k++) { + if (j == k) { + continue; + } + else if (loc[j] == loc[k]) { + goto badlocs; + } + } + } (void) puts("Hunt the Superhack"); @@ -386,12 +412,15 @@ char *argv[]; c = getlet("Throw, move or help [t,m,?]"); - if (c == 't') + if (c == 't') { throw(); - else if (c == 'm') + } + else if (c == 'm') { move(); - else if (c == '?') + } + else if (c == '?') { print_instructions(); + } #ifdef DEBUG else if (c == 'd') { @@ -423,6 +452,7 @@ char *argv[]; break; } } + return 0; } /* superhack.c ends here */