1

そこで、基本的なチェス ゲームを作成して C++ を学ぼうとしています。ユーザーが非標準サイズのボード (つまり、必ずしも 8x8 ではない) を作成できるというしわが追加されました。

ただし、ユーザーからボードの寸法を受け取ったら、固定サイズで作成するように設定する必要があります。そこで、ここで配列を使用することを考えています。

ただし、コンパイラは私の宣言が好きではありません。

 tile arrayOfTiles[numX][numY];

配列インデックスとして定数が必要だと言っているようです。これは配列でもできることですか?

class gameBoard{
    public:
    gameBoard(int x=8, int y=8)
    :   numX(x),
        numY(y)
{
    //construct board
    tile arrayOfTiles[numX][numY];

    /*
    for (int i=0; i<numX; i++) {
        for (int j=0; j<numY; j++){
            arrayOfTiles[i][j]=tile();
            }
        }
    */
}

protected:
    int numX;  //total number of rows, typically 8 (A-H) on a chessboard
    int numY;  //total number of columns, typically 8 (1-8) on a chessboard

};
4

2 に答える 2

4

使用std::vector:

std::vector<std::vector<tile>> arrayOfTiles(numX, std::vector<tile>(numY));

typedef単純化するために使用します。

typedef std::vector<tile>  vectiles;

std::vector<vectiles> arrayOfTiles(numX, vectiles(numY));

vectilesは tile のベクトルで、arrayOfTilesは のベクトルですvectiles。二次元配列であるかのように扱うことができます。

for(size_t i = 0 ; i < numX; ++i)
{
     for(size_t j = 0 ; j < numY; ++j)
         //use arrayOfTiles[i][j]
}

との代わりに、numXとをそれぞれnumY使用できます。arrayOfTiles.size()arrayOfTiles[i].size()

于 2013-02-24T18:43:26.083 に答える
0

ここでできる最善の方法は、をそのデータ メンバーの 1 つとしてgameBoard内部的に保持するarrayOfTilesことです。C スタイルの配列の代わりに、次のように使用する必要がありますstd::vector

protected:
    std::vector< std::vector<tile> > arrayOfTiles;

次に、初期化リストで初期化できます。

public:
    gameBoard(int x = 8, int y = 8)
    : numX(x), numY(y), arrayOfTiles(x, std::vector<tile>(y));
    {
        // ...
    }
于 2013-02-24T18:47:12.887 に答える