2011-12-23 17 views
0

進行中のゲームに統計データを読み込む方法を見つけようとしていますか?私が働いているものは次のとおりです:外部ソースからゲームに情報を引き込む方法

今のところ、呪文は、名前をつけるために、stats、ectを設定し、Number Iでそれらを呼び出すことができるようにします。実際のコードではこういうことがありますか?それは動作しますが、すべての罰金とダンディです...しかし、それは今と後で問題だ

void spell(int & eMoney, int eSpell[10]) 
{ 
    using namespace std; 
    char spellname[10][25] = {"Minor Heal", "Fire Shard", "Lightening Shard", "Ice Shard", "Magic Barrier", "Essence Of Life", 
"Earth Shard", "Wind Shard", "Insigma", "Weaken"}; 
    int spellcost[10] = {50, 80, 80, 80, 100, 100, 80, 80, 120, 80}; 

..私はCSVファイルと同様に、スプレッドシートを使用することができるようにしたいので、私は広がりを持つことができます単純な呪文、剣、丁度クラブのようなシート...私は非常に大きな選択を予定しています。列と行の1つのファイルを編集し、実際のゲームで外部ファイルそれが必要なとき...しかし、私はこれについてどうやって行くのか理解できません。

case 2: 
      do 
      { 
       cout << "Which spell would you like to cast?\n\n"; 
       for(x=0;x<10;x++) 
        cout << x+1 << ". " << spellname[x] << ": " << eSpell[x] << " left" << endl; 
       cout << "11. Leave\n\n>> "; 
       cin >> decision; 
       system("cls"); 
      } 
      while((decision<1)&&(decision>11)||(eSpell[decision-1]==0)); 
      switch(decision) 

とここで私は基本的に考えているスプレッドシートの例である:私はここに

が、私は今、呪文の情報を呼び出す方法の例です。..任意のアイデアを開いていますか? A1から:

もう一つの例:

現在のコード:

mID mName mDmgMax mDmgMin mDefMax mDefMin mHp mSpeed mGold 
1 Wolf 32 0 2 0 32 7 20 
2 Bear 42 0 7 0 52 8 30 
3 Bandit 53 0 13 0 73 9 41 
4 Traveler 53 0 13 0 73 9 41 
5 Gargoyle 65 0 20 0 95 10 53 
6 Knight 65 0 20 0 95 10 53 
7 Warlock 75 0 25 0 118 11 66 
8 Mammoth 75 0 25 0 118 11 66 
9 Cyclops 85 0 35 0 142 12 80 
10 Unicorn 85 0 35 0 142 12 80 
11 Dragon 90 0 40 0 167 13 95 
12 Your Mother 90 0 40 0 167 13 95 
13 Demon 95 0 45 0 193 14 110 
14 Jesus 95 0 45 0 193 14 110 
15 Statan 110 0 55 0 220 15 125 
16 God 110 0 55 0 220 15 125 
:理想的には

char monsters[16][25] = {"Wolf", "Bear", "Bandit", "Traveler", "Gargoyle", "Knight", "Warlock", "Mammoth", "Cyclops", "Unicorn", "Dragon", "Your Mother", "Demon", "Jesus", "Satan", "God"}; 
    //monster strengths 
    int monsterdamagemax[16] = {32, 42, 53, 53, 65, 65, 75, 75, 85, 85, 90, 90, 95, 95, 110, 110}; 
    int monsterdamagemin[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 
    int monsterdefensemax[16] = {2, 7, 13, 13, 20, 20, 25, 25, 35, 35, 40, 40, 45, 45, 55, 55}; 
    int monsterdefensemin[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 
    int monsterhealth[16] = {32, 52, 73, 73, 95, 95, 118, 118, 142, 142, 167, 167, 193, 193, 220, 220}; 
    int monsterspeed[16] = {7, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15}; 
    int monstergold[16] = {20, 30, 41, 41, 53, 53, 66, 66, 80, 80, 95, 95, 110, 110, 125, 125}; 

、私は次のようにCSVファイルからすべてのことを得ることができるようにしたいです

+0

必要な情報を含むファイルを作成して読むことはどうですか? – lapk

+0

@AzzAそれはアイデアですが、ファイルから情報を正しく読み取るための実際のゲームは得られません。\ – Leaum

+0

http://www.cplusplus.com/reference/iostream/fstreamでC++ファイルストリームを見てみましょう/、 例えば。彼らには、ほとんどの機能のためのミニサンプルが用意されています。基本的に、ファイルからの読み取り/書き込みを試みたことがない場合は、フォーマットされたデータを読み込む方法とそこから情報を抽出する方法を実践する必要があります。それは全く難しくない、あなたはそれがどのように機能するかを見るためにそれを試す必要がある、便利な機能など – lapk

答えて

0

テーブルベースのデータをたくさん保存する場合は、SQLiteを使用してください。それはいくつかの興味深い費用と利点を持っています。

ダウンサイド(たぶん)では、SQLです。もう少し複雑になり、検索アルゴリズムによっては遅くなる可能性があります。また、手で編集することはできません、データベースを開くための何かが必要です(無料のツールがあります)。アップ側

は、データベース( spell='fireball' AND damage < 5のようなあなたが必要とするもの)のすべてのソートやフィルタリングの電力を取得し、SQLiteは非常に可能性がより速く簡単に十分でゲームデータを保存する( 速いで、自分のコードよりも)。各タイプ(武器、呪文、キャラクターなど)ごとに一意のテーブルを使用し、サーバーは関与せず(SQLiteは単一のDLLです)、展開やモデリングを容易にするために、すべてのデータを1つのファイルに保存できます。

リレーショナルデータベースは、ゲーム環境内にあるものとまったく同じデータテーブル(各オブジェクトタイプにはいくつかのフィールド、多少のバリエーション、多少のブランク、さまざまなデータタイプがあります)を使って作業することに優れています。 SQLiteは、最小のデータベースであるにもかかわらず、優れた時間で数千の行を処理できるため、ゲームデータが扱いにくくなることを心配する必要はありません(純粋なテキストテーブルファイル、NWN(2)の2DAフォーマット)。

学習曲線がありますが、将来的には新しいタイプのオブジェクトを追加すると新しいテーブルとクエリが追加され、多くのコードではありません。また、非常に安定したデータフォーマットとロード/ライブラリを保存します。あなたのニーズに応じて、それはショットの価値があるかもしれません。

0

本当ににCSVファイルを処理したい場合は、質問のコメントに指摘されているように、<fstream>に行く必要があります。そのアプローチを使用すると、あなたが必要とするものに十分であるはずです。getline

This threadC++.comおよびthis questionには、CSVの処理方法がいくつか指摘されています。

0

私はBoostを使って、私が扱っているCSVファイルを解析します。ここに簡単な例があります。

しかし、私はpeachykeenに同意しますが、SQLiteはあなたに適しているかもしれませんが、これは始めるのに役立ちます。

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

#include <boost/tokenizer.hpp> 
#include <boost/token_functions.hpp> 

typedef std::vector<std::string> csvLine; 
typedef std::vector<csvLine> csvLines; 
typedef boost::tokenizer<boost::escaped_list_separator<char> > csvTokenizer; 

csvLines ReadCSVFile(const std::string& fileName) 
{ 
    csvLines retVec; 
    std::ifstream inFile(fileName.c_str()); 
    if(inFile) 
    { 
     std::string fileLine; 
     while(std::getline(inFile, fileLine)) 
     { 
      csvTokenizer lineTokens(fileLine); 
      retVec.push_back(csvLine(lineTokens.begin(), lineTokens.end())); 
     } 
     inFile.close(); 
    } 
    return retVec; 
} 

int main(int argc, char** argv) 
{ 
    csvLines lines(ReadCSVFile(argv[1])); 
    for(csvLines::iterator lineIt = lines.begin(); lineIt != lines.end(); ++lineIt) 
    { 
     for(csvLine::iterator tokenIt = (*lineIt).begin(); tokenIt != (*lineIt).end(); ++tokenIt) 
     { 
      std::cout << *tokenIt << " "; 
     } 
     std::cout << std::endl; 
    } 
    return 0; 
} 
1

はどのようにあなたのための記録を作成し、ゲームであなたの「メイン」プログラムの小さなコマンドベースのアプリケーションを書くことについて、あなただけのこれらのレコードを読まなければなりません。

サンプル構造 - この「ヘルパー」プログラムレコード1つずつ(MNAME等)の各データ項目を読み取り、この構造に挿入で

struct monster 
{ 
    int mID; 
    char mName[25]; //from your code 
    int mDmgMax; 
    //and these as well mDmgMin mDefMax mDefMin mHp mSpeed mGold 
}; 

。 monsters.datファイルに構造体を書きます。

std::ofstream fout; 
fout.open("monsters.dat", std::ios::app | std::ios::binary);  
fout.write((char*) &monsterInstance, sizeof(monsterInstance)); 
fout.close(); 

これは単にレコードを追加します。 (私はエラーのチェックとデータの読み込みをスキップしました) このプログラムは、現在のモンスターを表示したり、モンスターを追加したり、モンスターを削除したりすることができます。

メインプログラムでこのようなレコードを読むのは簡単な作業です。

関連する問題