# C++ Notes: Example - Battleship ver 1b

This is an early iteration for a program to play Battleship. It doesn't do much yet, and it's only one-dimensional. Proposed enhancements for the next iteration are in the program comments. You can either use this program as a start, or just to get some ideas.

Note: This is essentially the same as version 1 - some names were changed and the SHIP_SUNK enum value was removed because it was causing too many worries. Also, a hasty late change resulted in an undeclared variable in version 1a. This has been corrected here.

      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
     71
     72
     73
     74
     75
     76
     77
     78
     79
     80
     81
     82
     83
     84
     85
     86
     87
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    //  battleship1/main.cpp -- Version 1 of Battleship game.
    //  Fred Swartz, 2003-11-25

    // This first iteration runs, but needs lots of work.
    // Here is a list of some important changes.
    // Choose one simple improvement and get that working
    // before starting on the next iteration.  Most of these
    // are small improvements, but its important to get this
    // one-dimensional version running first, then extend it
    // to two-dimensions, multiple ships, different size ships,
    // . . .
    //
    // FUNCTIONALITY
    //  * The dropBomb() function doesn't do anything.
    //  * The initialize() function doesn't randomly place ships.
    //  * No end of game check (function to look for umbombed ship).
    //
    // USER INTERFACE
    //  * Verify user input has legal bombing coordinates.
    //  * Print coordinates at bottom.
    //  * Allow number without command to mean drop bomb.
    //  * Not robust - crashes if bombing coordinate missing.
    //
    // INTERNAL
    //  * Refactor - move command decoding out of main.
    //  * Should be a developer command to display where ships are.
    //
    // LONGER RANGE (after previous improvements)
    //  * Make it two-dimensional.
    //  * Add multiple ships, and maybe multiple ship sizes.

    //==================================================== includes
    #include <iostream>
    #include <string>
    using namespace std;

    //========================================= global declarations
    // Damage enum defines possible values at each grid point.
    enum Damage {WATER_UNBOMBED, WATER_BOMBED,
                 SHIP_UNBOMBED , SHIP_BOMBED};

    // The display array defines what to display for
    //     each of the Damage enum values.  Changes to the
    //     Damage enum require this to be changed also.
    const char userDisplay[] = {'-', 'O', '-', 'X'};

    const  int WIDTH = 10;   // Width of the grid.
    Damage grid[WIDTH];      // Status of every grid cell.

    //================================================== prototypes
    void dropBomb(int xcoord);
    void initGrid();
    void displayGrid();

    //======================================================== main
    int main() {

        //-- Place ships on the grid.
        initGrid();
        displayGrid();

        char commandCode;
        while (cin >> commandCode) {
            switch (commandCode) {

                case 'q':           // quit
                    exit(0);
                    break;

                case 'b':           // bomb
                    int column;
                    cin >> column;
                    dropBomb(column);
                    displayGrid();
                    break;

                default:
                    cerr << "Bad input " << commandCode << endl;
                    break;
            }
        }

        return 0;
    }//end main

    //======================================================= dropBomb
    void dropBomb(int xcoord) {
        //-- Do nothing for now except print to show
        //   we got here.
        cout << "TRACE: bomb(" << xcoord << ")" << endl;

        return;
    }

    //======================================================= initGrid
    // initGrid() places random ships on the grid.
    void initGrid() {
        for (int col=0; col<WIDTH; col++) {
            grid[col] = WATER_UNBOMBED;
        }
        // Temporarily start with one ship, random later.
        grid[0] = SHIP_UNBOMBED;
        grid[1] = SHIP_UNBOMBED;
    }

    //==================================================== displayGrid
    void displayGrid() {
        cout << endl;
        for (int col=0; col<WIDTH; col++) {
            cout << " " << userDisplay[grid[col]];
        }
        cout << endl;
    }