2012-05-06 47 views
0

你好堆棧溢出世界:3我的名字是克里斯,我有一個輕微的問題..所以我要用這種格式來提出問題.. 第1部分 我將介紹材料&代碼片段我目前與工作是工作.. 第2部分 我將在我最好的能力我期望實現我的目標的新的方式解釋。 第3部分 所以,你們認爲我沒有讓你做所有的工作,我會繼續前進,並提出我所說的目標的嘗試,以及研究發現我沒有完全理解的可能方式。從C++中的CSV文件(或其他格式)分配變量

第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}; 

的問題是,有大量的數據硬編碼到的各種文件,我需要爲怪物,物品,法術,技能,等..在原來的小規模得到某些系統使它很好..我一直在頭文件中使用各種空隙來傳輸數據從文件到文件時它被稱爲..但是,當我處理1000+怪物和不得不使用所有這些變量..手動把它們放在有點可笑..可笑嗎?哈哈...

第2部分

現在我的這個理想的系統,是能夠使用該.csv文件加載數據..我打的各種問題一個體面的量在此任務..例如,將從名稱中提取的數據轉換爲一個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部分

我已經嘗試了幾個不同的東西到目前爲止,並已完成研究如何實現這一目標..到目前爲止我遇到的是...

我可以編寫一個函數來讀取數據,比如說mobDB,將其記錄到數組中,然後將其輸出到.dat文件中?所以當我需要回憶變量時,我可以從.dat代替一個可修改的CSV來做一些事情。在閱讀和轉換時,我遇到了同樣的問題。

我可以去SQL路由,但我理解如何從SQL中獲取數據有很多問題?我在我的房子裏有一個PowerEdge 2003服務器盒,我存儲數據,它有NavicatSQL Premium設置,所以我想我關於SQL路由的兩個主要問題是,是否可以直接掛接到SQLServer,並且當我更新時數據庫,當客戶端運行時只會從數據庫中提取變量和數據?或者我會被卡在編譯SQL文件......當它是一個在線遊戲時,我知道我將不得不使用一些東西從服務器傳輸到客戶端,這就是爲什麼我要在開發中儘早設置這個,所以我有更多爲了構建,我相信我可以使用SQL服務器呢?如果任何人有一個良好的把握這種工作方式,我會非常喜歡採取SQL路線..

我所做的嘗試使用like,Boost從CSV解析數據,而不是標準的庫。相同的問題被介紹..我沒有閱讀將字符串轉換爲字符..但問題一旦我拉了數據,我無法將其轉換?

我也試過了ADO C++路由..死端有..

總而言之,我已經花了上週左右這個..我非常想建立SQL服務器來實際更新變量......但我是開放的任何工作理念都可以輕鬆編輯和實現大量的da ta ..

我很感激任何和所有的幫助..如果有人確實試圖幫助得到一個工作代碼,如果它沒有太多的麻煩添加評論的部分,你覺得你應該解釋一下?我不想讓別人給我一個快速解決方案..我真的想學習和理解我正在使用的東西。謝謝大家非常:)

克里斯

+0

我很感謝你已經試圖解釋這種情況。在一個問題中你太多了。你真的需要把這個問題縮小到你遇到的一個具體問題。 –

+0

@VaughnCato我猜如果有的話,我的單一問題將是...我怎麼能拉取所需的信息,來自SQL服務器的各種變量?如果這是有道理的。 –

+0

這裏是一個類似的問題:http://stackoverflow.com/questions/813296/how-do-i-use-a-database-in-c –

回答

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) 。

不過,祝你的遊戲好運,我希望有一天能玩上它。 :-)

+0

你是對的,我有很長的路纔會上網...是的,理想的我只想更新CSV中的值,當它加載它時抓取CSV中的信息並適當保存,我只是不知道如何將它保存到一個數組:( –

+0

你已經有了數組,你只需要改變你用數據填充它們的方式,我添加了一些示例代碼,現在可能會變得更加清晰。 –

+0

Ahhh,我明白了,我想我已經明白了,我會在我的進展中回覆你 –

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

我想我正在得到這個基本的想法..如果你可以詳細瞭解如何在這一點之後調用數據,以及如何實現這一點,我不想犯任何錯誤和迷惑自己。 –

+0

(我目前正在修改它以支持所有變量) –

+0

@ChrisRiley:你知道如何使用'std :: vector'嗎?如果沒有,那麼你需要閱讀[關於C++的介紹性書籍](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。或者你可以閱讀[文檔](http://en.cppreference.com/w/cpp/container/vector) –

相關問題