2012-04-01 89 views
7

我正在用Java構建一個RPG地牢遊戲,並且我一直在創建一個數據結構。什麼是一個好的Java數據結構來存儲RPG遊戲物品?

我有很多事物可以複製到地牢裏。例如,有面包Thing物體,劍Thing物體,連鎖郵件Thing物體,怪物Thing(s)等。我想將它們存儲在中央圖書館,然後能夠使用某些查詢。我想用下面的字段來存儲他們:

int minLevel 
int maxLevel 
double probability 
int[] types 

所以生了鏽的劍將有1 minLevel,稀有性(3%),以及[type.SWORD,type.WEAPON,type.ITEM,TYPE.EQUIP]的3 maxLevel,一個probability。更好的劍會有minLevel 2,maxLevel 10,稀有(1%)。

然後我想從庫中檢索一個隨機type.SWORD並說我在3級。根據他們的概率,我應該比更好的劍更頻繁地生鏽的劍。如果我從請求10級的圖書館中檢索到type.SWORD,我只能找回更好的劍。

我希望這是有道理的。

編輯 在初始階段,所有的基本對象都將被創建。像可用的武器,盔甲,食品,藥水,魔杖,所有可能的東西,在遊戲中都有獨特的圖形拼圖。然後,當我想在某個地方放置一個物體時,我只是製作一件可用物品的副本,稍微調整一下它的統計數據,然後在世界上放下它。實際物品都是根類物品的所有子類,例如類生物,物品,裝備(延伸物品),武器(延伸裝備),裝甲(延長裝備),食物(延伸物品)等。但是我想標記他們在庫數據庫中不同,我想使用額外的標籤,如type.RARE,type.ARTIFACT,type.CURSED,所以我想要額外的標籤,除了類。

遊戲使用LIBGDX可在Android和Applet上使用。我使用免費的Rltile套裝,它有成千上萬的優質瓷磚。我將使用Pubnub或Google App Engine提供多人遊戲支持。

+0

的ArrayList - http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html – Coffee 2012-04-01 01:09:30

+0

將你的世界有一個數據庫在創作時出現的固定物品?或者當物體被需要時從空中創建物體? – sarnold 2012-04-01 01:12:42

+0

所以每個東西都有一組嵌套類型?即劍,武器,物品,裝備? – 2012-04-01 02:19:04

回答

5

我能想到的三個答案:

  1. 編寫自己的Library與自定義方法存儲在Map這幫東西。 所以你可能有一個Map<Type,List<Object>>,按 類型存儲東西的列表,然後是一個方法,它接受一個類型,從地圖中檢索列表,然後按概率選擇 (這很容易做到 - 你只需要一些概率, 生成一個介於0和總和之間的隨機數,然後遍歷列表, 從您的隨機值中減去該物品的概率,直到它爲負數 - 您 返回使其成爲負值的物品[*])。例如,您也可以先通過 級別過濾列表。

    ,如果你有不同的東西真正的組合,並且不想再這個基礎上的類型, 另一種選擇(速度較慢,但​​更靈活)是放置在列表 一切,然後你需要過濾。一個很好的方法是用番石榴 - 參見 Iterables.filterPredicatehttps://code.google.com/p/guava-libraries/。 您可以提供一個接口,它接受一個謂詞並從篩選後的剩餘內容中返回一個隨機 選擇。謂詞是容易構建 「內聯」無名類 - 看到 https://code.google.com/p/guava-libraries/wiki/FunctionalExplained#Functions_and_Predicates

  2. 例子堅持這一切都在一個數據庫中。也許我太企業化了,遊戲人們從來不會這樣做,但是在我看來,像sqlite或者 H2這樣的小型嵌入式數據庫對於這一點來說是完美的。你可以用SQL查詢來選擇東西(這個 已經是一個很長的答案,所以我不會在這裏提供更多的細節)。

  3. 改變你的設計。你所描述的不是很OO。你的東西可以實現接口,而不是類型。因此,例如,接口將具有一個方法 getMinLevel()。然後,像這樣的設計,使用ORM(休眠)的 數據庫。

你做什麼樣的雄心勃勃,我懷疑更多的是比什麼都學(沒有批評意 - 這就是我如何學習的東西,通過使事情,所以只是假設你像我一樣) 。所以選擇你感覺最舒服的地方。

[*]這假設你總是想要返回一些東西。如果概率標準化並且您希望能夠不返回任何內容,請從0-1中選擇初始值(如果使用百分比,則選擇0-100)。而且,如果您在列表中運行時沒有任何結果爲負數,則不返回任何內容。

2

最簡單的方法是將所有對象放在一個大的數組列表中,並使用重複採樣來選擇一個對象。

選擇隨機項目的過程非常簡單:

  1. 從0選擇一個隨機數達到ArrayList
  2. 的大小從圖書館獲取該索引的對象
  3. 如果該對象不符合您指定的任何標準(例如「是一種類型.WORD或type.MACE?」)返回開始
  4. 如果對象超出最小或最大級別,請返回開始
  5. 如果目標ct的稀有度小於100%,從0-100%創建一個隨機數。如果隨機數超出對象的稀有度,則循環回去開始。大多數對象應該有10-100%的稀有度,如果你想要非常普通的對象,那麼你可以將它們多次添加到庫中。

此過程將產生一個滿足標準遲早(如果存在)的對象,並且將根據稀有百分比來實現。

一個輕微的技巧是,如果沒有這樣的對象存在,它將無限循環。例如,假設17級庫中沒有武器?爲了解決這個問題,我會建議在每100次嘗試之後擴大minLevel和maxLevel,以確保最終找到一個。確保您始終擁有可用的每種類型的1級對象。

爲了安全起見,您可能還想在說100,000次嘗試之後進行救助(但請記住拋出異常 - 如果您要求圖書館中不存在的東西,這是一個問題!)。

P.S.我在多年前創建的名爲Tyrant的roguelike遊戲中實現了一個類似的圖書館系統。來源就在這裏,如果你interersted:

https://github.com/mikera/tyrant/blob/master/src/main/java/mikera/engine/Lib.java

+2

你回答我的問題Mikera很好。你的暴君遊戲多年來一直是我的靈感。這是一個用Java編寫的真棒,複雜的遊戲,我只是喜歡它。我的RPG遊戲也使用了rltile-set,但是我正在爲Android和Applet編寫,並且將會是多人遊戲,我真的不想再看你的源代碼,否則我只會偷你的代碼並且ideas.I確實希望這個遊戲是100%我自己的代碼。我注意到你最近在你的代碼庫中將這個名字改成了tyrant-old,你有任何製作暴君2的計劃嗎?那太棒了! – 2012-04-01 19:54:45

+0

很高興它對你有用!爲了記錄,我真的不介意你竊取代碼和想法 - 畢竟這是開源的精神!我很可能會在暴君2(可能會在Clojure重寫)。取決於我得到幾個免費的月份,但! – mikera 2012-04-02 02:56:07