diff options
author | Jakob Kaivo <jkk@ung.org> | 2019-12-05 12:57:52 -0500 |
---|---|---|
committer | Jakob Kaivo <jkk@ung.org> | 2019-12-05 12:57:52 -0500 |
commit | 2287af016aabde82d8df386d4ea62128177db05b (patch) | |
tree | c734b4ef3463813e8d64717d78a52235c6b69526 | |
parent | 5924009c0b3836c2f932a45d311b3c2f74e83178 (diff) |
close and print congratulations when you win
-rw-r--r-- | bs.c | 42 |
1 files changed, 30 insertions, 12 deletions
@@ -23,14 +23,16 @@ enum { VERTICAL, HORIZONTAL }; static struct ship { char *name; int len; + int sunk; } ships[] = { - { "Patrol Boat", 2 }, - { "Submarine", 2 }, - { "Cruiser", 3 }, - { "Destroyer", 3 }, - { "Battleship", 4 }, - { "Aircraft Carrier", 5 }, + { "Patrol Boat", 2, 0 }, + { "Submarine", 2, 0 }, + { "Cruiser", 3, 0 }, + { "Destroyer", 3, 0 }, + { "Battleship", 4, 0 }, + { "Aircraft Carrier", 5, 0 }, }; +size_t nships = sizeof(ships) / sizeof(ships[0]); static void usage(const char *progname, int status) { @@ -40,13 +42,16 @@ static void usage(const char *progname, int status) static int sunk(const char *board, int size, char c) { - int len = 0; int hits = 0; + struct ship *s = NULL; char hit = toupper(c); - for (size_t i = 0; i < sizeof(ships) / sizeof(ships[0]); i++) { + for (size_t i = 0; i < nships; i++) { if (hit == toupper(ships[i].name[0])) { - len = ships[i].len; + if (ships[i].sunk) { + return 1; + } + s = ships + i; break; } } @@ -55,7 +60,7 @@ static int sunk(const char *board, int size, char c) hits += (board[i] == hit); } - return hits == len; + return s->sunk = (hits == s->len); } static void cheat(const char *board, int size) @@ -108,7 +113,7 @@ static void updatescreen(const char *board, int size, char *input) printw("\n"); - for (size_t i = 0; i < sizeof(ships) / sizeof(ships[0]); i++) { + for (size_t i = 0; i < nships; i++) { printw("%d - %s\n", ships[i].len, ships[i].name); } @@ -150,7 +155,7 @@ static char *setup_board(int size) memset(board, BLANK_SPACE, size * size); - for (size_t i = 0; i < sizeof(ships) / sizeof(ships[0]); i++) { + for (size_t i = 0; i < nships; i++) { int loc = 0; do { loc = rand() % (size * size); @@ -257,5 +262,18 @@ int main(int argc, char *argv[]) } updatescreen(board1, size, inbuf); + + size_t nsunk = 0; + for (size_t i = 0; i < nships; i++) { + nsunk += ships[i].sunk; + } + + if (nsunk == nships) { + break; + } } + + endwin(); + printf("You won!\n"); + return 0; } |