C++ Battleships free space function -


i'm trying create game of battleships in computer randomly lays battleships on board.

battleships cannot placed 1 on top of other or right next each other. built function check , return true if free space available, reason program still puts lays ships against rules. doesn't happen every time, still happens.

here's function checks free space:

bool game2::checkplace(int row, int column, direction direct, battleship ship)//this function checks if ship can layed @ coordinates recieved. {     if (board[row][column] != '_' || board[row][column + 1] != '_' || board[row + 1][column + 1] != '_' || board[row + 1][column] != '_' || board[row - 1][column - 1] != '_' || board[row][column - 1] != '_' || board[row + 1][column - 1] != '_' || board[row + 1][column] != '_' || board[row + 1][column + 1] != '_')         return false;     if (direct == horizontal)//for horizontal direction     {         if (10 - column < ship.getlength())//if there no space left ship.             return false;         (int = 0; < ship.getlength(); ++i)//this loop creates kind of block moves find surrounding ships.         {             if (row == 0 && column == 0 && (board[row + 1][column + i] != '_' || board[row + 1][column + 1 + i] != '_' || board[row][column + 1 + i] != '_'))//top left corner                 return false;             if (row == 9 && column == 0 && (board[row - 1][column + i] != '_' || board[row - 1][column + 1 + i] != '_') || board[row][column + 1 + i] != '_')//bottom left corner                 return false;             if (row > 0 && row < 9 && column > 0 && column < 9 && board[row][column + 1 + i] != '_' || board[row + 1][column + 1 + i] != '_' || board[row + 1][column + i] != '_' || board[row + 1][column - 1 + i] != '_' || board[row][column - 1 + i] != '_' || board[row - 1][column - 1 + i] != '_' || board[row - 1][column + i] != '_' || board[row - 1][column + 1 + i] != '_')//middle of board                 return false;             if (row == 0 && column > 0 && column < 9 && (board[row][column - 1 + i] != '_' || board[row][column + i] != '_' || board[row][column + 1 + i] != '_' || board[row + 1][column - 1 + i] != '_' || board[row + 1][column + i] != '_' || board[row + 1][column + 1 + i] != '_'))                 return false;             if (row == 9 && column > 0 && column < 9 && (board[row - 1][column - 1 + i] != '_' || board[row - 1][column + i] != '_' || board[row - 1][column + 1 + i] != '_' || board[row][column - 1 + i] != '_' || board[row][column + i] != '_' || board[row][column + 1 + i] != '_'))                 return false;             if (column = 0 && row > 0 && row < 9 && (board[row + 1][column + i] != '_' || board[row + 1][column + 1 + i] != '_' || board[row][column + 1 + i] != '_' || board[row - 1][column + i] != '_' || board[row - 1][column + 1 + i] != '_'))                 return false;         }         return true;     }     if (direct == vertical)     {         if (10 - row < ship.getlength())//if there no space left ship.             return false;         (int = 0; < ship.getlength(); ++i)//this loop creates kind of block moves find surrounding ships.         {             if (row == 0 && column == 0 && (board[row + i][column + 1] != '_' || board[row + 1 + i][column + 1] != '_' || board[row + 1 + i][column] != '_'))                 return false;             if (row == 0 && column == 9 && (board[row + i][column - 1] != '_' || board[row + 1 + i][column - 1] != '_' || board[row + 1 + i][column] != '_'))                 return false;             if (row == 0 && column > 0 && column < 9)                 if (board[row + i][column + 1] != '_' || board[row + 1 + i][column + 1] != '_' || board[row + 1 + i][column] != '_' || board[row + i][column - 1] != '_' || board[row + 1 + i][column - 1] != '_')                     return false;             if (column == 0 && row > 0 && row < 9 && (board[row + i][column + 1] != '_' || board[row + 1 + i][column + 1] != '_' || board[row + 1 + i][column] != '_' || board[row - 1 + i][column + 1] != '_' || board[row - 1 + i][column] != '_'))                 return false;             if (column == 9 && row > 0 && row < 9 && (board[row + i][column - 1] != '_' || board[row + 1 + i][column - 1] != '_' || board[row + 1 + i][column] != '_' || board[row - 1 + i][column - 1] != '_' || board[row - 1 + i][column] != '_'))                 return false;             if (row > 0 && row < 9 && column > 0 && column < 9)                 if ((board[row + i][column + 1] != '_' || board[row + 1 + i][column + 1] != '_' || board[row + 1 + i][column] != '_' || board[row + i][column - 1] != '_' || board[row + 1 + i][column - 1] != '_' || board[row - 1 + i][column + 1] != '_' || board[row - 1 + i][column] != '_' || board[row - 1 + i][column - 1] != '_'))                     return false;         }         return true;      } } 

and here's photo of example output: enter image description here

@interjay answered question pointing out error in condition:

if ( column = 0 ... // should == 

as many others said, remember enable warnings compiler can rise. try write literals first:

if ( 0 = column ... // that's error every compiler can catch 

the main reason wrote answer i'd show different (maybe more readable , less error prone) algorithm achive task, if may.

think ship , sorrounding water rectangle in sea (board). check cells inside rectangle easy, can done in nested loop. correctly define vertices of rectangle of search may trickier, not much.

i guess i've figured out how store data ships (the needed ones @ least), snippet of code should work:

const int rows = 10; const int cols = 10;  bool checkplace(int row, int column, direction direct, battleship ship) {      // check if top left corner of ship inside board     if ( row < 0  ||  row >= rows  ||  column < 0  || column >= cols )         return false;      int r_min = row,            // temporary top side of rectangle         c_min = column,         // temporary left side         r_max = row + 2,        // temporary bottom side         c_max = column + 2;     // temporary right side      // update top , left size if there enough space     if ( r_min > 0 ) --r_min;     if ( c_min > 0 ) --c_min;      // use ship length , direction update values right , bottom side     // max values 1 past border of rectangle     if ( horizontal == direct )          c_max += ship.getlength() - 1;     else          r_max += ship.getlength() - 1;      // check if bottom rigth corner of ship outside board     if ( r_max > rows + 1 ||  c_max > cols + 1 )         return false;      // clip rectangle if ship near border     if ( r_max > rows )         --r_max;     if ( c_max > cols )         --c_max;      // check inside rectangle     ( int = r_min; < r_max; ++i ) {         ( int j = c_min; j < c_max; ++j ) {             if ( '_' != board[i][j] )                 return false;         }        }         // open water     return true; } 

Comments