2015-05-10 40 views
-2

我正在嘗試製作一個BattleShip遊戲,但我很努力地將這些船隻添加到主板上。雖然週期困擾

void Board::display() const{ 
    //string filename; 

    int upC = 65, lowC = 97; //aqui temos o codigo ascii do a, primeira letra do alfabeto, 65 é o seu uppercase e 97 o seu lowercase 
    int icc = 0; //int char coluna 

    cout << " "; 

    while (icc < numLines){ //o int char coluna vai aumentando consoante as dimensoes do tabuleiro || e.g Se tivermos um tab 10x10 
     cout << (char)lowC << " ";      //teremos um range de 65-75 [a-j] para as colunas e um range 97 -107 [A-J] para as linhas 
     icc++; 
     lowC++; 
    } 
    cout << endl; 
    icc = 0; 

    for (int y = 0; y< numLines; y++) 
    { 
     cout << (char)upC << " "; 
     for (int x = 0; x < numColumns; x++){ 
      if(board[y][x] == -1) 
       cout << '.' << " "; 
      else 
       cout << ships[board[y][x]].getSymbol() << " "; 
     } 

     cout << endl; 
     upC++; 
    } 
} 

我初始化充滿了-1的和我putShip功能(見上文)我添加了船舶載體的載體。

int Board::putShip(const Ship &s){ 
    int size = s.getSize(); 
    char ori = s.getOri(); 
    int line = s.getLin(); 
    int col = s.getCol(); 
    char symbol = s.getSymbol(); 

    //vector< vector<char> > tab; 

    /* cout << size << endl; 
     cout << ori << endl; 
     cout << line << endl; 
     cout << col << endl; 
     cout << symbol << endl;*/ 

    while (size > 0){ 
     if((board[line][col] == -1) && (ori == 'H')){ 
      board[line][col] = 0; 
      col++; 
      cout << "size " << size << endl; 

      return true; 
     } 
     else if ((board[line][col] == -1) && (ori == 'V')){ 
      board[line][col] = symbol; 
      line++; 
      return true; 
     } 

     else 
      return false; 
     size--; 
    } 

    //cout << line << col << endl; 

    /*while (size > 0){ 
     if(ori == 'H'){ 
      board[line][col] = symbol; 
      col++; 
     } 
     else{ 
      board[line][col] = symbol; 
      line++; 
     } 
     size--; 

    }*/ 
    //return true; 
} 

但由於某種原因,它只是打印,即使它們的大小的第一個點是4,而我的心不是循環工作,我不知道爲什麼。

這是我局的構造:

Board::Board(const string &filename){ 
    string nome; 
    unsigned int size; 
    char simb; 
    unsigned int cor; 
    char ori; 
    PositionChar position; 

    string tmp; 
    ifstream config; 
    config.open(filename.c_str()); //abre o ficheiro config onde estao as informacoes do tabuleiro 

    if (config.is_open()) { 
     config >> tmp >> numLines >> tmp >> numColumns; 
     cout << numLines << endl; 
     cout << numColumns << endl; 
     board.resize(numColumns, vector<int> (numLines,-1)); 

     while (!config.eof()) { 
      config >> simb >> tmp >> position.lin >> position.col >> tmp >> ori >> tmp >> size >> tmp >> cor; 

      if(!config.fail()){ 
       ships.push_back(Ship(simb, position, ori, size, cor)); 
      } 

      cout << "simbolo: " << simb << endl; 
      putShip(Ship(simb,position, ori, size, cor)); 
     } 

     //display(); 
    } else { 
     cout << "Ficheiro de config invalido" << endl; 
     exit(1); 
    } 
    config.close(); 
} 

的COUTS是調試調用,顯然不是問題有關。基本上,我得到了我的txt類似:

board: 10 x 10 
P - Aa - H - 4 - 10 

,然後我得到的符號(P),位置轉換爲整數(AA - 位置(0,0),方位(水平)的大小和顏色(不相關)

然後我檢查一下,如果板子的位置x,y是-1,如果是的話,它對應於水,如果沒有則填充'。'如果它具有> = 0,對應於每艘船從txt中讀取的矢量船的索引

我的while循環應該用4 P填充行,因爲方向是水平的,但它不這樣做,我不明白爲什麼

+0

我覺得這個問題更適合[代碼評論](https://codereview.stackexchange.com/)。 – Santiago

+2

@ user3267581 - no。這個問題有*「但是,不知何故,它只是打印第一個點,即使它們的大小是4.我的Cicle不工作,我不知道如何。」* - 根據Code Review的說法,這個代碼「不工作」範圍。它將在Code Review上關閉。 – rolfl

+0

公平點。感謝澄清。 – Santiago

回答

2

我想,在您發佈的代碼質量,那你是在談論這個循環:

while (size > 0){ 
    if((board[line][col] == -1) && (ori == 'H')){ 
     board[line][col] = 0; 
     col++; 
     cout << "size " << size << endl; 

     return true; 
    } 
    else if ((board[line][col] == -1) && (ori == 'V')){ 
     board[line][col] = symbol; 
     line++; 
     return true; 
    } 

    else 
     return false; 
    size--; 
} 

注意,有條件的所有路徑有一個return語句。這樣While循環將被執行一次或根本不執行。