]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - test/bs.c
ncurses 6.1 - patch 20181027
[ncurses.git] / test / bs.c
index 7f2984742c7136073ebf4a23ab017be2290955c1..b8893e6243beba33acf724d4ba33f78b3d3ec91d 100644 (file)
--- a/test/bs.c
+++ b/test/bs.c
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2016,2017 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2017,2018 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
@@ -34,7 +34,7 @@
  * v2.0 featuring strict ANSI/POSIX conformance, November 1993.
  * v2.1 with ncurses mouse support, September 1995
  *
- * $Id: bs.c,v 1.67 2017/05/14 00:27:05 tom Exp $
+ * $Id: bs.c,v 1.73 2018/05/12 15:07:51 tom Exp $
  */
 
 #include <test.priv.h>
@@ -64,6 +64,8 @@ static int getcoord(int);
 #define CTRLC          '\003'  /* used as terminate command */
 #define FF             '\014'  /* used as redraw command */
 
+#define is_QUIT(c) ((c) == CTRLC || (c) == QUIT)
+
 /* coordinate handling */
 #define BWIDTH         10
 #define BDEPTH         10
@@ -114,17 +116,20 @@ static char *your_name;
 static char dftname[] = "stranger";
 
 /* direction constants */
-#define E      0
-#define SE     1
-#define S      2
-#define SW     3
-#define W      4
-#define NW     5
-#define N      6
-#define NE     7
-static int xincr[8] =
+typedef enum {
+    dir_E = 0
+    ,dir_SE
+    ,dir_S
+    ,dir_SW
+    ,dir_W
+    ,dir_NW
+    ,dir_N
+    ,dir_NE
+    ,dir_MAX
+} DIRECTIONS;
+static int xincr[dir_MAX + 2] =
 {1, 1, 0, -1, -1, -1, 0, 1};
-static int yincr[8] =
+static int yincr[dir_MAX + 2] =
 {0, 1, 1, 1, 0, -1, -1, -1};
 
 /* current ship position and direction */
@@ -145,6 +150,7 @@ static bool checkplace(int b, ship_t * ss, int vis);
 
 #define SHIPIT(name, symbol, length) { name, 0, symbol, length, 0,0, 0, FALSE }
 
