2017-01-25 6 views
0

Я пытаюсь просто распечатать пространство в своем «холсте» (например, с координатами (2,2)), отредактировав сетку 80x20, сделанную █ блоками в окне консоли.2D-массивы и координаты

  • Пожалуйста, предложите мне лучшие способы создания сетки в первую очередь (я только что узнал для каждого-петли)

  • Почему я получаю эти 3-х символов после запуска программы?

  • Почему не пространство на блоке (2,2), но, очевидно, на первой строке где-то в середине?

enter image description here

Код:

#include <iostream> 

int main() 
{ 
uint8_t block {219}; // █ 
uint8_t space {32}; // ' ' 

uint8_t screen[80][20] {}; 

for (auto &row : screen) // make the "canvas" 
    for (auto &col : row) 
     col = block; 

for (int row = 1; row <= 80; ++row) 
{ 
    for (int col = 1; col <= 20; ++col) 
    { 
     if (col == 2 && row == 2) 
      screen[row][col] = space; 

    } 
} 


std::cout << *screen; 

return 0; 
} 
+0

Все с струна стиль должен быть нулем. – NathanOliver

+0

Если вы увеличиваете столбцы на 1, вы можете поместить символы новой строки в последний столбец. Это должно упростить печать, так как вы можете распечатать весь массив с помощью одного оператора (не забудьте зарезервировать дополнительный слот для завершающего символа nul). –

ответ

2

Некоторые вопросы:

  • C++ использует индексацию 0 на основе. Вы хотите for (int row = 0; row < 80; ++row).
  • Вы перебираете весь массив только для того, чтобы добавить пробел, почему бы не использовать screen[2][2]=space?
  • Вы печатаете весь массив на экране, но массив не включает символы новой строки, поэтому вы полагаетесь на консоль для переноса, это безопасные предположения?
  • Ваша строка не включает нужный null-termination, поэтому печатаются дополнительные символы.
  • Вы заказали свой массив как column-major. Я подозреваю, что вы захотите использовать row-major вместо этого.

Поскольку вы используете C++, я бы, наверное, написать такой код:

#include <iostream> 
#include <vector> 

class Screen { 
public: 
    typedef uint8_t schar; 
    std::vector<schar> data; //Store data in a flat array: increases speed by improving caching 
    int width; 
    int height; 
    Screen(int width, int height, schar initchar){ 
    this->width = width;  //'this' refers to the current instantiation of this object 
    this->height = height; 
    data.resize(width*height,initchar); //Resize vector and set its values 
    } 
    schar& operator()(int x, int y){ 
    return data[y*width+x]; 
    } 
    void setAll(schar initchar){ 
    std::fill(data.begin(),data.end(),initchar); 
    } 
    void print() const { 
    std::cout<<"\033[2J"; //ANSI command: clears the screen, moves cursor to upper left 
    for(int y=0;y<height;y++){ 
     for(int x=0;x<width;x++) 
     std::cout<<data[y*width+x]; 
     std::cout<<"\n";  //Much faster than std::endl 
    } 
    std::cout<<std::flush; //Needed to guarantee screen displays 
    } 
}; 

int main(){ 
    const int WIDTH = 80; 
    const int HEIGHT = 20; 

    uint8_t block {219}; // █ 
    uint8_t space {32}; // ' ' 

    Screen screen(WIDTH,HEIGHT,block); 
    screen(2,2) = space; 
    screen.print(); 

    return 0; 
} 
+0

Когда я изучаю векторы и классы и те команды ansi, я попробую еще раз, я думаю .. Спасибо в любом случае! Кстати, он не печатает, когда я запускаю его правильно (он печатает строки пробелов и блоков, может быть, это материал ansi, который не работает на моей машине?: /) – alienCY

Смежные вопросы