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; } }
@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
Post a Comment