リソースがほぼ枯渇している場合、どのように工場間でリソースを公平に分配しますか?


12

私のゲームの主なリソースはmassで、時間とともに変化する浮動小数点数として保存されます。リソースノードは質量を増やし、工場はそれを排出します。たとえば、1秒あたり5質量のリソースノードがある場合、5 * deltaT各ゲームステップで質量が増加します。質量は最も近い整数に丸められて表示され、ゲイン/損失インジケータは10分の1単位で表示されます。

ゼロヒットの質量をどのように処理すればよいですか?これにより、複数の工場が一度に構築しようとする場合に競合状態が発生します。最初にキュー内にある工場、またはより多くのリソースが入ってくるとより少ないリソースを消費する工場が優先されるため、他の工場よりも速く構築されます。

どうすれば対処できますか?ステップを完全にスキップする必要がありますか?


私のコメントは保存されませんでした。より良い説明がありました。基本的に、すべてのオブジェクトがすべてのステップにアクセスするリソースがあります。各オブジェクトは、リソースに対して追加または削除します。私の問題は、リソースが0に達した場合、何をすべきかわからないことです。ある種のキューを作成する必要がありますか?オブジェクトのステップをスキップする必要があります。何?
モブ

3
ラウンドロビン。問題が解決しました。
パトリックヒューズ

以下のRoyの回答と、それへのコメントとを組み合わせて、適切で保守が容易なラウンドロビンシステムの調整について説明します。差し迫った設計問題が解決される限り、それはすべて良い=)
パトリックヒューズ

回答:


9

Petrに同意します。それを行う方法はありません。それをどのように行うかは、ゲームをどのように設計するかによって決まります。

しかし、この状況では、取得しようとしている種類のメカニックがすぐに明らかになると思います。利用可能な質量の範囲内で、できるだけ速く物を生成したいだけです。

生産能力内で生産する

あなたは彼らと非常によく似たシステムをやっているので、最高司令官の本から一葉を取り上げるつもりです:もしあなたが能力を超えて生産しているなら、それに対処する最も近い方法は全面的に生産を遅くすることです。生産能力の低下は実際には非常に簡単です。

生産速度のメカニック

更新ステップごとに、工場は一定量を生産するだけでなく、生産速度で稼働しますで、各ステップの進捗状況と使用する質量を決定します。75%の容量で生産している場合、工場は各ステップで75%の進歩を遂げ、100%の容量と比較して75%の質量を使い果たします。

生産速度を計算するには、何かを構築する前に、工場に問い合わせて、このステップで全能力で使用される総リソースを決定する必要があります。次に、簡単な計算を実行します。

production speed = (total mass capacity / mass required this step)
if (production speed > 1.0) production speed = 1.0

フルステップで生産するにはこのステップに125の質量が必要ですが、このステップには100の質量しかないとします。この方程式は、0.8の生産速度(80%の10進数表現)を提供します。工場に実際に建物を建設するように指示するとき、この値を渡し、建物の建設速度を伝えます。そして今、生産は全面的に減速しています。

代替案

また、生産能力が解放されるまで一時的に工場の閉鎖を開始することもできます。また、非常に低い能力のときに発電機から遠く離れた工場で発生することが非常に興味深い場合があります。

複数のリソース?

これをどのように扱うかはあなた次第です。多くのオプションがあります。最も簡単な方法は、おそらく各リソースの生産能力を計算し、最も弱いリソースが残りすべてのボトルネックになるように、最も低いリソースを選択することです。


あなたの工場が作成するものはすべて一定の質量を使用するため、80%の速度で生産するように工場に伝える必要さえないと思います。たとえば、100マスのタンクを構築すると、通常、工場はサイクルごとに2マスを使用できます。これは、タンクを完了するのに50サイクルかかり、各サイクルでタンクの現在の質量に2を加えることを意味します。現在、利用可能な質量は1つのみです。これは、このサイクルを意味します。現在使用されているタンクの質量は2ではなく1増加します。各サイクルの後に、
トーマス

使用可能な質量が0の場合、タンクに質量を追加しないでください。この方法で何かを構築するのにかかる時間は、大衆の収入によって異なります。2つの質量/サイクルと3つの収入しか使用できない工場が2つある場合、タンク1は50サイクル、タンク2は100で構築されます。別の方法は、使用可能な質量の合計量を使用するすべての工場で分割することです(積極的に何かを構築する)。工場で使用できる質量の合計は、工場にレベルを追加することでアップグレードできます。たとえば、レベル1では2マス、レベル2では3マスなどを費やすことができます
トーマス

