2012-04-01 11 views
7

私はJavaでRPGダンジョンゲームを構築しています。私はデータ構造の作成に専念しています。RPG Gameアイテムを格納するための良いJavaデータ構造は何ですか?

ダンジョンにデータをコピーするためにコピーできるオブジェクトがたくさんあります。例えば、パンのThingオブジェクトと、剣Thingオブジェクト、チェーンメールのThingオブジェクト、モンスターのThing(s)などがあります。これらを中央のライブラリに保存してから、特定のオブジェクトを取得することができますクエリ。だから、さびた剣が1のminLevel、3のmaxLevel、希少性(3%)のprobability、および[type.SWORD,type.WEAPON,type.ITEM,TYPE.EQUIP]を持っているでしょう

int minLevel 
int maxLevel 
double probability 
int[] types 

:私は、次のフィールドを使用してそれらを保存したいです。より良い剣は、minLevel 2、maxLevel 10、希少度(1%)である。

次に、ライブラリーからランダムtype.SWORDを取得し、私はレベル3にいると言いたいと思います。確率が高いほど、より良い剣よりも錆びた剣を取得する必要があります。私がレベル10を要求している図書館からtype.SWORDを取得した場合、私はより良い剣だけを返すでしょう。

これは意味があると思います。

EDIT 初期化段階で、すべての基本オブジェクトが作成されます。利用可能な武器、装甲、食糧、ポーション、ワンド、ゲームにユニークなグラフィックタイルを持つすべての基本的な可能なものがあります。そして、オブジェクトをどこかに配置したいときは、利用可能なもののコピーを作成し、統計情報を少し調整し、それを世界に打ち込みます。実際のアイテムはすべて、クラスCreature、Item、Equip(extends Item)、Weapon(extends Equip)、Armor(extends Equip)、Food(extends Item)などのルートThingクラスのサブクラスです。それらはライブラリデータベースでは異なるので、type.RARE、type.ARTIFACT、type.CURSEDなどの余分なタグを使用したいので、クラスの他に余分なタグが必要です。

ゲームでは、Androidおよびアプレットとして利用できるLIBGDXを使用します。私は何千もの良いタイルを持っている無料のRltileセットを使用します。私はPubnubまたはGoogle App Engineを使用してマルチプレーヤーのサポートを提供します。私は3つの答えを考えることができ

+0

のArrayList - http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html – Coffee

+0

あなたの世界では、データベースを持っています作成時に存在する固定オブジェクトの数それとも、必要なときにオブジェクトから作成されたオブジェクトですか? – sarnold

+0

それぞれにはネストされた型のセットがありますか?すなわち、剣、武器、アイテム、装備? –

答えて

5

  1. は、カスタムメソッドを持つMap秒でこれらの事を格納する独自のLibraryを書きます。 の種類のリストを格納した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. で例を参照してください。おそらく私もenterprisey、ゲームの人々は 決してこれを行うことはありませんが、それはsqliteまたは H2のような小型の埋め込まれたデータベースは、これには完璧だろう。 SQLクエリーを使用して項目を選択することができます(この はすでに長い回答ですので、ここで詳しく説明しません)。

  3. デザインを変更してください。あなたが描いていることはあまりOOではありません。タイプを持たずに、あなたの物がインターフェイスを実装できるようになりました。例えば、Weaponインターフェイスは getMinLevel()メソッドを持ちます。このような設計では、ORM(休止状態)の データベースを使用します。何をやっている

は野心的なの一種であり、私は何よりも学習についての詳細である疑いがある(意図なし批判 - これは私がちょうどあなたが私のようなものと仮定して、物事を行うことにより、ものを学ぶ方法です) 。あなたが最も快適に感じるものを選んでください。

[*]これは常に何かを返すことを前提としています。確率が正規化され、何も返さないようにするには、0-1(またはパーセントを使用する場合は0-100)の初期値を選択します。リストを実行しても何も値が負にならない場合は何も返しません。

2

最も簡単なアプローチは、すべてのオブジェクトを単一の大規模なarraylistに配置し、反復サンプリングを使用してオブジェクトを選択することです。

ランダムな項目を選択するための手順は非常に簡単です:

  1. ArrayListの
  2. のサイズまで0から乱数を選択した場合は、ライブラリ
  3. からそのインデックスのオブジェクトを取得します。オブジェクトが指定した基準を満たしていない場合(例:「タイプはW.SWORDかtype.MACEですか?」)開始に戻る
  4. オブジェクトが最小値または最大レベルを超えている場合は、先頭に戻る
  5. obje ctは100%未満の希少性を持ち、0〜100%の乱数を生成します。乱数がオブジェクトの希少性を超える場合は、ループバックして開始します。ほとんどのオブジェクトは、非常に一般的なオブジェクトが必要な場合は10-100%の希少性があります。ライブラリに複数回追加できます。

この手順では、基準が満たされている場合はそれより早く(またはそれ以降)基準を満たし、希少度に従ってオブジェクトを生成します。

ちょっとしたトリックは、そのようなオブジェクトが存在しない場合、無限ループすることです。 17階の図書館に武器がないとします。これを回避するために、私は100回の試行ごとにminLevelとmaxLevelを広げて、最終的に1つが見つかるようにすることを提案します。各タイプのレベル1オブジェクトが常に利用可能であることを確認してください。

安全のために、100,000回の試行後に救済措置が必要な場合もあります(ただし、例外を投げることを忘れないでください。ライブラリに存在しないものを求めている場合は問題です)。

P.S.私は何年も前に作った、Tyrantと呼ばれるローグライクなゲームで、同様のライブラリシステムを実装しました。あなたがintererstedされている場合、ソースはここにある:

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

+2

私の質問Mikeraに答えたことは素晴らしいことです。あなたのタイラントのゲームは長年にわたり私のインスピレーションでした。それはJavaで書かれた素晴らしい、複雑なゲームです、私はそれを大好きです。私のRPGゲームもrltile-setを使っていますが、AndroidとAppletのために作成されていて、マルチプレイヤーになります。私は本当にあなたのソースコードを見ないようにしています。アイデア。私はこのゲームを自分のコードの100%にしたい。私はあなたが最近あなたのコードリポジトリの暴君に変わったことに気付きました。あなたは暴君2を作る計画はありますか?それはとても素晴らしいだろう! –

+0

それはあなたに便利だったことをうれしい!記録のために、私は実際にあなたがコードとアイディアを盗むのを気にしません。それは結局オープンソースの精神です!スリランカの可能性があります。私はTyrant 2に行ってもいいかもしれません(Clojureで書き直すこともできます)。しかし、私に依存して無料のカップルのカップルのカップル! – mikera

関連する問題