Я хочу нарисовать простую квадратную карту, состоящую из сетки звездочек и внутри сетки, я бы хотел нарисовать другие фигуры.
пример вывода:
xxxxxooxxxx
xxxxxooxxxx
xxxxxxxxxxx
xxxxxxxxxxx
ooxxxxxxxxx
ooxxxxxxxxx
Я попытался просто поместить вложенные циклы для маленьких фигур во вложенные циклы для больших фигур, что привело к некоторому деформированному бесконечному прямоугольнику
и я попытался сделать начальные и конечные условия различными для меньших фигур (мой мыслительный процесс состоял в том, что они были эквивалентны координатам, но, очевидно, это неправильно)
любая помощь будет высоко ценится, я надеюсь использовать петли для решения этой проблемы, но приветствуются и другие методы.
Вот мой фактический код
{#включают
использование пространства имен std;
int main () {
for(int row=0;row<26;row++)
{
for(int column=0;column<26;column++)
{
cout << "*";
}
cout<< endl;
}
for (int i=5;i<10;i++)
{
for (int j=5;j<10;j++)
{
cout << "x";
}
cout << endl;
}}
Код в настоящее время рисует 2 квадрата один 26×26 и один 5×5 сразу после этого.
Я хотел бы знать, как вставить квадрат 5х5 в квадрат 26х26. Я также хотел бы знать, как контролировать свою позицию в пределах большего квадрата
Вероятно, было бы лучше сначала создать то, что вы пытаетесь напечатать, а затем распечатать. cout
просто печатает на консоль в текущей позиции, и нет простого способа сбросить эту позицию внутри текста, который уже был выведен. Есть библиотеки, которые дают вам такую функциональность, как ncurses
, но это может быть больше, чем вы ищете.
Попробуйте что-то вроде этого:
#include <iostream>
#include <vector>
typedef std::vector<char> GridRow;
typedef std::vector<GridRow> Grid;
void InitGrid(Grid& grid, int width, int height, char symbol = ' ')
{
grid.clear();
grid.resize(height);
for(size_t i = 0; i < grid.size(); ++i)
{
grid[i].clear();
grid[i].resize(width, symbol);
}
}
void DrawRectangle(Grid& grid, char symbol, int x, int y, int width, int height)
{
//Reject out of bounds rectangles. An alternative would be to clip them.
if(grid.empty() || grid.size() < static_cast<size_t>(y + height) || grid[0].size() < static_cast<size_t>(x + width))
{
return;
}
for(int h = y; h < (y + height); ++h)
{
GridRow& row(grid[h]);
for(int w = x; w < (x + width); ++w)
{
row[w] = symbol;
}
}
}
void PrintGrid(const Grid& grid)
{
std::string line;
for(size_t h = 0; h < grid.size(); ++h)
{
const GridRow& row(grid[h]);
for(size_t w = 0; w < row.size(); ++w)
{
std::cout << row[w];
}
std::cout << std::endl;
}
}
int main()
{
Grid grid;
InitGrid(grid, 11, 6, 'x');
DrawRectangle(grid, 'o', 5, 0, 2, 2);
DrawRectangle(grid, 'o', 0, 4, 2, 2);
PrintGrid(grid);
std::cout << std::endl;
InitGrid(grid, 15, 15);
DrawRectangle(grid, '*', 1, 1, 8, 8);
DrawRectangle(grid, '*', 6, 6, 8, 8);
PrintGrid(grid);
return 0;
}
Возможно, вы захотите обернуть сетку в классе, чтобы сделать вещи немного чище, но я подумал, что это может быть легче понять.
Других решений пока нет …