0

こんにちは、スタック オーバーフローの世界 :3 私の名前は Chris です。ちょっとした問題があります。そのため、この形式で問題を提示します。 パート 1 現在、その IS で作業している資料とコード スニペットを提示します。 . パート 2 目標を達成するための、私が望む新しい方法を最善を尽くして説明します。 パート 3 では、私がすべての作業をあなたに任せているわけではないと思われているかもしれませんが、先に進んで、上記の目標に対する私の試みと、私が完全には理解していなかった研究が掘り起こした方法を紹介します.

パート1

mobDB.csv 例:

ID      Sprite    kName     iName     LV  HP    SP  EXP JEXP Range1 ATK1 ATK2   DEF MDEF  STR   AGI VIT INT DEX LUK Range2  Range3  Scale   Race    Element Mode    Speed   aDelay  aMotion dMotion MEXP    ExpPer  MVP1id  MVP1per MVP2id  MVP2per MVP3id  MVP3per Drop1id Drop1per    Drop2id Drop2per    Drop3id Drop3per    Drop4id Drop4per    Drop5id Drop5per    Drop6id Drop6per    Drop7id Drop7per    Drop8id Drop8per    Drop9id Drop9per    DropCardid  DropCardper
1001    SCORPION  Scorpion  Scorpion  24  1109  0   287 176  1      80   135    30  0     1     24  24  5   52  5   10      12      0       4       23      12693   200     1564    864     576     0       0       0       0       0       0       0       0       990     70          904     5500        757     57          943     210         7041    100         508     200         625     20          0       0           0       0           4068        1
1002    PORING    Poring    Poring    1   50    0   2   1    1      7    10     0   5     1     1   1   0   6   30  10      12      1       3       21      131     400     1872    672     480     0       0       0       0       0       0       0       0       909     7000        1202    100         938     400         512     1000        713     1500        512     150         619     20          0       0           0       0           4001        1
1004    HORNET    Hornet    Hornet    8   169   0   19  15   1      22   27     5   5     6     20  8   10  17  5   10      12      0       4       24      4489    150     1292    792     216     0       0       0       0       0       0       0       0       992     80          939     9000        909     3500        1208    15          511     350         518     150         0       0           0       0           0       0           4019        1
1005    FARMILIAR Familiar  Familiar  8   155   0   28  15   1      20   28     0   0     1     12  8   5   28  0   10      12      0       2       27      14469   150     1276    576     384     0       0       0       0       0       0       0       0       913     5500        1105    20          2209    15          601     50          514     100         507     700         645     50          0       0           0       0           4020        1
1007    FABRE     Fabre     Fabre     2   63    0   3   2    1      8    11     0   0     1     2   4   0   7   5   10      12      0       4       22      385     400     1672    672     480     0       0       0       0       0       0       0       0       914     6500        949     500         1502    80          721     5           511     700         705     1000        1501    200         0       0           0       0           4002        1
1008    PUPA      Pupa      Pupa      2   427   0   2   4    0      1    2      0   20    1     1   1   0   1   20  10      12      0       4       22      256     1000    1001    1       1       0       0       0       0       0       0       0       0       1010    80          915     5500        938     600         2102    2           935     1000        938     600         1002    200         0       0           0       0           4003        1
1009    CONDOR    Condor    Condor    5   92    0   6   5    1      11   14     0   0     1     13  5   0   13  10  10      12      1       2       24      4233    150     1148    648     480     0       0       0       0       0       0       0       0       917     9000        1702    150         715     80          1750    5500        517     400         916     2000        582     600         0       0           0       0           4015        1
1010    WILOW     Willow    Willow    4   95    0   5   4    1      9    12     5   15    1     4   8   30  9   10  10      12      1       3       22      129     200     1672    672     432     0       0       0       0       0       0       0       0       902     9000        1019    100         907     1500        516     700         1068    3500        1067    2000        1066    1000        0       0           0       0           4010        1
1011    CHONCHON  Chonchon  Chonchon  4   67    0   5   4    1      10   13     10  0     1     10  4   5   12  2   10      12      0       4       24      385     200     1076    576     480     0       0       0       0       0       0       0       0       998     50          935     6500        909     1500        1205    55          601     100         742     5           1002    150         0       0           0       0           4009        1

