2015-07-12 44 views
1

我正在嘗試做一個簡單的戰鬥遊戲。我被困在試圖隨機將船放在我的板上。我有一種感覺,因爲我應該使用矢量而不是數組。但我不知道如何創建一個2D矢量。用隨機值填充我的數組C++

這是我到目前爲止有:

using namespace std; 



void clearBoard(const int row, const int col) 
{ 
    int grid[row][col]; 
    for (int i = 0; i < row; i++) { 
     for (int j = 0; j < col;j++) { 
      grid[i][j] = 0; 
      cout << grid[i][j] << " "; 

     } 
     cout << endl; 
    } 
} 

void setShips(int max_ships1, int row, int col) 
{ 
    int ship_counter = 0; 
    while(ship_counter < max_ships1) { 
     int x = rand() % row; 
     int y = rand() % col; 
     int matrix[x][y] 
     if (matrix[x][y] != 1) { 
      ship_counter++; 
      matrix[x][y] = 1; 
      cout << matrix[x][y] << " "; 
     } 
    cout << endl; 
    } 
} 

int main(int argc, char* argv[]) 
{ 

    int _row = atoi(argv[0]); 
    int _col = atoi(argv[2]); 

    int max_ships; 
    if (_row > _col) { 
     max_ships = _row; 
    } 
    else if (_col > _row) { 
     max_ships = _col; 
    } 
    else { 
     max_ships = _row; 
    } 

    cout << "enter the size of the board:"; 
    cin >> _row >> _col; 
    clearBoard(_row, _col); 
    setShips(_row,_col,max_ships); 





    return 0; 

} 

如果用戶決定在3×3板,第一函數返回:

0 0 0 
0 0 0 
0 0 0 

我希望能隨機產生1對代表戰列艦的位置。 這裏有一個3x3板爲例:

1 0 0 
0 1 0 
1 0 0 

感謝。

+1

'INT _row =的atoi(argv的[0]);'您的意思是'的argv [1]'? – AlexD

+0

不要這樣想。我希望用戶輸入像「4 4」這樣的電路板尺寸,並在兩者之間留出空間。 – Jeremy78

+2

這不是'argv'如何代表命令行參數。見例如http://stackoverflow.com/a/3024202。 – AlexD

回答

1

你的主要問題是:grid超出範圍(並有效地刪除)時clearBoard回報,matrix(一個完全無關的數組grid)超出每次範圍通過您的while循環。這意味着您填寫grid用零,然後創建了一堆用隨機數據等陣列,有時一個元素設置爲1,則需要要麼使grid全球,還是從clearBoard返回,並把它傳遞給setShips作爲參數。

傳遞多維原始數組有點複雜,所以如果你不想讓數組變成全局的,那麼使用一個向量可能會讓你更容易一些。要創建一個二維矢量,您可能會認爲std::vector<std::vector<int>>可以工作,但這並不完全正確。你可以這樣做,如評論中所述,但從技術上講,std::vector<std::vector<int>>是所謂的鋸齒陣列,這意味着你可以讓每一行的長度不同 - 不像你的原始2D陣列,你知道那個每行必須始終具有相同的長度。

的正確方法,使一個vector二維數組是這樣的:

std::vector<int> grid(row * col); 
grid[i * row + j] = 1; // Or i * col + j will also work. 

正如你所看到的,它更復雜一些由它的(X,Y)座標獲得元素出。使用哪種計算方法並不重要,但在一個版本中,ixjy,而在另一個版本中,反之亦然(iy等)。

+0

謝謝,我只有一個關於實現的問題。一旦我聲明'std :: vector grid(row * col);',應該在setShips和'grid [i * row + j] = 0中設置'grid [i * row + j] = 1;'in clearBoard?不好意思問,抓住這些元素對我來說有點混亂。 – Jeremy78

+0

非常多,但不要忘記,您需要在_same object_上執行此操作,與您發佈的代碼不同(正如我的第一段所述)。 – celticminstrel

+0

當我在我的函數中聲明'std :: vector grid(row * col);'時,它說類型的向量沒有調用操作符。我試着將函數的返回類型從void更改爲int,但仍然是相同的錯誤。我試圖聲明數組全局,但我得到的錯誤:'浮點異常:8'。很抱歉打擾你,但我是編程新手,並沒有任何人可以幫助我。 – Jeremy78

0

還可以設置這樣的2D矢量:

#include<vector> 
#include<iostream> 
using namespace std; 

int main() 
{ 

    std::vector< std::vector<int> > grid2D; 

    //m * n is the size of the grid 

    int m = 10; 
    int n = 10; 

    //Grow rows by m 
    grid2D.resize(m); 

    //Grow Columns by n 
    for(int i = 0 ; i < m ; ++i) grid2D[i].resize(n); 

    // print out 2D grid on screen 
    for(i = 0 ; i < m ; ++i){ 
     for(int j = 0 ; j < n ; ++j){  

      grid2D[i][j]=0; 
      cout<<""<<grid2D[i][j]<<" "; 

     } 
     cout<<"\n"; 

    } 
    cout<<"\n"; 
    return 0; 
}