12
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ソシャゲなどで使うスタミナ算出ロジック

Last updated at Posted at 2016-07-14

はじめに

一定時間でスタミナが回復するロジックが検索しても見つからなかったので作ってみました(また探し方が悪い気もするのですが・・・)
公開するほどのロジックでもない気もしますが、車輪の再発明は面倒なのでー
まぁ、そろそろスタミナ消費系のゲームは減少傾向にあるらしいので、公開する意味合いは薄れますが、勉強中な方など必要な時にどうぞ
他にも色々なロジックがあるでしょうが、あくまで一例です。

軽く解説

原理としては単純で、記録しているスタミナ(stamina)の値に、スタミナ最終更新日時(stamina_modified)と現在の差分から計算した値から計算した値を加えます
ですので、スタミナを減らす時にスタミナ最終更新日時を更新する必要があります
(自動回復以外でスタミナを増やす場合は更新不要)

ソースコード

スタミナはユーザーに自身が保持する情報なのでUserクラスとしています
キャラ毎とかにある場合は適宜読み替えてください。
前提として、スタミナとスタミナ最終更新日時はDBに保存されており、DBから取得直後の状態でプライベートなプロパティに入っています

class User
{
    const STAMINA_AUTO_RECOVERY_MAX = 20; // スタミナ自動回復最大値
    const STAMINA_RECOVERY_SECOND = 300; // スタミナ自動回復

    public $stamina; // スタミナ
    public $stamina_modified; // スタミナ最終更新日時

    /**
     * 現在のスタミナを取得する
     * @return int 現在のスタミナ値
     */
    public function getStamina()
    {
        // 自動回復する最大値以上の場合はそのまま返す
        if (self::STAMINA_AUTO_RECOVERY_MAX <= $this->stamina) {
            return $this->stamina;
        }

        // 最終スタミナ更新時の経過秒
        $elapse = time() - strtotime($this->stamina_modified);

        // 経過時間から回復値を算出
        $this->stamina += floor($elapse / self::STAMINA_RECOVERY_SECOND);

        // 回復する上限は自動回復最大値まで
        $this->stamina = min($this->stamina, self::STAMINA_AUTO_RECOVERY_MAX);

        // 自動回復したのでスタミナ最終更新日時を更新
        $this->stamina_modified = date('Y-m-d H:i:s');

        // 最大まで更新した場合は再計算しないようにDBを書き換える
        // 注)自動回復最大値を途中で減らした場合に問題が出るので
        //    その点を懸念する場合やDBサーバが貧弱な場合は以下ロジックは不要
        if ($this->stamina == self::STAMINA_AUTO_RECOVERY_MAX) {
            // @todo: saveメソッド
        }

        return $this->stamina;
    }

    /**
     * スタミナ使用
     * @param int $use 使用するスタミナ値
     * @return void
     */
    public function useStamina($use)
    {
        // スタミナ減算
        $this->stamina = $this->getStamina() - $use;

        // スタミナ不足の場合
        if ($this->stamina < 0) {
            throw new Exception('スタミナがないよ');
        }

        // スタミナ最終更新日時を現在に更新
        if (0 < $use) {
            $this->stamina_modified = date('Y-m-d H:i:s');
        }

        // @todo: saveメソッド
    }
}
12
11
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?