Hello Stack Overflow world: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)中定义应用,让我们说他们的健康变量?我必须在同一个Header中有另一个数组,并且具有相应的顺序,如下所示:
int HP[16] = {1109, 50, 169, 155, 95, 95, 118, 118, 142, 142, 167, 167, 193, 193, 220, 220};
问题是,有大量的数据要硬编码到我需要的怪物,物品,法术,技能等各种文件中。在原始的小规模上获得某些系统使它很好..我一直在头文件中使用各种Void来调用文件中的数据。但是当我处理1000多个怪物并且不得不使用所有这些变量时......手动将它们放入其中是有点儿的。荒谬的?洛尔...
第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值,我有让它将字符串转换为字符串数组的问题..然后我提出的下一个问题是回忆它和实际的保存部分......这是第3部分的来源:3
第3部分
到目前为止,我尝试了一些不同的事情并且已经研究过如何实现这一点。到目前为止我遇到的是......
我可以编写一个函数来读取来自let的数据说mobDB,将其记录到数组中,然后输出到.dat?因此,当我需要回忆变量时,我可以从.dat而不是可修改的CSV中做一些。就读取和转换而言,我遇到了同样的问题..
我可以使用SQL路由,但是我有很多问题需要了解如何从SQL中提取数据?我家里有一个PowerEdge 2003服务器盒,我存储数据,它确实有NavicatSQL Premium设置,所以我想我的主要关于SQL路由的两个问题是,是否有可能直接挂钩到SQLServer并且我更新数据库,当客户端运行它时,只需从数据库中提取变量和数据?或者我会被困在编译SQL文件......当它是一个在线游戏时,我知道我将不得不使用一些东西从服务器转移到客户端,这就是为什么我想在dev中尽早设置它以便我有更多为了构建,我相信我可以使用SQL服务器吗?如果有人对如何工作有很好的把握,我非常想采用SQL路线..
我尝试使用类似的,Boost来解析来自CSV而不是标准库的数据。提出了同样的问题..我确实读过将字符串转换为字符串..但是这个问题在于我提取数据,我无法转换它?..
我也尝试过ADO C ++路线。死路就在那里..
总而言之,我花了大约一个星期左右。我非常想设置SQL服务器来实际更新变量......但我对任何易于编辑的工作思路持开放态度并实施大量数据..
我感谢任何帮助..如果有人试图帮助获取有效的代码,如果在部分中添加评论并不会太麻烦,您认为应该解释一下吗?我不希望别人给我一个快速解决方案..我实际上想学习和理解我正在使用的东西。非常感谢你们:))
-Chris
答案 0 :(得分: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;
}
答案 1 :(得分:0)
让我们看看我是否正确理解了您的问题:您正在编写游戏,目前游戏演员的所有统计数据都是硬编码的。您已经有一个包含此数据的Excel电子表格,您只想使用它而不是硬编码的头文件,这样您就可以调整统计信息而无需等待长时间的重新编译。您当前正以列存储方式将统计信息存储在代码中,即每个属性一个数组。 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。 如果您真的希望这是一款在线游戏,您需要设计自己的通信协议。但也许你应该首先阅读一些有关这方面的书籍,因为它确实是一个复杂的问题。例如,您需要通过在客户端猜测服务器和其他玩家最有可能接下来做什么来隐藏用户的延迟,并在他们错误的情况下优雅地纠正您的猜测,所有这些都没有玩家注意到(Dead Reckoning)
尽管如此,祝你好运,我希望有一天能玩这款游戏。 :-)