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;
}