+/* "ply=player", "cpu=computer" */
 static ship_t plyship[SHIPTYPES] =
 {
     SHIPIT(carrier, 'A', 5),
@@ -219,7 +225,7 @@ intro(void)
 
     srand((unsigned) (time(0L) + getpid()));   /* Kick the random number generator */
 
-    CATCHALL(uninitgame);
+    InitAndCatch(initscr(), uninitgame);
 
     if ((tmpname = getlogin()) != 0 &&
        (your_name = strdup(tmpname)) != 0) {
@@ -228,7 +234,6 @@ intro(void)
        your_name = strdup(dftname);
     }
 
-    (void) initscr();
     keypad(stdscr, TRUE);
     (void) def_prog_mode();
     (void) nonl();
@@ -325,9 +330,9 @@ randomplace(int b, ship_t * ss)
 {
 
     do {
-       ss->dir = rnd(2) ? E : S;
-       ss->x = rnd(BWIDTH - (ss->dir == E ? ss->length : 0));
-       ss->y = rnd(BDEPTH - (ss->dir == S ? ss->length : 0));
+       ss->dir = rnd(2) ? dir_E : dir_S;
+       ss->x = rnd(BWIDTH - (ss->dir == dir_E ? ss->length : 0));
+       ss->y = rnd(BDEPTH - (ss->dir == dir_S ? ss->length : 0));
     } while
        (!checkplace(b, ss, FALSE));
 }
@@ -462,9 +467,11 @@ initgame(void)
        do {
            c = (char) getch();
        } while
-           (!(strchr("hjkl8462rR", c) || c == FF));
+           (!(strchr("hjkl8462rR", c) || c == FF || is_QUIT(c)));
 
-       if (c == FF) {
+       if (is_QUIT(c)) {
+           uninitgame(0);
+       } else if (c == FF) {
            (void) clearok(stdscr, TRUE);
            (void) refresh();
        } else if (ss == 0) {
@@ -491,19 +498,19 @@ initgame(void)
            switch (c) {
            case 'k':
            case '8':
-               ss->dir = N;
+               ss->dir = dir_N;
                break;
            case 'j':
            case '2':
-               ss->dir = S;
+               ss->dir = dir_S;
                break;
            case 'h':
            case '4':
-               ss->dir = W;
+               ss->dir = dir_W;
                break;
            case 'l':
            case '6':
-               ss->dir = E;
+               ss->dir = dir_E;
                break;
            }
 
@@ -661,7 +668,7 @@ collidecheck(int b, int y, int x)
     if (!closepack) {
        int i;
 
-       for (i = 0; i < 8; i++) {
+       for (i = 0; i < dir_MAX; i++) {
            int xend, yend;
 
            yend = y + yincr[i];
@@ -758,8 +765,8 @@ hitship(int x, int y)
 
                if (!closepack)
                    for (j = -1; j <= 1; j++) {
-                       int bx = ss->x + j * xincr[(ss->dir + 2) % 8];
-                       int by = ss->y + j * yincr[(ss->dir + 2) % 8];
+                       int bx = ss->x + j * xincr[(ss->dir + 2) % dir_MAX];
+                       int by = ss->y + j * yincr[(ss->dir + 2) % dir_MAX];
 
                        for (i = -1; i <= ss->length; ++i) {
                            int x1, y1;
@@ -885,7 +892,7 @@ sgetc(const char *s)
        ch = getch();
        if (islower(ch))
            ch = toupper(ch);
-       if (ch == CTRLC)
+       if (is_QUIT(ch))
            uninitgame(0);
        for (s1 = s; *s1 && ch != *s1; ++s1)
            continue;
@@ -1023,11 +1030,14 @@ cputurn(void)
        break;
 
     case RANDOM_HIT:           /* last shot was random and hit */
-       used[E / 2] = used[S / 2] = used[W / 2] = used[N / 2] = FALSE;
+       used[dir_E / 2] =
+           used[dir_S / 2] =
+           used[dir_W / 2] =
+           used[dir_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++) {
+       for (d = navail = 0; d < (dir_MAX) / 2; d++) {
            x = ts.x + xincr[d * 2];
            y = ts.y + yincr[d * 2];
            if (!used[d] && POSSIBLE(x, y))
@@ -1039,13 +1049,13 @@ cputurn(void)
            goto refire;        /* ...so we must random-fire */
        else {
            n = rnd(navail) + 1;
-           for (d = 0; d < 4 && used[d]; d++) ;
+           for (d = 0; d < (dir_MAX) / 2 && used[d]; d++) ;
            /* used[d] is first that == 0 */
            for (; n > 1; n--)
-               while (d < 4 && used[++d]) ;
+               while (d < (dir_MAX) / 2 && used[++d]) ;
            /* used[d] is next that == 0 */
 
-           assert(d < 4);
+           assert(d < (dir_MAX) / 2);
            assert(used[d] == FALSE);
 
            used[d] = TRUE;
@@ -1079,7 +1089,7 @@ cputurn(void)
        break;
 
     case REVERSE_JUMP:         /* nail down the ship's other end */
-       d = (ts.dir + 4) % 8;
+       d = (ts.dir + (dir_MAX) / 2) % dir_MAX;
        x = ts.x + ts.hits * xincr[d];
        y = ts.y + ts.hits * yincr[d];
        if (POSSIBLE(x, y) && (hit = cpufire(x, y))) {
@@ -1158,7 +1168,7 @@ do_options(int c, char *op[])
            switch (op[i][0]) {
            default:
            case '?':
-               (void) fprintf(stderr, "Usage: battle [-s | -b] [-c]\n");
+               (void) fprintf(stderr, "Usage: bs [-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");