2011-12-23 28 views
0

我想找到一种方法来将stat数据导入到正在进行的游戏中通过传播板?这就是我正在使用的:如何从外部源获取信息到游戏中

现在,例如..法术,为了命名它们,设置统计数字,并且能够通过数字来调用它们我有这样的事情在实际的代码中进行:

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文件,这样我就可以有一个流传表格就像刚才的法术,只是剑,只是俱乐部...我打算有一个非常大的选择,它是更加理想的能够编辑一个单一的文件成列和行,并让实际的游戏从外部文件中获取信息何时需要......但我无法弄清楚如何去做这件事?我愿意接受任何想法..

这里是我现在该怎么呼吁咒语的信息的例子:

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:

又如:

目前代码:

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文件,如:

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 
+0

如何使用需要的信息制作文件并从中读取信息? – lapk 2011-12-23 04:40:01

+0

@AzzA这就是想法,但我无法从实际的游戏中正确读取文件中的信息= \ – Leaum 2011-12-23 04:41:34

+0

请查看http://www.cplusplus.com/reference/iostream/fstream上的C++文件流/, 例如。他们有大部分功能的小例子可以帮助您入门。基本上,如果您从未尝试从文件读取/写入,则需要练习如何读取格式化数据以及如何从中提取信息。这并不难,你只需要尝试一下,看看它是如何工作的,哪些功能是有用的。 – lapk 2011-12-23 04:47:41

回答

0

如果您将要保留大量基于表格的数据,则可以使用SQLite进行调查。它有一些有趣的成本和收益。

在下面(也许),它是SQL。它可能会更复杂一些,取决于您的搜索算法,可能会更慢。它也不能手动编辑,你需要一些东西来打开数据库(有免费的工具可用)。

在了一边,你就会得到一个数据库(任何你需要像spell='fireball' AND damage < 5)的所有排序和过滤能力,和SQLite是快速(很轻松地存储在游戏的数据,很可能更快比你自己的代码)。您可以将所有数据存储在单个文件中,以便轻松进行部署或修改,并为每种类型(武器,法术,角色等)提供独特的表格,并且不涉及涉及的服务器(SQLite是单个DLL)。

关系数据库擅长处理一致形式的数据表,这正是游戏环境中的每个对象类型(每个对象类型有几个字段,没有太多变化,可能有一些空白,以及各种数据类型)。尽管SQLite是最小的数据库,但它可以用极好的时间处理成千上万行,所以你不必担心你的游戏数据变得很笨重(这种情况很快发生在纯文本表文件中,比如NWN(2)的2DA格式)。 (有一个新的对象类型是一个新的表格和查询,而不是很多的代码)和一个非常稳定的数据格式和加载/保存库。根据您的需求,这可能值得一试。

0

如指出问题的评论,你应该去<fstream>如果你真的想处理CSV文件。使用这种方法,getline应该足够满足您的需求。

This thread in C++.com and 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

如何写,为您创建的记录,并在你的“主”程序,它是游戏中一个小的命令基于应用程序,你只需要读取这些记录。

样品结构 -

struct monster 
{ 
    int mID; 
    char mName[25]; //from your code 
    int mDmgMax; 
    //and these as well mDmgMin mDefMax mDefMin mHp mSpeed mGold 
}; 
在这种“辅助者”节目在记录中逐个读取每个数据项(如MNAME),并且在这个结构中插入

。将结构写入monsters.dat文件

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

这将简单地附加记录。 (我跳过错误检查和读取数据。) 为了更加方便,该程序应该能够显示当前的怪物,添加怪物,删除怪物(通过输入mID)。

在主程序中读取这些记录应该是一件容易的事。