0

次の C# コードと同等の C++ コードを作成しようとしています。主な理由は、C# のチュートリアルに従っており、C++ の使用に慣れているからです。私の思考プロセスは、おそらく外側の配列を作成してから、行列のサイズを表す各インデックスに新しい配列を割り当てることです。これで問題ないでしょうか、それとも C++ でこれを実装するためのより良い方法はありますか?

// current C# code
List<int[,]> pieces;

pieces = new List<int[,]>();

/* I Piece */
pieces.Add(new int[4, 4] {
    {0, 0, 0, 0},
    {1, 1, 1, 1},
    {0, 0, 0, 0},
    {0, 0, 0, 0}
});

/* J Piece */
pieces.Add(new int[3, 3] {
    {0, 0, 1},
    {1, 1, 1},
    {0, 0, 0}
});

/* O Piece */
pieces.Add(new int[2, 2] {
    {1, 1},
    {1, 1}
});

/* S Piece */
pieces.Add(new int[3, 3] {
    {0, 1, 1},
    {1, 1, 0},
    {0, 0, 0}
});


/* T Piece */
pieces.Add(new int[3, 3] {
    {0, 1, 0},
    {1, 1, 1},
    {0, 0, 0}
});

/* Z Piece */
pieces.Add(new int[3, 3] {
    {1, 1, 0},
    {0, 1, 1},
    {0, 0, 0}
});

私の最初のコードは、配列内の行列を作成しています。ゲーム自体の「ピース」の数を変更するつもりはないので、固定配列で問題ありません。だから、これは私が同等のものとして書いたものです。明らかに、それは int のエンティティに割り当てることができないと言って、うまくいきませんでした:

int pieces [7];

//I piece
pieces [0] = new int [4][4];
pieces [0] = {
                {0, 0, 0, 0},
                {1, 1, 1, 1},
                {0, 0, 0, 0},
                {0, 0, 0, 0}
             }

/* And so on for each piece */
4

2 に答える 2

3

IMO ベクトルのベクトルのベクトルは、このような単純な構成では少し面倒に思えます。

おそらく、すべてが最大サイズの 4x4 であると想定し、その中にピースを埋め込むだけです。

#include <vector>
struct Piece { int v[4][4]; };
std::vector<Piece> pieces { 
     // I piece
     { {
        {0,0,0,0},
        {1,1,1,1},
        {0,0,0,0},
        {0,0,0,0}
     } },
     // J piece
     { {
       {0, 0, 1},  // This is OK since extra element will be 0 initialised by default.
       {1, 1, 1},
       {0, 0, 0}
       // Dont need a row here either as it will be 0 initialised.
     } }
     //Others omitted for now..
  };

または、C++11 に準拠していないコンパイラの場合:

#include <vector>
struct Piece { int v[4][4]; };
Piece raw_pieces[] = {
     { {
        {0,0,0,0},
        {1,1,1,1},
        {0,0,0,0},
        {0,0,0,0}
     } },
     { {
       {0, 0, 1},  // This is OK since extra element will be 0 initialised by default.
       {1, 1, 1},
       {0, 0, 0}
       // Dont need a row here either as it will be 0 initialised.
     } }
};


std::vector<Piece> pieces(raw_pieces, raw_pieces + sizeof(raw_pieces)/sizeof(Piece));
于 2013-03-13T07:01:26.793 に答える
2

試すstd::list<std::vector<std::vector<int> > >か、提案されているように試してください std::vector<std::vector<std::vector<int> > >

を使用した完全な例を次に示しvector<vector<vector<int>>>ますが、次のようにコンパイルする必要があることに注意してください。g++ -std=c++0x t.cpp

#include <vector>
#include <iostream>

using namespace std;

int main()
{
    vector<vector<vector<int>>> A = {
      {
        {0, 0, 0, 0},
        {1, 1, 1, 1},
        {0, 0, 0, 0},
        {0, 0, 0, 0}
      },
      {
        {0, 0, 1},
        {1, 1, 1},
        {0, 0, 0}
      },
      {
        {1, 1},
        {1, 1}
      },
      {
        {0, 1, 1},
        {1, 1, 0},
        {0, 0, 0}
      },
      {
        {0, 1, 0},
        {1, 1, 1},
        {0, 0, 0}
      },
      {
        {1, 1, 0},
        {0, 1, 1},
        {0, 0, 0}
      }
    };


    for(int i=0;i<A.size();i++) {
      for(int j=0;j<A[i].size();j++) {
        for(int k=0;k<A[i][j].size();k++) {
          std::cout<<A[i][j][k];
        };
        std::cout<<std::endl;
      };
      std::cout<<std::endl;
    };
}

または、一度にすべてを初期化するのが好きではなく、実行時に実行したい場合。付属のpush_back方法をいつでも使用できますstd::vector

#include <vector>
#include <iostream>

using namespace std;

int main()
{
    vector<vector<vector<int>>> A;
    A.push_back(vector<vector<int>>(
      {
        {0, 0, 0, 0},
        {1, 1, 1, 1},
        {0, 0, 0, 0},
        {0, 0, 0, 0}
      }
    ));


    A.push_back(vector<vector<int>>(
      {
        {0, 0, 1},
        {1, 1, 1},
        {0, 0, 0}
      }
    ));

    A.push_back(vector<vector<int>>(
      {
        {1, 1},
        {1, 1}
      }
    ));

    A.push_back(vector<vector<int>>(
      {
        {0, 1, 1},
        {1, 1, 0},
        {0, 0, 0}
      }
    ));


    A.push_back(vector<vector<int>>(
      {
        {0, 1, 0},
        {1, 1, 1},
        {0, 0, 0}
      }
    ));

    A.push_back(vector<vector<int>>(
      {
        {1, 1, 0},
        {0, 1, 1},
        {0, 0, 0}
      }
    ));


    for(int i=0;i<A.size();i++) {
      for(int j=0;j<A[i].size();j++) {
        for(int k=0;k<A[i][j].size();k++) {
          std::cout<<A[i][j][k];
        };
        std::cout<<std::endl;
      };
      std::cout<<std::endl;
    };
}
于 2013-03-13T06:32:08.763 に答える