0

最近、PHPでプログラミングを始めました。演習では、独自のPHPテキスト戦略ゲームを作成したいと思います。1つの技術的側面にはいくつかの考慮が必要です。

私のゲームでは、すべてのプレイヤーが鉄や穀物などのリソースを獲得する能力を持っている必要があります。これらのリソースを使用して、プレイヤーは兵士を募集したり、建物を建てたりすることができます。リソースは一種の倉庫に保管されます。

リソースは一定期間で獲得されます。たとえば、1時間に100粒の穀物を入手し、その穀物は倉庫に保管されます。これは、0.6分ごとに1つの穀物を追加する必要があることを意味します。私はcronジョブを探していましたが、システムリソースが多すぎるため、これは私の問題に対する最善の答えではありません。問題は、ウェアハウス内のリソースを毎分更新できるようにしたいということです。誰かが私の問題について考えを持っていますか?

4

4 に答える 4

2

状態を更新してこれを解決しようとするのではなく、関数型プログラミングの方法で解決しようとすることを検討できます。たとえば、既知の条件(生産が開始されたときなど)が与えられた場合に、リソースの量を計算できる関数を記述します。非常に単純化:

状態ベースのモデル:

class Gold {
  public $amount = 0;
}

class GoldDigger {
  public $amount_per_second = 1;
}

$player_gold = new Gold();
$player_worker = new GoldDigger();
while (true) {
  $player_gold->amount += $player_worker->amount_per_second;
  sleep(1);
  echo "Player has {$player_gold->amount} gold pieces\n";
}

機能ベースのモデル:

class Gold {
  public $workers = array();
  function getAmount() {
    $total = 0;
    foreach ($this->workers as $worker) {
      $total += $worker->getAmount();
    }
    return $total;
  }
}

class GoldDigger {
  public $amount_per_second = 1;
  public $started = 0;
  function __construct() {
    $this->started = time();
  }
  function getAmount() {
    return $this->amount_per_second * (time() - $this->started);
  }
}

$player_gold = new Gold();
$player_gold->workers[] = new GoldDigger();

while (true) {
  sleep(1);
  echo "Player has {$player_gold->getAmount()} gold pieces\n";
}

これらの例はどちらも少し工夫されています。データベースなどにデータを保存する可能性があり、問題が少し複雑になりますが、2つの戦略の違いを示していると思います。

于 2013-01-30T13:18:57.570 に答える
1

これにはおそらくデーモンを使用する必要があります。ギアマンを調べてください。

于 2013-01-30T12:52:11.443 に答える
1

ユーザー(または他の何か)がリソースを要求したときに、リソースを更新できます。プレーヤーが特定の時間間隔で取得するリソースの量を計算できる場合は、後でそれらを追加するだけです。最終更新の時刻のみを保存する必要があります。

例:

プレーヤーは01:00に倉庫を見て、そこで50粒を見つけ、現在の収入は1時間あたり100粒です。それで彼は就寝し、翌朝09:00(8時間後)に再び倉庫をチェックしました。今、彼は50グレイン+8時間*1時間あたり100グレイン=850グレインを見ることができます。

しかし、サーバー上のデータは次のようになりました。

  • 01:01:「50グレイン、最終更新日01:00」
  • 05:00:「50グレイン、最終更新は01:00」
  • 08:59:「50グレイン、最終更新日01:00」
  • 09:01:「850グレイン、最終更新は09:00」
于 2013-01-30T13:04:04.463 に答える
0

キャッシュで遊ぶことはできますが、頻繁に(多くのプレーヤーがいる場合)更新すると問題が発生する可能性があります。サーバー上のリソースを消費する代わりに、値が最後に要求されたときのタイムスタンプを保存して、プレーヤーが今から生成した「グレイン」の数(LastAccessedTimestamp-NowTimestamp)=経過した時間(例:5分)

5分*60秒=300秒経過

300秒/0.6秒=5分で500グレイン

または、クライアント側のJavaScriptで、ウェアハウスにXグレインがあることをプレーヤーに表示させ、クライアント側でのみ更新することができます。1分または3分ごとにajaxリクエストを送信して、ユーザーアクティビティがない場合は同期するか、毎回更新します。ユーザーがアクションなどを送信します。

于 2013-01-30T13:02:37.477 に答える