これは私が持っているスプレッドシートの例です..これは、私の理想的な目標で使用したいものです。私が現在使用しているものではありません..MS Excel 2010で、列A〜BFと行1〜993を使用して行われました

現在、作業コードの私の形式は、手動で実装された配列を使用しています..たとえば、私が持っている iName の場合:

char iName[16][25] = {"Scorpion", "Poring", "Hornet", "Familiar", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null"};

ヘッダー ファイル (bSystem.h) で定義されて適用されるようになりました。ヘルス変数としましょう。次のように、対応する順序で同じヘッダーに別の配列が必要です。

int HP[16] = {1109, 50, 169, 155, 95, 95, 118, 118, 142, 142, 167, 167, 193, 193, 220, 220};

問題は、モンスター、アイテム、呪文、スキルなどに必要なさまざまなファイルにハードコードする大量のデータがあることです.特定のシステムを作成するための元の小規模では、それは問題ありませんでした..ヘッダーファイルでさまざまなボイドを使用して、呼び出されたときにファイルからファイルにデータを転送します..しかし、1,000以上のモンスターを扱っていて、これらすべての変数を使用する必要がある場合..手動でそれらを入れるのはちょっと..ばかげていますか? 笑...

パート2

これに対する私の理想的なシステムは、.CSV ファイルを使用してデータをロードできるようにすることです..このタスクでは、かなりの量のさまざまな問題に遭遇しました..Names から取得したデータを Char 配列に変換するなど、実際にCSVファイルからデータを引き出し、特定のセクションを特定の配列に割り当てます...私が念頭に置いている主なアイデアは、私が到達できないように見えることです。

これらのさまざまな変数をCSVファイルから読み取る方法を見つけたいと思います...したがって、次のような変数を呼び出すと:

cout << name << "(" << health << " health) VS. " << iName[enemy] << "(" << HP[enemy] << " health)";

ここ[enemy]で、ID になります。敵との遭遇は別のヘッダー (lSystem.h) にあり、基本的には次のようになります。

case 0:
        enemy = 0;

0 は、モンスターを含む配列の最初のデータになります..特定の順序にする必要があるのは嫌いです..敵 = 1002; と言えるようにしたいと思います。そのため、戦闘システムが開始すると、必要な変数を ID 1002 の敵から取得できます。

私はいつもいくつかの異なる問題に遭遇します.ファイルからプログラムにデータをプルすることはできません..できるときは、int値をint配列に格納することしかできません.変換するのに問題があります.文字列をchar配列に..次に提示される問題は、それと実際の保存部分を思い出すことです...これがパート3の出番です:3

パート 3

これまでにいくつかの異なることを試み、これを達成する方法について調査しました..これまでに出くわしたのは..

たとえばmobDBからデータを読み取り、それを配列に記録してから.datに出力する関数を作成できますか? したがって、変数をリコールする必要がある場合は、変更可能な CSV の代わりに .dat からいくつかの操作を実行できます。読み取りと変換に関する限り、同じ問題が発生しました。

SQL ルートに進むことはできますが、SQL からデータを取得する方法を理解するのに多くの問題がありましたか? 家にはデータを保存する PowerEdge 2003 Server ボックスがあり、NavicatSQL Premium がセットアップされています。そのため、SQL ルートに関する主な 2 つの質問は、SQLServer に直接接続できるかどうか、および更新時にデータベース、クライアントが実行されると、変数とデータをDBからプルするだけですか? それとも、SQL ファイルのコンパイルで行き詰まるでしょうか... オンライン ゲームの場合、サーバーからクライアントに転送するために何かを使用する必要があることはわかっています。構築するために、SQLサーバーを使用できると確信していますか? 誰かがこれがどのように機能するかをよく理解しているなら、私はSQLルートを取りたい..

私が行った試みは、標準ライブラリの代わりにCSVからのデータを解析するためにブーストを使用しています..同じ問題が提示されました..文字列を文字に変換することについて読みました..データ、変換できませんでしたか? ...

私はADO C++ルートも試しました..そこで行き止まり..

全体として、私はこれに先週かそこらを費やしました..実際に変数を更新するようにSQLサーバーをセットアップしたいと思います.データ量..

私はすべての助けに感謝します..誰かがこれのための動作するコードを取得するのを手伝おうとする場合、説明する必要があると感じる部分にコメントを追加するのがそれほど面倒ではない場合? 誰かに簡単な修正をしてもらいたくありません..実際に自分が何を使用しているかを学び、理解したいと思っています。どうもありがとうございました:)

