diff options
Diffstat (limited to 'lib/libncurses/TESTS/bs.c')
-rw-r--r-- | lib/libncurses/TESTS/bs.c | 1209 |
1 files changed, 671 insertions, 538 deletions
diff --git a/lib/libncurses/TESTS/bs.c b/lib/libncurses/TESTS/bs.c index 8d41830..3785fcd 100644 --- a/lib/libncurses/TESTS/bs.c +++ b/lib/libncurses/TESTS/bs.c @@ -4,29 +4,43 @@ * with improved user interface, autoconfiguration and code cleanup * by Eric S. Raymond <esr@snark.thyrsus.com> * v1.2 with color support and minor portability fixes, November 1990 + * v2.0 featuring strict ANSI/POSIX conformance, November 1993. */ -#include <stdio.h> #include <ncurses.h> -#include <stdlib.h> -#ifndef NONPOSIX -#include <unistd.h> -#endif #include <signal.h> -#include <string.h> -#include <sys/time.h> #include <ctype.h> #include <assert.h> -#ifdef SYSV /* aha, must be an AT&T system... */ +#ifndef A_UNDERLINE /* BSD curses */ +#define beep() write(1,"\007",1); +#define cbreak crmode +#define saveterm savetty +#define resetterm resetty +#define nocbreak nocrmode +#define strchr index +#endif /* !A_UNDERLINE */ + +#ifdef isxdigit /* aha, must be an AT&T system... */ #define srand(n) srand48(n) #define rand() lrand48() extern long lrand48(); extern void srand48(); -#define bzero(s, n) memset((char *)(s), '\0', n) +#define bzero(s, n) (void)memset((char *)(s), '\0', n) extern char *memset(); -#endif /* SYSV */ +/* + * Try this if ungetch() fails to resolve. + * + * #define ungetch ungetc + */ +#endif /* isxdigit */ + +extern unsigned sleep(); +extern char *strchr(), *strcpy(); +extern long time(); +extern void exit(); +static bool checkplace(); /* * Constants for tuning the random-fire algorithm. It prefers moves that @@ -59,14 +73,14 @@ extern char *memset(); #define PXBASE 3 #define PY(y) (PYBASE + (y)) #define PX(x) (PXBASE + (x)*3) -#define pgoto(y, x) move(PY(y), PX(x)) +#define pgoto(y, x) (void)move(PY(y), PX(x)) /* how to position us on cpu board */ #define CYBASE 3 #define CXBASE 48 #define CY(y) (CYBASE + (y)) #define CX(x) (CXBASE + (x)*3) -#define cgoto(y, x) move(CY(y), CX(x)) +#define cgoto(y, x) (void)move(CY(y), CX(x)) #define ONBOARD(x, y) (x >= 0 && x < BWIDTH && y >= 0 && y < BDEPTH) @@ -90,7 +104,7 @@ static char destroy[] = "Destroyer"; static char ptboat[] = "PT Boat"; static char name[40]; -static char dftname[] = "Stranger"; +static char dftname[] = "stranger"; /* direction constants */ #define E 0 @@ -115,7 +129,7 @@ typedef struct char symbol; /* symbol for game purposes */ char length; /* length of ship */ char x, y; /* coordinates of ship start point */ - int dir; /* direction of `bow' */ + char dir; /* direction of `bow' */ bool placed; /* has it been placed on the board? */ } ship_t; @@ -146,74 +160,78 @@ static int plywon=0, cpuwon=0; /* How many games has each won? */ static int salvo, blitz, closepack; -#define PR addstr +#define PR (void)addstr -static int rnd(int); -static int checkplace(int, ship_t *, int); -static int getcoord(int); - -static void uninitgame() +static void uninitgame(sig) /* end the game, either normally or due to signal */ +int sig; { clear(); - refresh(); - resetterm(); - echo(); - endwin(); + (void)refresh(); + (void)resetterm(); + (void)echo(); + (void)endwin(); exit(0); } static void announceopts() /* announce which game options are enabled */ { - if (salvo || blitz || closepack) { - printw("Playing optional game ("); - if (salvo) - printw("salvo, "); - else - printw("nosalvo, "); - if (blitz) - printw("blitz "); - else - printw("noblitz, "); - if (closepack) - printw("closepack)"); - else - printw("noclosepack)"); + if (salvo || blitz || closepack) + { + (void) printw("Playing optional game ("); + if (salvo) + (void) printw("salvo, "); + else + (void) printw("nosalvo, "); + if (blitz) + (void) printw("blitz "); + else + (void) printw("noblitz, "); + if (closepack) + (void) printw("closepack)"); + else + (void) printw("noclosepack)"); } - else - printw( "Playing standard game (noblitz, nosalvo, noclosepack)"); - + else + (void) printw( + "Playing standard game (noblitz, nosalvo, noclosepack)"); } static void intro() { -char *tmpname; + extern char *getlogin(); + char *tmpname; srand(time(0L)+getpid()); /* Kick the random number generator */ - signal(SIGINT,uninitgame); - signal(SIGINT,uninitgame); - signal(SIGIOT,uninitgame); /* for assert(3) */ + (void) signal(SIGINT,uninitgame); + (void) signal(SIGINT,uninitgame); + (void) signal(SIGIOT,uninitgame); /* for assert(3) */ if(signal(SIGQUIT,SIG_IGN) != SIG_IGN) - signal(SIGQUIT,uninitgame); + (void)signal(SIGQUIT,uninitgame); - if ((tmpname = getlogin()) != NULL) - strcpy(name,tmpname); + if(tmpname = getlogin()) + { + (void)strcpy(name,tmpname); + name[0] = toupper(name[0]); + } else - strcpy(name,dftname); - name[0] = toupper(name[0]); + (void)strcpy(name,dftname); - initscr(); - saveterm(); - nonl(); - cbreak(); - noecho(); + (void)initscr(); +#ifdef KEY_MIN + keypad(stdscr, TRUE); +#endif /* KEY_MIN */ + (void)saveterm(); + (void)nonl(); + (void)cbreak(); + (void)noecho(); #ifdef PENGUIN - clear(); - mvaddstr(4,29,"Welcome to Battleship!"); - move(8,0); + (void)clear(); + (void)mvaddstr(4,29,"Welcome to Battleship!"); + (void)move(8,0); PR(" \\\n"); PR(" \\ \\ \\\n"); PR(" \\ \\ \\ \\ \\_____________\n"); @@ -225,21 +243,23 @@ char *tmpname; PR(" \\ /\n"); PR(" \\___________________________________________________/\n"); - mvaddstr(22,27,"Hit any key to continue..."); refresh(); - getch(); + (void) mvaddstr(22,27,"Hit any key to continue..."); (void)refresh(); + (void) getch(); #endif /* PENGUIN */ - clear(); - mvaddstr(0,35,"BATTLESHIPS"); - move(PROMPTLINE + 2, 0); - announceopts(); - - mvaddstr(MYBASE, MXBASE, "Aiming keys:"); - mvaddstr(SYBASE, SXBASE, "y k u 7 8 9"); - mvaddstr(SYBASE+1, SXBASE, " \\|/ \\|/ "); - mvaddstr(SYBASE+2, SXBASE, "h-+-l 4-+-6"); - mvaddstr(SYBASE+3, SXBASE, " /|\\ /|\\ "); - mvaddstr(SYBASE+4, SXBASE, "b j n 1 2 3"); +#ifdef A_COLOR + start_color(); + + init_pair(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK); + init_pair(COLOR_GREEN, COLOR_GREEN, COLOR_BLACK); + init_pair(COLOR_RED, COLOR_RED, COLOR_BLACK); + init_pair(COLOR_CYAN, COLOR_CYAN, COLOR_BLACK); + init_pair(COLOR_WHITE, COLOR_WHITE, COLOR_BLACK); + init_pair(COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLACK); + init_pair(COLOR_BLUE, COLOR_BLUE, COLOR_BLACK); + init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK); +#endif /* A_COLOR */ + } /* VARARGS1 */ @@ -248,21 +268,22 @@ static void prompt(n, f, s) int n; char *f, *s; { - move(PROMPTLINE + n, 0); - clrtoeol(); - printw(f, s); - refresh(); + (void) move(PROMPTLINE + n, 0); + (void) clrtoeol(); + (void) printw(f, s); + (void) refresh(); } static void error(s) char *s; { - move(PROMPTLINE + 2, 0); - clrtoeol(); - if (s) { - addstr(s); - beep(); - } + (void) move(PROMPTLINE + 2, 0); + (void) clrtoeol(); + if (s) + { + (void) addstr(s); + (void) beep(); + } } static void placeship(b, ss, vis) @@ -270,266 +291,329 @@ int b; ship_t *ss; int vis; { -int l; + int l; - for(l = 0; l < ss->length; ++l) { + for(l = 0; l < ss->length; ++l) + { int newx = ss->x + l * xincr[ss->dir]; int newy = ss->y + l * yincr[ss->dir]; - board[b][newx][newy] = ss->symbol; - if (vis) { - pgoto(newy, newx); - addch((chtype)ss->symbol); - } + board[b][newx][newy] = ss->symbol; + if (vis) + { + pgoto(newy, newx); + (void) addch((chtype)ss->symbol); + } } ss->hits = 0; } +static int rnd(n) +int n; +{ + return(((rand() & 0x7FFF) % n)); +} + static void randomplace(b, ss) /* generate a valid random ship placement into px,py */ int b; ship_t *ss; { -register int bwidth = BWIDTH - ss->length; -register int bdepth = BDEPTH - ss->length; + register int bwidth = BWIDTH - ss->length; + register int bdepth = BDEPTH - ss->length; do { - ss->y = rnd(bdepth); - ss->x = rnd(bwidth); - ss->dir = rnd(2) ? E : S; + ss->y = rnd(bdepth); + ss->x = rnd(bwidth); + ss->dir = rnd(2) ? E : S; } while (!checkplace(b, ss, FALSE)); } static void initgame() { -int i, j, unplaced; -ship_t *ss; + int i, j, unplaced; + ship_t *ss; -#ifdef A_COLOR - start_color(); - - init_pair(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK); - init_pair(COLOR_GREEN, COLOR_GREEN, COLOR_BLACK); - init_pair(COLOR_RED, COLOR_RED, COLOR_BLACK); - init_pair(COLOR_CYAN, COLOR_CYAN, COLOR_BLACK); - init_pair(COLOR_WHITE, COLOR_WHITE, COLOR_BLACK); - init_pair(COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLACK); - init_pair(COLOR_BLUE, COLOR_BLUE, COLOR_BLACK); - init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK); -#endif /* A_COLOR */ + (void) clear(); + (void) mvaddstr(0,35,"BATTLESHIPS"); + (void) move(PROMPTLINE + 2, 0); + announceopts(); bzero(board, sizeof(char) * BWIDTH * BDEPTH * 2); bzero(hits, sizeof(char) * BWIDTH * BDEPTH * 2); - for (i = 0; i < SHIPTYPES; i++) { - ss = cpuship + i; - ss->x = ss->y = ss->dir = ss->hits = ss->placed = 0; - ss = plyship + i; - ss->x = ss->y = ss->dir = ss->hits = ss->placed = 0; + for (i = 0; i < SHIPTYPES; i++) + { + ss = cpuship + i; + ss->x = ss->y = ss->dir = ss->hits = ss->placed = 0; + ss = plyship + i; + ss->x = ss->y = ss->dir = ss->hits = ss->placed = 0; } /* draw empty boards */ - mvaddstr(PYBASE - 2, PXBASE + 5, "Main Board"); - mvaddstr(PYBASE - 1, PXBASE - 3,numbers); - for(i=0; i < BDEPTH; ++i) { - mvaddch(PYBASE + i, PXBASE - 3, i + 'A'); + (void) mvaddstr(PYBASE - 2, PXBASE + 5, "Main Board"); + (void) mvaddstr(PYBASE - 1, PXBASE - 3,numbers); + for(i=0; i < BDEPTH; ++i) + { + (void) mvaddch(PYBASE + i, PXBASE - 3, i + 'A'); #ifdef A_COLOR - if (has_colors()) - attron(COLOR_PAIR(COLOR_BLUE)); + if (has_colors()) + attron(COLOR_PAIR(COLOR_BLUE)); #endif /* A_COLOR */ - addch(' '); - for (j = 0; j < BWIDTH; j++) - addstr(" . "); + (void) addch(' '); + for (j = 0; j < BWIDTH; j++) + (void) addstr(" . "); #ifdef A_COLOR - attrset(0); + attrset(0); #endif /* A_COLOR */ - addch(' '); - addch(i + 'A'); + (void) addch(' '); + (void) addch(i + 'A'); } - mvaddstr(PYBASE + BDEPTH, PXBASE - 3,numbers); - mvaddstr(CYBASE - 2, CXBASE + 7,"Hit/Miss Board"); - mvaddstr(CYBASE - 1, CXBASE - 3, numbers); - for(i=0; i < BDEPTH; ++i) { - mvaddch(CYBASE + i, CXBASE - 3, i + 'A'); + (void) mvaddstr(PYBASE + BDEPTH, PXBASE - 3,numbers); + (void) mvaddstr(CYBASE - 2, CXBASE + 7,"Hit/Miss Board"); + (void) mvaddstr(CYBASE - 1, CXBASE - 3, numbers); + for(i=0; i < BDEPTH; ++i) + { + (void) mvaddch(CYBASE + i, CXBASE - 3, i + 'A'); #ifdef A_COLOR - if (has_colors()) - attron(COLOR_PAIR(COLOR_BLUE)); + if (has_colors()) + attron(COLOR_PAIR(COLOR_BLUE)); #endif /* A_COLOR */ - addch(' '); - for (j = 0; j < BWIDTH; j++) - addstr(" . "); + (void) addch(' '); + for (j = 0; j < BWIDTH; j++) + (void) addstr(" . "); #ifdef A_COLOR - attrset(0); + attrset(0); #endif /* A_COLOR */ - addch(' '); - addch(i + 'A'); + (void) addch(' '); + (void) addch(i + 'A'); } - mvaddstr(CYBASE + BDEPTH,CXBASE - 3,numbers); - mvprintw(HYBASE, HXBASE, + (void) mvaddstr(CYBASE + BDEPTH,CXBASE - 3,numbers); + + (void) mvprintw(HYBASE, HXBASE, "To position your ships: move the cursor to a spot, then"); - mvprintw(HYBASE+1,HXBASE, + (void) mvprintw(HYBASE+1,HXBASE, "type the first letter of a ship type to select it, then"); - mvprintw(HYBASE+2,HXBASE, + (void) mvprintw(HYBASE+2,HXBASE, "type a direction ([hjkl] or [4862]), indicating how the"); - mvprintw(HYBASE+3,HXBASE, + (void) mvprintw(HYBASE+3,HXBASE, "ship should be pointed. You may also type a ship letter"); - mvprintw(HYBASE+4,HXBASE, + (void) mvprintw(HYBASE+4,HXBASE, "followed by `r' to position it randomly, or type `R' to"); - mvprintw(HYBASE+5,HXBASE, + (void) mvprintw(HYBASE+5,HXBASE, "place all remaining ships randomly."); + (void) mvaddstr(MYBASE, MXBASE, "Aiming keys:"); + (void) mvaddstr(SYBASE, SXBASE, "y k u 7 8 9"); + (void) mvaddstr(SYBASE+1, SXBASE, " \\|/ \\|/ "); + (void) mvaddstr(SYBASE+2, SXBASE, "h-+-l 4-+-6"); + (void) mvaddstr(SYBASE+3, SXBASE, " /|\\ /|\\ "); + (void) mvaddstr(SYBASE+4, SXBASE, "b j n 1 2 3"); + /* have the computer place ships */ - for(ss = cpuship; ss < cpuship + SHIPTYPES; ss++) { - randomplace(COMPUTER, ss); - placeship(COMPUTER, ss, FALSE); + for(ss = cpuship; ss < cpuship + SHIPTYPES; ss++) + { + randomplace(COMPUTER, ss); + placeship(COMPUTER, ss, FALSE); } ss = (ship_t *)NULL; do { + extern char *strchr(); + static char getcoord(); char c, docked[SHIPTYPES + 2], *cp = docked; - /* figure which ships still wait to be placed */ - *cp++ = 'R'; - for (i = 0; i < SHIPTYPES; i++) - if (!plyship[i].placed) - *cp++ = plyship[i].symbol; - *cp = '\0'; - - /* get a command letter */ - prompt(1, "Type one of [%s] to pick a ship.", docked+1); - do { - c = getcoord(PLAYER); - } while - (!strchr(docked, c)); - - if (c == 'R') - ungetch('R'); - else - { - /* map that into the corresponding symbol */ - for (ss = plyship; ss < plyship + SHIPTYPES; ss++) - if (ss->symbol == c) - break; + /* figure which ships still wait to be placed */ + *cp++ = 'R'; + for (i = 0; i < SHIPTYPES; i++) + if (!plyship[i].placed) + *cp++ = plyship[i].symbol; + *cp = '\0'; + + /* get a command letter */ + prompt(1, "Type one of [%s] to pick a ship.", docked+1); + do { + c = getcoord(PLAYER); + } while + (!strchr(docked, c)); + + if (c == 'R') + (void) ungetch('R'); + else + { + /* map that into the corresponding symbol */ + for (ss = plyship; ss < plyship + SHIPTYPES; ss++) + if (ss->symbol == c) + break; - prompt(1, "Type one of [hjklrR] to place your %s.", ss->name); - pgoto(cury, curx); - } + prompt(1, "Type one of [hjklrR] to place your %s.", ss->name); + pgoto(cury, curx); + } - do { - c = getch(); - } while - (!strchr("hjklrR", c) || c == FF); + do { + c = getch(); + } while + (!strchr("hjklrR", c) || c == FF); - if (c == FF) { - clearok(stdscr, TRUE); - refresh(); - } else if (c == 'r') { - prompt(1, "Random-placing your %s", ss->name); + if (c == FF) + { + (void)clearok(stdscr, TRUE); + (void)refresh(); + } + else if (c == 'r') + { + prompt(1, "Random-placing your %s", ss->name); + randomplace(PLAYER, ss); + placeship(PLAYER, ss, TRUE); + error((char *)NULL); + ss->placed = TRUE; + } + else if (c == 'R') + { + prompt(1, "Placing the rest of your fleet at random..."); + for (ss = plyship; ss < plyship + SHIPTYPES; ss++) + if (!ss->placed) + { randomplace(PLAYER, ss); placeship(PLAYER, ss, TRUE); - error((char *)NULL); ss->placed = TRUE; - } else if (c == 'R') { - prompt(1, "Placing the rest of your fleet at random..."); - for (ss = plyship; ss < plyship + SHIPTYPES; ss++) - if (!ss->placed) { - randomplace(PLAYER, ss); - placeship(PLAYER, ss, TRUE); - ss->placed = TRUE; - } - error((char *)NULL); - } else if (strchr("hjkl8462", c)) { - ss->x = curx; - ss->y = cury; - - switch(c) { - case 'k': case '8': ss->dir = N; break; - case 'j': case '2': ss->dir = S; break; - case 'h': case '4': ss->dir = W; break; - case 'l': case '6': ss->dir = E; break; - } - - if (checkplace(PLAYER, ss, TRUE)) { - placeship(PLAYER, ss, TRUE); - error((char *)NULL); - ss->placed = TRUE; - } } + error((char *)NULL); + } + else if (strchr("hjkl8462", c)) + { + ss->x = curx; + ss->y = cury; + + switch(c) + { + case 'k': case '8': ss->dir = N; break; + case 'j': case '2': ss->dir = S; break; + case 'h': case '4': ss->dir = W; break; + case 'l': case '6': ss->dir = E; break; + } + + if (checkplace(PLAYER, ss, TRUE)) + { + placeship(PLAYER, ss, TRUE); + error((char *)NULL); + ss->placed = TRUE; + } + } - for (unplaced = i = 0; i < SHIPTYPES; i++) - unplaced += !plyship[i].placed; + for (unplaced = i = 0; i < SHIPTYPES; i++) + unplaced += !plyship[i].placed; } while - (unplaced); + (unplaced); turn = rnd(2); - mvprintw(HYBASE, HXBASE, - "To fire, move the cursor to your chosen aiming point "); - mvprintw(HYBASE+1, HXBASE, - "and strike any key other than a motion key. "); - mvprintw(HYBASE+2, HXBASE, - " "); - mvprintw(HYBASE+3, HXBASE, - " "); - mvprintw(HYBASE+4, HXBASE, - " "); - mvprintw(HYBASE+5, HXBASE, - " "); - - prompt(0, "Press any key to start..."); - getch(); -} - -static int rnd(n) -int n; -{ - return(((rand() & 0x7FFF) % n)); + (void) mvprintw(HYBASE, HXBASE, + "To fire, move the cursor to your chosen aiming point "); + (void) mvprintw(HYBASE+1, HXBASE, + "and strike any key other than a motion key. "); + (void) mvprintw(HYBASE+2, HXBASE, + " "); + (void) mvprintw(HYBASE+3, HXBASE, + " "); + (void) mvprintw(HYBASE+4, HXBASE, + " "); + (void) mvprintw(HYBASE+5, HXBASE, + " "); + + (void) prompt(0, "Press any key to start..."); + (void) getch(); } static int getcoord(atcpu) int atcpu; { -int ny, nx, c; + int ny, nx, c; if (atcpu) - cgoto(cury,curx); + cgoto(cury,curx); else - pgoto(cury, curx); - refresh(); - for (;;) { - if (atcpu) { - mvprintw(CYBASE + BDEPTH+1, CXBASE+11, "(%d, %c)", curx, 'A'+cury); - cgoto(cury, curx); - } else { - mvprintw(PYBASE + BDEPTH+1, PXBASE+11, "(%d, %c)", curx, 'A'+cury); - pgoto(cury, curx); - } + pgoto(cury, curx); + (void)refresh(); + for (;;) + { + if (atcpu) + { + (void) mvprintw(CYBASE + BDEPTH+1, CXBASE+11, "(%d, %c)", curx, 'A'+cury); + cgoto(cury, curx); + } + else + { + (void) mvprintw(PYBASE + BDEPTH+1, PXBASE+11, "(%d, %c)", curx, 'A'+cury); + pgoto(cury, curx); + } - switch(c = getch()) { - case 'k': case '8': ny = cury+BDEPTH-1; nx = curx; break; - case 'j': case '2': ny = cury+1; nx = curx; break; - case 'h': case '4': ny = cury; nx = curx+BWIDTH-1; break; - case 'l': case '6': ny = cury; nx = curx+1; break; - case 'y': case '7': ny = cury+BDEPTH-1; nx = curx+BWIDTH-1; break; - case 'b': case '1': ny = cury+1; nx = curx+BWIDTH-1; break; - case 'u': case '9': ny = cury+BDEPTH-1; nx = curx+1; break; - case 'n': case '3': ny = cury+1; nx = curx+1; break; - case FF: - nx = curx; ny = cury; - clearok(stdscr, TRUE); - refresh(); - break; - default: - if (atcpu) - mvaddstr(CYBASE + BDEPTH + 1, CXBASE + 11, " "); - else - mvaddstr(PYBASE + BDEPTH + 1, PXBASE + 11, " "); - return(c); - } + switch(c = getch()) + { + case 'k': case '8': +#ifdef KEY_MIN + case KEY_UP: +#endif /* KEY_MIN */ + ny = cury+BDEPTH-1; nx = curx; + break; + case 'j': case '2': +#ifdef KEY_MIN + case KEY_DOWN: +#endif /* KEY_MIN */ + ny = cury+1; nx = curx; + break; + case 'h': case '4': +#ifdef KEY_MIN + case KEY_LEFT: +#endif /* KEY_MIN */ + ny = cury; nx = curx+BWIDTH-1; + break; + case 'l': case '6': +#ifdef KEY_MIN + case KEY_RIGHT: +#endif /* KEY_MIN */ + ny = cury; nx = curx+1; + break; + case 'y': case '7': +#ifdef KEY_MIN + case KEY_A1: +#endif /* KEY_MIN */ + ny = cury+BDEPTH-1; nx = curx+BWIDTH-1; + break; + case 'b': case '1': +#ifdef KEY_MIN + case KEY_C1: +#endif /* KEY_MIN */ + ny = cury+1; nx = curx+BWIDTH-1; + break; + case 'u': case '9': +#ifdef KEY_MIN + case KEY_A3: +#endif /* KEY_MIN */ + ny = cury+BDEPTH-1; nx = curx+1; + break; + case 'n': case '3': +#ifdef KEY_MIN + case KEY_C3: +#endif /* KEY_MIN */ + ny = cury+1; nx = curx+1; + break; + case FF: + nx = curx; ny = cury; + (void)clearok(stdscr, TRUE); + (void)refresh(); + break; + default: + if (atcpu) + (void) mvaddstr(CYBASE + BDEPTH + 1, CXBASE + 11, " "); + else + (void) mvaddstr(PYBASE + BDEPTH + 1, PXBASE + 11, " "); + return(c); + } - curx = nx % BWIDTH; - cury = ny % BDEPTH; + curx = nx % BWIDTH; + cury = ny % BDEPTH; } } @@ -538,29 +622,31 @@ static int collidecheck(b, y, x) int b; int y, x; { -int collide; + int collide; /* anything on the square */ - if ((collide = IS_SHIP(board[b][x][y])) != 0) - return(collide); + if (collide = IS_SHIP(board[b][x][y])) + return(collide); /* anything on the neighbors */ - if (!closepack) { + if (!closepack) + { int i; - for (i = 0; i < 8; i++) { - int xend, yend; + for (i = 0; i < 8; i++) + { + int xend, yend; - yend = y + yincr[i]; - xend = x + xincr[i]; - if (ONBOARD(xend, yend)) - collide += IS_SHIP(board[b][xend][yend]); - } + yend = y + yincr[i]; + xend = x + xincr[i]; + if (ONBOARD(xend, yend)) + collide += IS_SHIP(board[b][xend][yend]); + } } return(collide); } -static int checkplace(b, ss, vis) +static bool checkplace(b, ss, vis) int b; ship_t *ss; int vis; @@ -570,54 +656,60 @@ int vis; /* first, check for board edges */ xend = ss->x + ss->length * xincr[ss->dir]; yend = ss->y + ss->length * yincr[ss->dir]; - if (!ONBOARD(xend, yend)) { - if(vis) - switch(rnd(3)) { + if (!ONBOARD(xend, yend)) + { + if (vis) + switch(rnd(3)) + { case 0: - error("Ship is hanging from the edge of the world"); - break; + error("Ship is hanging from the edge of the world"); + break; case 1: - error("Try fitting it on the board"); - break; + error("Try fitting it on the board"); + break; case 2: - error("Figure I won't find it if you put it there?"); - break; + error("Figure I won't find it if you put it there?"); + break; } - return(0); + return(0); } - for(l = 0; l < ss->length; ++l) { - if (collidecheck(b, ss->y+l*yincr[ss->dir], ss->x+l*xincr[ss->dir])) { - if (vis) - switch(rnd(3)) { + for(l = 0; l < ss->length; ++l) + { + if(collidecheck(b, ss->y+l*yincr[ss->dir], ss->x+l*xincr[ss->dir])) + { + if (vis) + switch(rnd(3)) + { case 0: - error("There's already a ship there"); - break; + error("There's already a ship there"); + break; case 1: - error("Collision alert! Aaaaaagh!"); - break; + error("Collision alert! Aaaaaagh!"); + break; case 2: - error("Er, Admiral, what about the other ship?"); - break; + error("Er, Admiral, what about the other ship?"); + break; } - return(0); + return(FALSE); } } - return(1); + return(TRUE); } static int awinna() { -int i, j; -ship_t *ss; - - for (i = 0; i < 2; ++i) { - ss = (i) ? cpuship : plyship; - for (j = 0; j < SHIPTYPES; ++j, ++ss) - if (ss->length > ss->hits) - break; - if (j == SHIPTYPES) - return(OTHER); + int i, j; + ship_t *ss; + + for(i=0; i<2; ++i) + { + ss = (i) ? cpuship : plyship; + for(j=0; j < SHIPTYPES; ++j, ++ss) + if(ss->length > ss->hits) + break; + if (j == SHIPTYPES) + return(OTHER); } return(-1); } @@ -665,7 +757,7 @@ int x, y; if (has_colors()) attron(COLOR_PAIR(COLOR_GREEN)); #endif /* A_COLOR */ - addch(MARK_MISS); + (void)addch(MARK_MISS); #ifdef A_COLOR attrset(0); #endif /* A_COLOR */ @@ -683,93 +775,100 @@ int x, y; if (turn % 2 == PLAYER) { cgoto(y, x); - addch(ss->symbol); + (void) addch(ss->symbol); } } - move(oldy, oldx); + (void) move(oldy, oldx); return(ss); } } - move(oldy, oldx); + (void) move(oldy, oldx); return((ship_t *)NULL); } static int plyturn() { -ship_t *ss; -bool hit; -char *m; + ship_t *ss; + bool hit; + char *m; prompt(1, "Where do you want to shoot? "); - for (;;) { - getcoord(COMPUTER); - if (hits[PLAYER][curx][cury]) { - prompt(1, "You shelled this spot already! Try again."); - beep(); - } else - break; - } - hit = IS_SHIP(board[COMPUTER][curx][cury]); - hits[PLAYER][curx][cury] = hit ? MARK_HIT : MARK_MISS; - cgoto(cury, curx); + for (;;) + { + (void) getcoord(COMPUTER); + if (hits[PLAYER][curx][cury]) + { + prompt(1, "You shelled this spot already! Try again."); + beep(); + } + else + break; + } + hit = IS_SHIP(board[COMPUTER][curx][cury]); + hits[PLAYER][curx][cury] = hit ? MARK_HIT : MARK_MISS; + cgoto(cury, curx); #ifdef A_COLOR - if (has_colors()) - if (hit) - attron(COLOR_PAIR(COLOR_RED)); - else - attron(COLOR_PAIR(COLOR_GREEN)); + if (has_colors()) + if (hit) + attron(COLOR_PAIR(COLOR_RED)); + else + attron(COLOR_PAIR(COLOR_GREEN)); #endif /* A_COLOR */ - addch((chtype)hits[PLAYER][curx][cury]); + (void) addch((chtype)hits[PLAYER][curx][cury]); #ifdef A_COLOR attrset(0); #endif /* A_COLOR */ prompt(1, "You %s.", hit ? "scored a hit" : "missed"); - if(hit && (ss = hitship(curx, cury))) { - switch(rnd(5)) { - case 0: - m = " You sank my %s!"; - break; - case 1: - m = " I have this sinking feeling about my %s...."; - break; - case 2: - m = " My %s has gone to Davy Jones's locker!"; - break; - case 3: - m = " Glub, glub -- my %s is headed for the bottom!"; - break; - case 4: - m = " You'll pick up survivors from my my %s, I hope...!"; - break; - } - printw(m, ss->name); - beep(); - return(awinna() == -1); - } - return(hit); + if(hit && (ss = hitship(curx, cury))) + { + switch(rnd(5)) + { + case 0: + m = " You sank my %s!"; + break; + case 1: + m = " I have this sinking feeling about my %s...."; + break; + case 2: + m = " My %s has gone to Davy Jones's locker!"; + break; + case 3: + m = " Glub, glub -- my %s is headed for the bottom!"; + break; + case 4: + m = " You'll pick up survivors from my my %s, I hope...!"; + break; + } + (void)printw(m, ss->name); + (void)beep(); + return(awinna() == -1); + } + return(hit); } static int sgetc(s) char *s; { -char *s1; -int ch; - - refresh(); - for(;;) { - ch = getch(); - if (islower(ch)) - ch = toupper(ch); - if (ch == CTRLC) - uninitgame(); - for (s1=s; *s1 && ch != *s1; ++s1) - continue; - if (*s1) { - addch((chtype)ch); - refresh(); - return(ch); + char *s1; + int ch; + + (void)refresh(); + for(;;) + { + ch = getch(); + if (islower(ch)) + ch = toupper(ch); + if (ch == CTRLC) + uninitgame(); + for (s1=s; *s1 && ch != *s1; ++s1) + continue; + if (*s1) + { + (void) addch((chtype)ch); + (void)refresh(); + return(ch); } } } @@ -779,12 +878,12 @@ static void randomfire(px, py) /* random-fire routine -- implements simple diagonal-striping strategy */ int *px, *py; { -static int turncount = 0; -static int srchstep = BEGINSTEP; -static int huntoffs; /* Offset on search strategy */ -int ypossible[BWIDTH * BDEPTH], xpossible[BWIDTH * BDEPTH], nposs; -int ypreferred[BWIDTH * BDEPTH], xpreferred[BWIDTH * BDEPTH], npref; -int x, y, i; + static int turncount = 0; + static int srchstep = BEGINSTEP; + static int huntoffs; /* Offset on search strategy */ + int ypossible[BWIDTH * BDEPTH], xpossible[BWIDTH * BDEPTH], nposs; + int ypreferred[BWIDTH * BDEPTH], xpreferred[BWIDTH * BDEPTH], npref; + int x, y, i; if (turncount++ == 0) huntoffs = rnd(srchstep); @@ -792,35 +891,42 @@ int x, y, i; /* first, list all possible moves */ nposs = npref = 0; for (x = 0; x < BWIDTH; x++) - for (y = 0; y < BDEPTH; y++) - if (!hits[COMPUTER][x][y]) { - xpossible[nposs] = x; - ypossible[nposs] = y; - nposs++; - if (((x+huntoffs) % srchstep) != (y % srchstep)) { - xpreferred[npref] = x; - ypreferred[npref] = y; - npref++; - } - } + for (y = 0; y < BDEPTH; y++) + if (!hits[COMPUTER][x][y]) + { + xpossible[nposs] = x; + ypossible[nposs] = y; + nposs++; + if (((x+huntoffs) % srchstep) != (y % srchstep)) + { + xpreferred[npref] = x; + ypreferred[npref] = y; + npref++; + } + } - if (npref) { - i = rnd(npref); + if (npref) + { + i = rnd(npref); - *px = xpreferred[i]; - *py = ypreferred[i]; - } else if (nposs) { - i = rnd(nposs); + *px = xpreferred[i]; + *py = ypreferred[i]; + } + else if (nposs) + { + i = rnd(nposs); - *px = xpossible[i]; - *py = ypossible[i]; + *px = xpossible[i]; + *py = ypossible[i]; - if (srchstep > 1) - --srchstep; - } else { - error("No moves possible?? Help!"); - exit(1); - /*NOTREACHED*/ + if (srchstep > 1) + --srchstep; + } + else + { + error("No moves possible?? Help!"); + exit(1); + /*NOTREACHED*/ } } @@ -832,30 +938,30 @@ static bool cpufire(x, y) /* fire away at given location */ int x, y; { -bool hit, sunk; -ship_t *ss; + bool hit, sunk; + ship_t *ss; hits[COMPUTER][x][y] = (hit = (board[PLAYER][x][y])) ? MARK_HIT : MARK_MISS; - mvprintw(PROMPTLINE, 0, + (void) mvprintw(PROMPTLINE, 0, "I shoot at %c%d. I %s!", y + 'A', x, hit ? "hit" : "miss"); - if ((sunk = (hit && (ss = hitship(x, y)))) != 0) - printw(" I've sunk your %s", ss->name); - clrtoeol(); + if (sunk = (hit && (ss = hitship(x, y)))) + (void) printw(" I've sunk your %s", ss->name); + (void)clrtoeol(); pgoto(y, x); #ifdef A_COLOR if (has_colors()) - if (hit) - attron(COLOR_PAIR(COLOR_RED)); - else - attron(COLOR_PAIR(COLOR_GREEN)); + if (hit) + attron(COLOR_PAIR(COLOR_RED)); + else + attron(COLOR_PAIR(COLOR_GREEN)); #endif /* A_COLOR */ - addch((chtype)(hit ? SHOWHIT : SHOWSPLASH)); + (void)addch((chtype)(hit ? SHOWHIT : SHOWSPLASH)); #ifdef A_COLOR - attrset(0); + attrset(0); #endif /* A_COLOR */ - return(hit ? (sunk ? S_SUNK : S_HIT) : S_MISS); + return(hit ? (sunk ? S_SUNK : S_HIT) : S_MISS); } /* @@ -877,34 +983,38 @@ static bool cputurn() static ship_t ts; int navail, x, y, d, n, hit = S_MISS; - switch(next) { + switch(next) + { case RANDOM_FIRE: /* last shot was random and missed */ refire: - randomfire(&x, &y); - if (!(hit = cpufire(x, y))) - next = RANDOM_FIRE; - else { - ts.x = x; ts.y = y; - ts.hits = 1; - next = (hit == S_SUNK) ? RANDOM_FIRE : RANDOM_HIT; - } - break; + randomfire(&x, &y); + if (!(hit = cpufire(x, y))) + next = RANDOM_FIRE; + else + { + ts.x = x; ts.y = y; + ts.hits = 1; + next = (hit == S_SUNK) ? RANDOM_FIRE : RANDOM_HIT; + } + break; case RANDOM_HIT: /* last shot was random and hit */ - used[E/2] = used[S/2] = used[W/2] = used[N/2] = FALSE; - /* FALLTHROUGH */ + used[E/2] = used[S/2] = used[W/2] = used[N/2] = FALSE; + /* FALLTHROUGH */ case HUNT_DIRECT: /* last shot hit, we're looking for ship's long axis */ - for (d = navail = 0; d < 4; d++) { - x = ts.x + xincr[d*2]; y = ts.y + yincr[d*2]; - if (!used[d] && POSSIBLE(x, y)) - navail++; - else - used[d] = TRUE; + for (d = navail = 0; d < 4; d++) + { + x = ts.x + xincr[d*2]; y = ts.y + yincr[d*2]; + if (!used[d] && POSSIBLE(x, y)) + navail++; + else + used[d] = TRUE; } if (navail == 0) /* no valid places for shots adjacent... */ goto refire; /* ...so we must random-fire */ - else { + else + { for (d = 0, n = rnd(navail) + 1; n; n--) while (used[d]) d++; @@ -930,7 +1040,8 @@ static bool cputurn() case FIRST_PASS: /* we have a start and a direction now */ x = ts.x + xincr[ts.dir]; y = ts.y + yincr[ts.dir]; - if (POSSIBLE(x, y) && (hit = cpufire(x, y))) { + if (POSSIBLE(x, y) && (hit = cpufire(x, y))) + { ts.x = x; ts.y = y; ts.hits++; next = (hit == S_SUNK) ? RANDOM_FIRE : FIRST_PASS; } @@ -942,7 +1053,8 @@ static bool cputurn() d = ts.dir + 4; x = ts.x + ts.hits * xincr[d]; y = ts.y + ts.hits * yincr[d]; - if (POSSIBLE(x, y) && (hit = cpufire(x, y))) { + if (POSSIBLE(x, y) && (hit = cpufire(x, y))) + { ts.x = x; ts.y = y; ts.dir = d; ts.hits++; next = (hit == S_SUNK) ? RANDOM_FIRE : SECOND_PASS; } @@ -953,52 +1065,57 @@ static bool cputurn() case SECOND_PASS: /* kill squares not caught on first pass */ x = ts.x + xincr[ts.dir]; y = ts.y + yincr[ts.dir]; - if (POSSIBLE(x, y) && (hit = cpufire(x, y))) { + if (POSSIBLE(x, y) && (hit = cpufire(x, y))) + { ts.x = x; ts.y = y; ts.hits++; next = (hit == S_SUNK) ? RANDOM_FIRE: SECOND_PASS; break; - } else + } + else next = RANDOM_FIRE; break; } /* check for continuation and/or winner */ - if (salvo) { - refresh(); - sleep(1); + if (salvo) + { + (void)refresh(); + (void)sleep(1); } if (awinna() != -1) - return(FALSE); + return(FALSE); #ifdef DEBUG - mvprintw(PROMPTLINE + 2, 0, "New state %d, x=%d, y=%d, d=%d", + (void) mvprintw(PROMPTLINE + 2, 0, + "New state %d, x=%d, y=%d, d=%d", next, x, y, d); #endif /* DEBUG */ return(hit); } -int playagain() { -int j; -ship_t *ss; + int j; + ship_t *ss; - for (ss = cpuship; ss < cpuship + SHIPTYPES; ss++) - for(j = 0; j < ss->length; j++) { - cgoto(ss->y + j * yincr[ss->dir], ss->x + j * xincr[ss->dir]); - addch((chtype)ss->symbol); - } + for (ss = cpuship; ss < cpuship + SHIPTYPES; ss++) + for(j = 0; j < ss->length; j++) + { + cgoto(ss->y + j * yincr[ss->dir], ss->x + j * xincr[ss->dir]); + (void)addch((chtype)ss->symbol); + } - if (awinna()) - ++cpuwon; + if(awinna()) + ++cpuwon; else - ++plywon; + ++plywon; j = 18 + strlen(name); if(plywon >= 10) - ++j; + ++j; if(cpuwon >= 10) - ++j; - mvprintw(1,(COLWIDTH-j)/2, "%s: %d Computer: %d",name,plywon,cpuwon); + ++j; + (void) mvprintw(1,(COLWIDTH-j)/2, + "%s: %d Computer: %d",name,plywon,cpuwon); prompt(2, (awinna()) ? "Want to be humiliated again, %s [yn]? " : "Going to give me a chance for revenge, %s [yn]? ",name); @@ -1009,73 +1126,78 @@ static void do_options(c,op) int c; char *op[]; { -register int i; - - if (c > 1) { - for (i=1; i<c; i++) { - switch(op[i][0]) { - default: - case '?': - fprintf(stderr, "Usage: battle [-s | -b] [-c]\n"); - fprintf(stderr, "\tWhere the options are:\n"); - fprintf(stderr, "\t-s : play a salvo game\n"); - fprintf(stderr, "\t-b : play a blitz game\n"); - fprintf(stderr, "\t-c : ships may be adjacent\n"); - exit(1); - break; - case '-': - switch(op[i][1]) { - case 'b': - blitz = 1; - if (salvo == 1) { - fprintf(stderr, - "Bad Arg: -b and -s are mutually exclusive\n"); - exit(1); - } - break; - case 's': - salvo = 1; - if (blitz == 1) - { - fprintf(stderr, - "Bad Arg: -s and -b are mutually exclusive\n"); - exit(1); - } - break; - case 'c': - closepack = 1; - break; - default: - fprintf(stderr, - "Bad arg: type \"%s ?\" for usage message\n", op[0]); - exit(1); - } - } + register int i; + + if (c > 1) + { + for (i=1; i<c; i++) + { + switch(op[i][0]) + { + default: + case '?': + (void) fprintf(stderr, "Usage: battle [-s | -b] [-c]\n"); + (void) fprintf(stderr, "\tWhere the options are:\n"); + (void) fprintf(stderr, "\t-s : play a salvo game\n"); + (void) fprintf(stderr, "\t-b : play a blitz game\n"); + (void) fprintf(stderr, "\t-c : ships may be adjacent\n"); + exit(1); + break; + case '-': + switch(op[i][1]) + { + case 'b': + blitz = 1; + if (salvo == 1) + { + (void) fprintf(stderr, + "Bad Arg: -b and -s are mutually exclusive\n"); + exit(1); + } + break; + case 's': + salvo = 1; + if (blitz == 1) + { + (void) fprintf(stderr, + "Bad Arg: -s and -b are mutually exclusive\n"); + exit(1); + } + break; + case 'c': + closepack = 1; + break; + default: + (void) fprintf(stderr, + "Bad arg: type \"%s ?\" for usage message\n", op[0]); + exit(1); } + } + } } } static int scount(who) int who; { -register int i, shots; -register ship_t *sp; + register int i, shots; + register ship_t *sp; if (who) - sp = cpuship; /* count cpu shots */ + sp = cpuship; /* count cpu shots */ else - sp = plyship; /* count player shots */ + sp = plyship; /* count player shots */ - for (i=0, shots = 0; i < SHIPTYPES; i++, sp++) { - if (sp->hits >= sp->length) - continue; /* dead ship */ - else - shots++; + for (i=0, shots = 0; i < SHIPTYPES; i++, sp++) + { + if (sp->hits >= sp->length) + continue; /* dead ship */ + else + shots++; } return(shots); } -int main(argc, argv) int argc; char *argv[]; @@ -1084,34 +1206,45 @@ char *argv[]; intro(); do { - initgame(); - while(awinna() == -1) { - if (!blitz) { - if (!salvo) { - if(turn) - cputurn(); - else - plyturn(); - } else { - register int i; - - i = scount(turn); - while (i--) { - if (turn) { - if (cputurn() && awinna() != -1) - i = 0; - } else { - if (plyturn() && awinna() != -1) - i = 0; - } - } - } - } else - while(turn ? cputurn() : plyturn()) - continue; - turn = OTHER; + initgame(); + while(awinna() == -1) + { + if (!blitz) + { + if (!salvo) + { + if(turn) + (void) cputurn(); + else + (void) plyturn(); } - } while (playagain()); + else + { + register int i; + + i = scount(turn); + while (i--) + { + if (turn) + { + if (cputurn() && awinna() != -1) + i = 0; + } + else + { + if (plyturn() && awinna() != -1) + i = 0; + } + } + } + } + else + while(turn ? cputurn() : plyturn()) + continue; + turn = OTHER; + } + } while + (playagain()); uninitgame(); /*NOTREACHED*/ } |