2008-08-21 165 views
15

我最近學習了一些C#並編寫了一個Yahtzee克隆。我的下一步(現在遊戲邏輯已經準備就緒並且運作正常)就是整合一些在所有遊戲中保持統計數據的方法。從C#應用程序存儲數據

我的問題是,我應該如何去存儲這些信息?我的第一個想法是使用數據庫,我有一種感覺,那就是我會得到的答案......如果是這種情況,你能指點我一個用C#應用程序創建和訪問數據庫的好資源嗎?


在一個XML文件存儲實際上使我更有意義,但我想,如果我認爲我會得到四分五裂;)。我習慣於構建Web應用程序,對於這些應用程序,文本文件通常是不被接受的。

因此,如果使用XML文件,我應該查看哪些類可以輕鬆進行操作?

回答

16

這裏有一個想法:使用Xml序列化。設計你的GameStats數據結構,並根據需要選擇使用Xml屬性來影響架構。我喜歡將這種方法用於小數據集,因爲它的快速簡單,我只需要設計和操作數據結構。


using (FileStream fs = new FileStream(....)) 
{ 
    // Read in stats 
    XmlSerializer xs = new XmlSerializer(typeof(GameStats)); 
    GameStats stats = (GameStats)xs.Deserialize(fs); 

    // Manipulate stats here ... 

    // Write out game stats 
    XmlSerializer xs = new XmlSerializer(typeof(GameStats)); 
    xs.Serialize(fs, stats); 

    fs.Close(); 
} 
7

一個數據庫可能是矯枉過正的 - 你有沒有想過把分數存儲在一個文件中?

如果您決定使用數據庫,您可能會考慮SQLite,您可以像文件一樣分發。有一個開放源代碼的.NET提供商 - System.Data.SQLite - 包含您開始所需的一切。

在.NET中訪問和讀取數據庫非常容易 - 請參閱this question以獲取示例代碼。

13

對於類似的東西,數據庫可能會過度使用 - 首先將您的信息存儲在XML文檔(或者一系列XML文檔,如果有大量數據)。你可以得到所有那些漂亮的XCopy部署的東西,你仍然可以使用LINQ,如果你以後決定真的需要高性能的關係查詢邏輯,那麼它將會平滑過渡到數據庫。

3

我不知道數據庫是否一定是你想要的。對於像這樣的簡單遊戲來說,存儲統計數據可能是過分的。數據庫是好的;但是你不應該在每種情況下自動使用一個(我假設這是一個客戶端應用程序,而不是一個在線遊戲)。就個人而言,對於只存在於用戶計算機上的遊戲,我只會將統計信息存儲在一個文件中(XML或二進制文件 - 取決於您是否希望文件是人類可讀的)。

4

SQL Express來自MS是一個很好的免費,輕量級的SQL Server數據庫版本。如果你走數據庫路線,你可以試試。

或者,你可以簡單地在應用程序中創建的數據集,並將其序列化到XML,或者你可以使用類似的新崛起Entity Framework與.NET 3.5 SP1運

1

您可以使用System::Xml命名空間或System::Data命名空間。第一個給你原始的XML,後者給你一個方便的XML包裝。

1

我會建議只使用數據庫。我建議使用LINQ或ORM工具與數據庫進行交互。爲了學習LINQ,我會看看Scott Guthrie的帖子。我認爲其中有9個在一起。我將以下第1部分鏈接起來如果你想使用ORM工具,比如說nhibernate,那麼我會推薦檢查一下nHibernate的screencasts Summer。他們是一個非常好的學習資源nhibernate。

我不同意使用XML。通過報告大量數據的統計數據,您無法使用關係數據庫進行打分。是的,XML是輕量級的,但對於輕量級關係數據庫也有很多選擇,除了採用全面的基於服務的實現之外。 (即SQL Server CompactSQLite,等...)

+0

不知道爲什麼你被低估了這麼多。在這種情況下,我不會去數據庫(甚至是你所描述的輕量級數據庫),但是你的觀點是有效的,有一天原始海報可能已經增加了足夠的數據以使數據庫成爲更可用的選項+1試試並且不要這個) – 2008-09-25 13:47:44

2

我建議你保存數據的簡單波蘇斯,將這些序列化到XML或二進制文件,像布賴恩做到了。

如果您對數據庫感興趣,我會建議Sql Server Compact EditionVistaDB。兩者都在您的應用程序中處理。

1

對於這種情況,建模精美的Stats類和XmlSerializer[Serializable]屬性是IMO的一種選擇。

相關問題