-クリス

4

2 に答える 2

0

私があなたの問題を正しく理解しているかどうか見てみましょう: あなたはゲームを書いていて、現在、ゲーム アクターのすべての統計情報がハードコードされています。このデータを含む Excel スプレッドシートが既にあり、ハードコードされたヘッダー ファイルの代わりにこれを使用して、長い再コンパイルを待たずに統計を微調整できるようにします。現在、列ストア方式、つまり属性ごとに 1 つの配列で統計情報をコードに格納しています。CSV ファイルには、行ごとにデータが保存されます。ここまで正解?

今、あなたの問題に対する私の理解は少しぼやけています。しかし、試してみましょう。私の理解が正しければ、コードから配列を完全に削除し、クリーチャーの統計が必要なときに CSV ファイルに直接アクセスしたいですか? はいの場合、これはすでに問題です。ファイル I/O は非常に遅いため、このデータをメイン メモリに保持する必要があります。配列を保持するだけで、ヘッダーに手動で値を割り当てる代わりに、ゲームの開始時に CSV ファイルを読み取り、その内容を配列にロードするロード関数があります。コードの残りの部分はそのままにしておくことができます。

例:

void load (std::ifstream &csv)
{
    readFirstLineAndCheckThatItIsCorrect (csv);

    while (!csv.eof())
    {
        int id;
        std::string spriteName;

        csv >> id;
        csv >> spriteName >> kName[id] >> iName[id] >> LV[id] >> HP[id] >> SP[id] >> ...

        Sprite[id] = getSpriteForName (spriteName);
    }
}

データベース システムの使用は、ここでは完全に対象外です。いくつかのデータをいくつかの配列にロードするだけです。プログラムを再起動せずに統計を変更できるようにする場合は、CSV ファイルをリロードするためのホットキーを追加します。

オンライン ゲームを作成する場合は、まだ先が長いです。それでも、SQL はサーバーとクライアントの間でデータを交換するための非常に悪い考えです。なぜなら、a) あまりにも多くのオーバーヘッドを導入するだけであり、b) クライアントがデータベースに直接アクセスできる場合、入力を検証しなくなりました。http://forums.somethingawful.com/showthread.php?noseen=0&pagenumber=258&threadid=2803713を参照してください。実際の例として。本当にこれをオンライン ゲームにしたい場合は、独自の通信プロトコルを設計する必要があります。しかし、それは本当に複雑な問題なので、最初にそれについての本を読んだほうがいいかもしれません。たとえば、サーバーと他のプレーヤーが次に何をする可能性が高いかをクライアント側で推測することで、ユーザーからレイテンシーを隠す必要があります。推測が間違っていた場合は、プレーヤーが気付かないうちに適切に修正します (推測航法)。 .

それでも、あなたのゲームで頑張ってください。いつかプレイできることを願っています。:-)

于 2012-05-06T15:19:38.727 に答える
0

IMO、最も簡単なことは、モンスターのすべてのデータを保持する構造体を最初に作成することです。これらすべての変数を入力する気がしないので、縮小版を次に示します。

struct Mob
{
    std::string SPRITE, kName, iName;
    int ID, LV, HP, SP, EXP;
};

特定の形式の読み込みコードは非常に単純です。

bool ParseMob(const std::string & str, Mob & m)
{
    std::stringstream iss(str);
    Mob tmp;
    if (iss >> tmp.ID >> tmp.SPRITE >> tmp.kName >> tmp.iName
            >> tmp.LV >> tmp.HP >> tmp.SP >> tmp.EXP)
    {
        m = tmp;
        return true;
    }
   return false;
}

std::vector<Mob> LoadMobs()
{
    std::vector<Mob> mobs;
    Mob tmp;
    std::ifstream fin("mobDB.csv");
    for (std::string line; std::getline(fin, line); )
    {
        if (ParseMob(line,tmp))
            mobs.emplace_back(std::move(tmp));
    }
    return mobs;
}
于 2012-05-06T15:08:15.923 に答える