Как изменить вектор вектора от 3×3 до 4×4 с помощью push_back и вставить в c ?

#c #vector #tic-tac-toe

Вопрос:

Новичок в программировании на C здесь!

Я работаю над проектом кодирования игры в крестики-нолики для двух игроков. Моя сетка представляет собой 2D-вектор размером 3×3, заполненный точками в начале. Программа запрашивает у пользователя координаты x и y и заменяет точку на X или 0.

Теперь моя задача состоит в том, чтобы увеличить размер сетки двумя способами, например, когда заданные координаты x или y больше на единицу, чем размер игрового поля, доска будет расширяться вправо и вниз или, если заданы координаты, например, x=2 и y=0, доска должна расширяться влево и вверх.

Вот как я попытался подойти к ситуации, я сделал две функции:

Вот у вас есть мой вектор вектора:

 int grid_size = 3;
vector< vector<char>>grid(grid_size, vector<char>(grid_size, '.'));
 

Первый пытается разобраться с расширением вниз и вправо:

 void expand_grid_down_right(vector<vector<char>>amp;grid){
//Let's make some helpers
vector<char> grid_row;
vector<char> grid_col;
//Adds new row but not column
for(int i = 0; i < grid.size();i  ){
            grid_row.push_back(' ');

    }
    vector<char> new_line(grid_row.size(), ' ');
    grid.push_back(new_line);



   for(unsigned int i = 0; i < grid.size(); i  ){
     cout << (i 1) << ' ';

   }
   cout << endl;
   //Draws the grid with three rows of dots and one row of plus-signs
   //Column numbered with four appears blank?
   //If I try to touch this with at(i).at(j) it gives out of bounds error
   for (auto amp;grid_row : grid) {

          for (auto amp;cell : grid_row) {

              cout << cell << ' ';
          }

          cout << endl;
      }
   //But this prints it as one column?
      for(int i=0; i<grid.size();i  ){
          for(int j=0; j<grid[i].size(); j  ){
              cout << grid[i][j] << endl;
          }
      }
      //I want to at to the new column the char = '.' but not sure what this does?
          for(int i=0; i<grid.size();i  ){
              for(int j=0; j<grid[i].size(); j  ){
                   grid.at(i).at(j) = '.';
              }
          }
}
 

Второй пытается справиться с расширением вверх и влево:

 void expand_grid_up_left(vector<vector<char>>amp;grid){
unsigned int dimension = grid.size();
vector<char> grid_col;
//Add new row of plus-signs to the top row but does not shift
//So from 3x3 to 4x3 but how to get it 4x4?
for (int i=0; i<dimension; i  ){
    grid_col.insert(grid_col.begin(),' ');
}
vector<char> line(grid_col.size(), ' ');
grid.insert(grid.begin(), line);
for (auto amp;grid_col : grid) {

      for (auto amp;cell : grid_col) {

          cout << cell << ' ';
      }

      cout << endl;
  }
}
 

Но ни один из них не работает так, как должен работать. Я использую знаки плюса, чтобы увидеть, где добавляются новые строки. Расширение вниз и вправо создает для строк и рисует пустой столбец 4. Если я попытаюсь получить доступ к этому с помощью цикла «индекс за индексом», он просто нарисует один столбец со всеми точками и знаками плюс. Тот, который должен расширяться влево и вверх, только помещает строку вверх, но не идет влево.

Существует ли пустой столбец 4 и как заставить их работать так, чтобы расширение стало от 3×3 до 4×4 или в более широком смысле NxN?

Ответ №1:

Проблема с кодом, который у вас есть, заключается в том, что вы его создаете grid_row , grid_col но на самом деле не используете. Что, если бы вы попробовали что-то подобное для начала expand_grid_down_right :

 void expand_grid_down_right(vector<vector<char>> amp;grid) {
  // first add the new row
  std::vector<char> new_row{grid.size(), ' '};
  grid.push_back(std::move(new_row));

  // then add the new column
  for (vector<char>amp; row : grid) {
    row.push_back(' ');
  }

  ...
 

Чтобы правильно напечатать, вам нужно убедиться, что ваш второй цикл совпадает с первым:

   for (auto amp;grid_row : grid) {
    for (auto amp;cell : grid_row) {
      cout << cell << ' '; // no endl here
    }
    cout << endl;          // endl here
  }
 

Что в конечном итоге выглядело бы так:

   // But this prints it as one column?
  for (int i = 0; i < grid.size(); i  ) {
    for (int j = 0; j < grid[i].size(); j  ) {
      cout << grid[i][j] << ' ';
    }
    cout << endl;
  }
 

Добавление в верхний левый угол должно быть очень похоже, но (похоже на то, что у вас есть), которое вы хотели бы вставить в начале, а не push_back для всех векторных операций.