5

小さなゲームを開発しているので、多くの進歩を遂げましたが、多くのことに不満を感じています。最新のことは、私が作成したものと同様creating a list of required itemsに両方を提供することを理解することでしたが、明らかに機能しません...ExplanationCode

I - 説明

プレイヤーが建物を建てるには、各研究でいくつかの必要な研究を行っている必要があります。それを研究するには、さらに多くの研究が必要です..いくつかのタスク...

より正確に想像するために、ここで私の小さなコードを見ることができます

II - コード

    //Available Main Elements
    var carbon = new Element {Name = "Carbon"};
    var hydrogen = new Element {Name = "Hydrogen"};
    var oxygen = new Element {Name = "Oxygen"};
    var nitrogen = new Element {Name = "Nitrogen"};

        //Example Research
var steam = new Research(name : "Steam", requiredElements: null, requiredResearches: /*Fire*/ & /*Water*/ & /*Iron*/);

したがって、コードの最後のスニペットから[説明するだけです]プレーヤーはSteam、たとえば、研究するためにさらに3つの研究が必要な研究をしたいと考えています...そのうちの1つは、研究するためにさらに1つのthe Iron研究が必要です.少ないかもしれないし多いかもしれないし、全く要件がないかもしれない]...

質問の結論は次のとおりです。プレーヤーが研究を行おうとすると、システムが彼が行った研究と彼がやりたい研究を[ネストされたものを含めて]すばやく調べるように、そのようなネストを作成するにはどうすればよいですか?要件を満たしていない場合、彼が達成したいことを含むツリーを返すだけですか?

結局のところ、前もって感謝したいと思います。あなたの非常に貴重なサポートを待っています...

4

7 に答える 7

1

これが起こらないようにする具体的なことは考えられませんが、ケースを考えずにコーディングに飛び込むのをためらう理由はわかります. いくつかの指針を示すために、最後にあなたが持っていると私が想像するいくつかの機能を次に示します。

// Having a function to retrieve a unique variable by its name (backed by a Dictionary<string, Research>)
// is often handy for me, especially if you decide to script the requirements tree in a text file.
// If you have enough references passed around that you can do this without a static method, all
// the better.
Research.getResearchByName(string name)

// A recursive function. If this research has not been completed, it adds itself to the set, as well
// as any prerequisites (by calling this function on its prerequisites). The top-level, public
// version of this function would create the set, and then return it after performing this check. If
// the Set is empty, then the player can start the research.
Research.addUnresearched_Internal(Set<Research> unresearched)

ここでの私のアプローチの主な問題は、ツリーではなくセットのみを使用することを考えていたことです。しかし、少しのバリエーションがあれば、あなたは私よりもうまくやれるかもしれません.

于 2013-07-12T20:16:05.083 に答える
1

次のようなことをしたいようです:

public class Research
{
    private Collection<Research> prerequisites 
    public Collection<Research> Prerequisites 
    {
        get { return this.prerequisistes; }
    }

    public bool IsComplete { get; set; }

    public IEnumerable<Research> RequiredResearch()
    {
        if (this.IsComplete)
        {
            return new Research[0];
        } 
        else 
        {
            return new[] { this }.Concat(
                this.Prerequisites.SelectMany(r => r.RequiredResearch()));
        }
    }
}

マルチプレイヤーを作成している場合は、次のようにする必要があります。

public class Player
{
    private Collection<Research> completedResearch
    public Collection<Research> CompletedResearch
    {
        get { return this.completedResearch; }
    }
}

public class Research
{
    private Collection<Research> prerequisites 
    public Collection<Research> Prerequisites 
    {
        get { return this.prerequisistes; }
    }

    public IEnumerable<Research> RequiredResearch(Player player)
    {
        if (player.CompletedResearch.Contains(this))
        {
            return new Research[0];
        } 
        else 
        {
            return new[] { this }.Concat(
                this.Prerequisites.SelectMany(r => r.RequiredResearch(player)));
        }
    }
}

これらのメソッドは両方とも、現在の研究が完了していない場合 (前提条件ではなく)、現在の研究を返します。ただし、結果に対して単に a.Skip(1)を実行して、現在の結果を無視することもできます。

于 2013-07-12T20:16:40.187 に答える
1

1 つの可能性はbool completedElementandResearchクラスに追加することです。completed == false次に、サブリサーチのいずれかをチェックする関数を作成できます。

bool CanCompleteResearch(Research r)
{
    for (Research sub in r.requiredResearches)
    {
        // No need to recursively check 'sub'; in order for 'sub' to be marked as
        // completed, its sub-researches must've been already completed.            
        if (!sub.completed)
            return false;
    }
    return true;
}

LINQ でできるワンライナー トリックがあると確信しています。

編集:これは、研究ツリーが一度に複数の場所で使用されていない場合にのみ機能します (つまり、研究オブジェクトが複数のプレイヤー インスタンスで共有されている場合)。

編集 2:不足しているすべての研究を把握するために、単純な再帰関数を使用できます。

void ListMissingResearch(Research r)
{
    for (Research sub in r.requiredResearches)
    {
        if (!sub.completed)
        {
            // print message saying "Research <r> requires research <sub>"
            ListMissingResearch(sub); // list any missing sub-sub-research
        }
    }
}
于 2013-07-12T20:09:27.820 に答える
1

独自のクラスを作成することをお勧めしますrequirementsTree。これは、少なくとも次のメンバーを持つリンク リストである必要があります。

  • requirementsTree[] prerequisiteResearchその特定のアイテムに必要なすべての研究を含むプロパティ。
  • bool isResearchedプレイヤーが実際にアイテムを研究したかどうかを示すプロパティ。
  • メソッド、たとえば、bool isEligibleToResearch()のすべてのアイテムをループしてprerequisiteResearch、プレーヤーが既にそれらを研究しているかどうかを確認します。

これにより、適切に構造化された拡張可能な要件クラスが得られると思います。

于 2013-07-12T20:09:35.923 に答える
1

私はC#コードを提供するのに十分な知識はありませんが、実際の を作成できるようにするために実行する必要があるを保持するそれぞれにof 型をResearch持たせることができます。その後、それらのすべてが完了しました。 ArrayResearchResearchResearchArray

要件の要件を確認する必要さえありません。要件が完了しているかのように、すべての要件が既に完了しています。

Research要件がない場合は、Array空のままにします。

于 2013-07-12T20:07:39.310 に答える