0

したがって、単純な迷路ゲームのテキスト ファイルから次の形式のデータを読み取ろうとしています。

A * B * *
B*C*A
CGD * B
D * * * C
EIF * *
FJG * E
G*HCF
H * * * G
私 * * E *
J * KF *
K*L*J
L * * * K

最初の列は現在のノードです。2 番目の列、すぐ北のノード。3 番目はすぐ東、4 番目はすぐ南、5 番目はすぐ西です。* はノードがないことを表し、ポインターは null に設定する必要があります。

私は OOP の初心者であることを念頭に置いて、この情報を Node というクラスに「保存」する方法に興味があります。

次のクラス定義があります。

public:
    int BuildGraph();
    char name;
    char north;
    char east;
    char south;
    char west;
};  
    std::vector<Node> nodes;

コードを使用build >> node.name >> node.north >> node.east >> node.south >> node.west;すると、正しい文字が読み込まれます。

これにより、必要な文字が正しく取得されます。ただし、行の最後に到達したら、このノードを保存し、次の行に移動してそのノードを保存するにはどうすればよいですか? 現在、ファイルの最後に到達するまでこれをループする do/while ループがありますが、もちろん、通過するたびにすべてを上書きするため、効果的に読み取られる唯一のコードは L * の最後の行です。 * * K. 最初の行をノード A、2 番目の行をノード B などとして保存するにはどうすればよいですか? プログラムの他の場所でこれを参照するにはどうすればよいですか? 現在、Node 型のオブジェクト ノードを作成しているところです。行の終わりに到達したら、ノード内のすべてを A という新しいノードにコピーする必要があります。

編集:フォーマットについて申し訳ありません。Stack Overflow で 4 つのスペースがコードのインデントとして認識されません。

4

5 に答える 5

1

I'm not sure if I'm getting what is what you want to get, but if you want to save each element of type Node with a different identifier you may try the next:

pair<char, Node> node_with_name;

And then you can assign the name to the first element doing build >> node_with_name.first; , then put the rest of the elements in the node and assign it in the same way to the second position of the pair.

And the vector should also be changed in order to use this solution:

std::vector<pair<char, Node> > nodes;

And finally you would do:

nodes.push_back(node_with_name);

in every iteration of the loop.


Edit: I think that a map would possibly fit better to your needs. I will show you an example:

std::map<char,Node> mymap;

do {
  char name;                          // to store temporarily each node's name
  build >> name;            
  build >> mymap[name].north;      // we start getting the data for the node with this name
  build >> mymap[name].east;
  build >> mymap[name].south;
  build >> mymap[name].west;
}while(! build.eof());

And then you can output each node's data with:

std::cout << "mymap['A'].north is " << mymap['A'].north << '\n';

Map reference: http://www.cplusplus.com/reference/map/map/operator%5B%5D/

Pair Reference: http://www.cplusplus.com/reference/utility/pair/

于 2013-07-25T01:07:42.110 に答える
0
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>

struct node
{
    char name;
    char north;
    char east;
    char south;
    char west;
}; 

std::istream& operator >> (std::istream& is, node& n)
{
    is >> n.name >> n.north >> n.east >> n.south >> n.west;
    return is;
}

std::ostream& operator << (std::ostream& os, const node& n)
{
    os << n.name << ' ' << n.north << ' ' << n.east << ' ' << n.south << ' ' << n.west;
    return os;
}

int main(int argc, char* argv[])
{
    std::vector<node> nodes;

    node n;

    while(std::cin >> n)
      nodes.push_back(n);

    std::copy(nodes.begin(), nodes.end(), std::ostream_iterator<node>(std::cout,"\n"));
    return 0;
}

$ cat nodes.txt | ./a.out 
A * B * *
B * C * A
C G D * B
D * * * C
E I F * *
F J G * E
G * H C F
H * * * G
I * * E *
J * K F *
K * L * J
L * * * K
于 2013-07-25T04:25:31.777 に答える
0

use getline() function over the file, read the file line by line and parse the node info into your node struct.

于 2013-07-25T00:38:19.240 に答える
0

質問を理解しているので、ファイルからノードの説明を読み込んで、メモリ内のデータ構造に保存できるようにしたいと考えています。テキストの冒険マップのように見えます。

迷路ゲームのマップを「maze.dat」というテキスト ファイルにコピーしました。

これは、maze.dat ファイルを 1 行ずつ解析し、各行を Node というユーザー定義のデータ構造に格納する単純なプログラムです。各ノードは、ベクターと呼ばれる別のデータ構造に配置されます。

プログラムの最後に、元の入力ファイルと一致することがわかるように、ベクター内の各ノードを出力しました。これが私の例です:

#include <iostream>
#include <fstream>
#include <vector>

// storing each node in a data structure
class Node
{
public:
    Node(char name, char north, char east, char south, char west)
    {
        this->name = name;
        this->north = north;
        this->east = east;
        this->south = south;
        this->west = west;
    };

    char name;
    char north;
    char east;
    char south;
    char west;
};

// function to print out a node
void print_node(Node n)
{
    std::cout << n.name << " " << n.north << " " << n.east << " " << n.south << " " << n.west << " " << std::endl;
}

int main(int argc, const char * argv[])
{
    // first off let's read in our maze data file
    std::ifstream maze_file("maze.dat");

    // create somewhere to store our nodes
    std::vector<Node> nodes;

    // check that we opened the file, then parse each line
    if( maze_file.is_open() )
    {
        while( maze_file.good() )
        {
            // temporary node_data for each line in the file
            std::string node_data;

            // read the current line
            getline( maze_file, node_data );

            // parse the line into tokens (e.g. A, ,*, ,B, ,*, ,* )
            std::vector<char> tokens(node_data.begin(), node_data.end());

            // strip out the blanks ' ' (e.g. A,*,B,*,*)
            tokens.erase( std::remove(tokens.begin(), tokens.end(), ' '), tokens.end() );

            // there should be 5 tokens for a node description
            if( tokens.size() == 5 )
            {
                Node node( tokens[0], tokens[1], tokens[2], tokens[3], tokens[4] );
                nodes.push_back(node);
            }
            else
                std::cout << "There weren't 5 tokens in the node description, there were: " << tokens.size() << std::endl;
        }

        // clean-up the open file handle
        maze_file.close();
    }
    else
        std::cout << "Unable to open file maze.dat";

    // now we can prove that we've stored the nodes in the same way as they were in the file
    // let's print them out from the vector of nodes
    std::for_each(nodes.begin(), nodes.end(), print_node);

    return 0;
}

これは、ファイルをデータ構造に変換する非常に簡単な方法です。これは、ファイルをロードするのに便利です。マップを保存する方法を作成して、マップ作成プログラムを作成できます。

実際のゲームで迷路マップを実際に使用する場合、これはおそらくあまり役​​に立ちません。北、東、南、西のいずれに移動するかに応じて、関連する部屋を取得する可能性が高くなります。このためには、前に Str1101 で説明されているように、std::map を使用してグラフ データ構造を構築する必要があります。

于 2013-07-26T13:51:35.597 に答える