2016-03-01 96 views
0

我最近開始着手製作一個用C#製作「Magic:The Gathering」風格的紙牌遊戲的側邊項目,只是爲了我作爲程序員的個人發展。如何在數據庫中保存不同的方法參數?

一張卡片既可以是「怪物」也可以是「咒語」,並且我想在特定場景發生時觸發某些事件(例如,怪物在受到打擊時會恢復其他友方怪物;或者法術當一個敵人怪物被放在板上時造成傷害)。

目前我正在將所有卡片存儲在RDBMS中,其中我有像「Monster」和「MonsterTrigger」這樣的表格。後者擁有一個MonsterId,TriggerType和MethodName。當怪物被加載時,我檢查它是否有任何觸發器效果,並將相應的EventHandler關聯到它,然後通過Reflection調用MethodName列中指定的方法。

我的問題是,我應該如何將方法參數保存在數據庫中? (例如DestroyAllMonsters() vs DrawCards(numOfCards) vs Heal(monsterId,hp))。方法可以具有不同數量的參數,不同的數據類型等。我最初的想法是將參數保存爲以逗號分隔的或沿着這些線的東西,但這似乎不是好的做法。 我的另一個想法是切換到NoSQL DB,但如果我可以幫助的話,我真的很想把這個項目的所有內容都放在RDBMS上。

我非常想聽聽你的建議。 在此先感謝!

回答

0

我會從這個假設開始,假設你不管使用什麼原因都不使用對象和對象繼承(因爲我的第一個想法是建議對象和類似工廠或生成器設計模式來構建這些卡),你已經爲自己辯護,而不是走上這條道路。

對於RDBMS,您希望將需要進一步定義的任何內容拆分爲其他表並與外鍵鏈接。由於方法有所不同,可能有也可能沒有參數我將它們分開,有一個參數表,並使用聯結表來連接方法與它們的參數,並將方法ID與卡片一起存儲。這使得MethodName列與關係數據庫結構的匹配程度高於您構建它的方式。

+0

你好,查爾斯,謝謝你對DB結構的回答。這非常有幫助!至於代碼,我使用的是對象繼承 - 我有一個Monster類和一個Spell類,它們都實現了Card接口。你建議我應該採用不同的方式嗎?我願意接受創意,這主要是對我自己的練習 – user104

+0

它真的取決於對象如何獲得其功能。這聽起來像你有通用對象,並且你正在使用數據庫來定義功能。我猜你希望能夠創建卡片而無需添加代碼(除非需要新的方法),這意味着使用泛型,因此接口可以爲此工作。這也意味着一個非常複雜的數據模型來支持該功能。 –