@Thomas作成中に製品に質量を追加することは、製品の一部を完成させることに比べて、非常に複雑な方法のようです。特に、工場は単純な「生産率」プロパティではなく、リソースシステムについてすべてを知っている必要があるためです。プレーヤーへの結果が同じである場合は、実装をできるだけシンプルにしてください。また、リソースを追加/削除するときなど、将来の変更を容易にします。
ハックワース

@Hackworth私は反対する傾向があり、工場は資源システムについて知る必要はありません。工場は、それが何であるか、そしてどれだけ遠くにあるかを知っています。リソースシステムは、工場にXの量をビルドに追加するよう指示するだけです。この方法では、この工場のリソース収入の割合を計算する必要がなく、リソース収入を完了率に追加する必要がありません。
トーマス

6

私はジョナサン・ホッブスの答えが好きですが、キューシステムはもっとシンプルだと思います:

Queue<Factory> queue = ...;
int numFactories = ...;

Update()
{
    int resources = GetAllResourcesForThisStep();
    for(int i = 0; i < numFactories; i++)
    {
        if(queue.Peak().RequiredResources <= resources)
        {
            Factory f = queue.Pop();
            resources -= f.RequiredResources;
            queue.Push(f);
        }
        else
        {
            break;
        }
    }
}

これはおそらく、ジョナサンの実装と同じように平均して機能します。ただし、作業速度が非常に低く設定されている場合、Jonathanのソリューションでは問題が発生する可能性があります。


+1質問のように、デュアルリソースを使用してゲームを開発しています。サプライロックの問題を解決するには、これに似たものを使用する予定です。その正確なコードではなく、その背後にあるアイデア。1つのティックでリソースを使用できる消費者は、次のティック中に低い優先度を取得します。また、このコンシューマの優先度が高いかどうかを示すフラグを追加し、そのフラグの制御をユーザーに与える予定です。
ジョンマクドナルド

優先順位を個別に指定する場合は、飢starに注意してください。:)
ロイT.

ただし、個別の優先順位を持つ飢Starが目的です。入植者4や騎士と商人をプレイしたことがありますか?建物を過剰に建設すると、限られたリソースがランダムな建物に行き、何かを完了するのに永遠に時間がかかります。しかし、建物が重要かどうかを選択することもできます。その場合、リソースは最初に重要な建物に送られます。重要なのは、決して過度に構築しないことです。そうする場合は、できる限り少なく構築します。
ジョンマクドナルド

5

私は自分のゲームで同様の供給システムを開発しているので、供給ロックの問題を解決する方法と、偏見も考えています。問題を説明するために、簡単な例を作成します。

リストがある場合:[producer1、consumer1、consumer2、consumer3]、supplier = 0から順番に更新すると、次のようになります。

producer1 produces 5 mass. You now have 5 mass
consumer1 wants 3 mass. Success, you now have 2 mass
consumer2 wants 3 mass. Fail
consumer3 wants 3 mass. Fail
[next tick]
producer1 produces 5 mass. You now have 7 mass
consumer1 wants 3 mass. Success, you now have 4 mass
consumer2 wants 3 mass. Success, you now have 1 mass
consumer3 wants 3 mass. Fail
etc...

消費者1はすべての楽しみを享受し、消費者2と3は消費者1が満足するまで飢えます。ゲームによっては、これは望ましくない場合があります。私のゲームでは知っていますが、そうではありません。それに近づいたら、1つのティックで供給された消費者が次のティックのためにキューの後ろに移動するキューを作成します。上記の例は次のようになります。

producer1 produces 5 mass. You now have 5 mass
consumer1 wants 3 mass. Success, you now have 2 mass. <-- Move to end of queue
consumer2 wants 3 mass. Fail
consumer3 wants 3 mass. Fail
[next tick]
producer1 produces 5 mass. You now have 7 mass
consumer2 wants 3 mass. Success, you now have 4 mass  <-- Note the order change
consumer3 wants 3 mass. Success, you now have 1 mass
consumer1 wants 3 mass. Fail
etc...

このようにして、誰もがリソースの公平な分配を得ます。

また、ユーザーがリソースの優先度を持つ特定の構造を選択できるように、優先度キューとして使用される追加のキューを実装する予定です。優先キューは常に標準キューの前に提供されます。すべてのプロデューサーが最初に更新され、次にすべてのリソースが消費されることを確認してください。そうしないと、ティックの途中でリソースを生成し、一部のコンシューマーがすでに飢already状態になっているときにキューが壊れます。

要約すると、プロデューサー、次に優先度キューを更新し、フィードコンシューマを優先度キューの最後に移動し、次に標準キューを更新して、フィードコンシューマを標準キューの最後に移動します。


