-1

フラット ファイルからボードをロードするマインスイーパ ゲームを作成しようとしています (いいえ、ランダムではありません)。割り当ての指示に従って、コマンドライン引数として渡されたファイルを解析するロード関数に 2 次元配列を渡します。

とにかく、私の問題は 2D 配列を渡すことです。それを行うための適切な方法は何ですか?以下は私がこれまでに持っているコードです:

#include <iostream>

using namespace std;

struct Tile
{
    bool mine, visible;
    int danger;
};

bool loadBoard( Tile **board, string filename );

const int gridSize = 6;

int main( int argc, char* argv[] )
{
    Tile board[ gridSize ][ gridSize ];

    loadBoard( board, argv[ 1 ] );

    system("PAUSE");
    return EXIT_SUCCESS;
}

bool loadBoard( Tile **board, string filename ) {

}
4

3 に答える 3

3

C ++を使用しているので、使用してみませんか

std::vector<std::vector<Tile>>

Cスタイルの配列よりも優先されますか?

Cスタイルの配列を使用する必要があるように思われるので、arpanchaudhuryが提案するアプローチを使用するか、パスTile*して次のようなことを行うことができます。

static void loadBoard(Tile *board, int rows, int cols, string filename) {
    for (int row = 0; row < rows; row++) {
        for (int col = 0; col < cols; col++) {
            Tile* tile = &board[(row*gridSize)+col];
            // populate Tile
        }
    }
}
于 2013-01-18T15:26:27.377 に答える
2

2 次元配列を渡したい場合は、配列内の列数を指定してください。

bool loadBoard( Tile board[][size], string filename ) {}

ただし、定義済みのサイズを指定する必要がないため、単純な配列の代わりにベクトルを使用することをお勧めします

于 2013-01-18T15:32:32.737 に答える
1

C++ を使用している限り...

#include <iostream>
using namespace std;

struct Tile
{
    bool mine, visible;
    int danger;
};

// load a square board of declared-size.
template<size_t N>
void loadboard( Tile (&board)[N][N], const std::string& filename)
{
    // load board here.
    cout << "Loading from file: " << filename << endl;
    for (size_t i=0;i<N;++i)
    {
        cout << "board[" << i << "]: [ ";
        for (size_t j=0;j<N;++j)
        {
            // load element board[i][j] here
            cout << j << ' ';
        }
        cout << ']' << endl;
    }
    cout << endl;
}

int main()
{
    Tile board[6][6];
    loadboard(board, "yourfilename.bin");   // OK dims are the same

    Tile smaller[3][3];
    loadboard(smaller, "anotherfile.bin");  // OK. dims are the same

    // Tile oddboard[5][6];
    // loadboard(oddboard, "anotherfile.bin"); // Error: dims are not the same.

    return 0;
}

出力

Loading from file: yourfilename.bin
board[0]: [ 0 1 2 3 4 5 ]
board[1]: [ 0 1 2 3 4 5 ]
board[2]: [ 0 1 2 3 4 5 ]
board[3]: [ 0 1 2 3 4 5 ]
board[4]: [ 0 1 2 3 4 5 ]
board[5]: [ 0 1 2 3 4 5 ]

Loading from file: anotherfile.bin
board[0]: [ 0 1 2 ]
board[1]: [ 0 1 2 ]
board[2]: [ 0 1 2 ]

もちろん、言語のテンプレート機能を使用しないようにするための「特定の指示」もあるでしょう。繰り返しになりますが、これらの指示には、SO ユーザーに問題を解決してもらうことも含まれていないに違いありません。

于 2013-01-18T16:27:42.807 に答える