2

このディクショナリを使用して、ゲーム内のいくつかのリソースを追跡する小さな c# ブラウザ ゲームに取り組んでいます。

public Dictionary <String, int> resource = new Dictionary<string,int>();

その中でも、目盛りごとに変化する「金」。

protected void timerMinute_Tick(object sender, EventArgs e)
{
resource["gold"] += (resProduction["gold"] - resConsumption["gold"])
}

現在、消費が生産よりも多い場合、数は減少します。リソースがマイナスになるのを否定したい。私はティックごとにこれを行うことができることを知っています:

if (resource["gold"] < 0)
{
resource["gold"] = 0;
}

ただし、追跡するリソースは他にもたくさんあるので、それぞれについて前述のコードを書くことはできましたが、誰かが辞書リソースのすべての値をチェックし、マイナスをゼロにする賢い方法を持っているかどうか疑問に思いました.

編集: ここの問題に対するすべての素晴らしい提案をありがとう! C# の初心者として、私はすべてに精通しているわけではありません ^^

4

5 に答える 5

1

次のように、負の値をまったく許可しないTValuelikeを使用できます。uint

Dictionary<string, uint>

ただし、小さなものから大きなものを減算すると、減算が「ラップアラウンド」することに注意してくださいuint。ですので、引くときは注意が必要です!uint結局、使いにくいかもしれませんが、値が負でないことを保証します。

于 2013-10-25T21:03:13.750 に答える
0

現在のデザインを一行変えてみませんか?

これを行うにはもっと難しい方法がたくさんありますが、私が見ることができる最も簡単な方法は、現在の方法を次のように変更することです..

protected void timerMinute_Tick(object sender, EventArgs e)
{
    resource["gold"] = Math.Max(0, (resource["gold"] + resProduction["gold"] - resConsumption["gold"]));
}

編集:各リソースタイプをループしますか?

protected void timerMinute_Tick(object sender, EventArgs e)
{
    foreach (var resourceName in resource.Keys)
    {
        resource[resourceName] = Math.Max(0, (resource[resourceName] + resProduction[resourceName] - resConsumption[resourceName]));
    }
}
于 2013-10-25T19:43:33.077 に答える
0

操作をカプセル化し、必要なものだけを公開します。ポイントは、契約のみが公開されていることです。(私はまた、一般的にローカライズされたコントラクトを使用することを好みます。そのため、直接実装することはお勧めしませんIDictionary。サービスが非常に貧弱になります。)

カプセル化を使用して Dictionary を非表示にします。

class Ticker {
   Dictionary<string, int> dict = ..;

   // I don't actually know what contract you need
   public Decay(string symbol, int value) {
      // Handle all logic uniformly here such as checking to make sure it can't
      // go negative.
   }
}

それで:

resourceStash.Decay("gold", fortKnox);

または、カプセル化を使用して値を非表示にします。

つまり、Dictionary<symbol, ResourceValue>(ここResourceValueでも特別であり、必要なロジックをカプセル化します) にします。

それで:

resources["gold"].LessenLoad(nuggetCount);

(または、-演算子をオーバーロードして、ResourceValueより整数のように動作させることもできます)。

于 2013-10-25T19:35:57.973 に答える