限界に達すると、すべての消費者が終了するまで消費者が終了しないことを意味します。現実的な生産チェーンのシナリオでは、それは非常にまれであり、誰かが大規模な軍隊のためにビルドキューを持ちたいと思った場合、非常に悲惨なものになる可能性があります。彼は軍隊が建設されている間ずっと実質的に軍隊を欠くでしょう。
カーディン

その答えは、質問を読んだときの私の最初の考えでした。また、ティックごとに消費される質量は、必ずしも完全なユニットを作成するための質量ではなく、必要な時間にわたるユニットコストであることに注意する必要があります。したがって、@ Cardinの懸念が有効かどうかはわかりません。ティックごとのコストは、総収集率に非常に近いです。プレイヤーが明示的に管理する優先順位キューがあれば、彼は誰が飢えているかを判断できます。
ブライス

@Cardin、あなたは非常に正しいですが、ゲームメカニックとしても使用できます。開拓者4、騎士と商人、全滅、最高司令官は、私が知っているゲームです。秘Theは、この供給ロックに到達しないことです。到達した場合は、できるだけ早く供給ロックから抜け出してください。優先キューを追加すると、人々はより簡単に抜け出すことができます。
ジョンマクドナルド

3

これについては、チャットで少し説明したので、Johnのアイデアを詳しく説明します

編集:このソリューションは、実際には、consumableAmountがファクトリがリソースのバッチを取得する頻度に関連する場合にのみ推奨されます。すべて同じ場合、実際にキューを使用できます。

私の解決策:優先キューにリストされているすべての工場。工場が飢fromに苦しんでいるので、優先度は高くなります。工場がリソースを消費すると、飢Star、優先度はゼロに設定されます。最優先事項は常にリソースの次のバッチを取得することです。

ある種の擬似コードで、どのファクトリがどのリソースを取得するかを決定するには:

iterator i = factoryqueue.start()
bool starvation = false
while(i.next())
  if(i.ready)
    if (!starvation) 
      if (i.consumeAmount < resource.count) starvation = true
      else 
        i.consume(resource)
        i.priority = 0
    if (starvation)
      i.priority += 1

このように、工場は順番に1つの製品を作成します。消費量を考慮して調整し、安価な製品をより頻繁に製造する場合は、たとえば、優先度を1 / consumeAmount増やします。


私はこれを賛成したいと思いますが、これが何をするのか分かりません-それは飢starを追跡しますが、そうでなければ(おそらく)キューを通常どおり正確に回転し、飢vと優先度の両方が表示されることはありません何をするにも。
-doppelgreener

優先順位を+ = 1 / amountThisFactoryConsumesだけ増やすと、違いが明らかになります。製品を作成するためにより多くのリソースを必要とするものは少し遅れ、安価なものが比例してより多くのリソースを使用できるようになります。これにより、工場あたりのリソースが均等になります。ただし、リソースが工場で消費されるたびに飢v番号がマジック番号0に設定されるため、これはまだ完全に確実なわけではありません。そのため、リソースの更新が途切れるときに正確に均等に分散されるように隔離されることはありません。
トニ

実際、私はそれが実際に保証されていないかどうかはよくわかりません。いくつかのグラフを描いて、テストする必要があります。
トニ

ああ、優先度は優先度キュー自体の品質です。構築方法をわざわざ説明するつもりはありません。優先度キュー自体は、常にそのメンバーの優先度値に従ってソートされます。
トニ

+1優先キューであることを理解し、その動作は単純になりました。キューをふるいにかけ、リソースを消費する可能性がある最も早いものを選択します。容量が大きく分割されている場合(このティックには1,000個のリソースがありますが、100個の100のリソースビルドがある場合)、これは問題になりません。この目盛りのリソースを十分に上回っていても、最終的には少しの進歩を遂げるのに十分な節約になる可能性があります。私はこれが大好きです。:)
doppelgreener

2

奇妙な質問。

私の問題は、リソースが0に達した場合、何をすべきかわからないことです。ある種のキューを作成する必要がありますか?オブジェクトのステップをスキップする必要があります。何?

あなたが何をする必要があるか、ゲームロジックに依存しますが、作成します。キューを実行できますが、スキップできます。ゲームの動作方法に依存します。あなたの質問に間違いがあれば、私を修正してください。


1

すべての構造について、ティックごとの合計リソース需要の数を保持できます。1つのリソースストレージがこの必要量より少ない場合、少なくとも1ティックの生産をサポートするのに十分なストレージが収集されるまで、すべての構築が完全に停止します。その後、生産を再開できます。

したがって、生産率を浮動小数点数として保存する代わりに、バイナリである-あなたの工場はフルスピードで生産するか、生産しないかのどちらかです。

そうは言っても、このアプローチはジョナサンの答えと本質的に同じです。生産率の特別なケース0.0と1.0-0.0 、しかしロジックはもう少しシンプルにすべきです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.