2017-01-25 19 views
0

コンソールウィンドウで█ブロックで作成した80x20グリッドを編集して、 "キャンバス"(座標(2,2)など)にスペースを単に印刷しようとしています。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

をすべてのCスタイルの文字列がnullで終了する必要があります。 – NathanOliver

+0

列を1つ増やすと、最後の列に改行文字を配置できます。 1つのステートメントで配列全体を印刷できるので、印刷を簡略化することができます(終端文字に余分なスロットを確保してください)。 –

答えて

2

いくつかの問題:

  • は、C++ 0ベースのインデックスを使用しています。あなたはfor (int row = 0; row < 80; ++row)が欲しい。
  • スペースを追加するためにアレイ全体をループしていますが、なぜ使用しないのですかscreen[2][2]=space
  • アレイ全体を画面に表示していますが、アレイに改行が含まれていないため、コンソールで囲むことにしていますが、これは安全な前提ですか?
  • 文字列には必要な文字が含まれていませんnull-termination、余分な文字が印刷されます。
  • あなたの配列はcolumn-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

関連する問題