Ежедневный бонус

Что делает функция

Игрок получает награду раз в сутки при первом входе. Можно начислять валюту, опыт или предмет. Если игрок не зашел — серия сбрасывается.

Добавляем таблицу в базу

CREATE TABLE daily_bonus (
  user_id INT PRIMARY KEY,
  last_claim DATE,
  streak INT DEFAULT 0
);

Код

class DailyBonus {
    private $db;
    private $userId;

    public function __construct(PDO $db, int $userId) {
        $this->db = $db;
        $this->userId = $userId;
    }

    public function claim(): int {
        $today = date('Y-m-d');

        $stmt = $this->db->prepare("SELECT * FROM daily_bonus WHERE user_id = :user_id");
        $stmt->execute(['user_id' => $this->userId]);
        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        if (!$row) {
            $stmt = $this->db->prepare("INSERT INTO daily_bonus (user_id, last_claim, streak) VALUES (:user_id, :today, 1)");
            $stmt->execute(['user_id' => $this->userId, 'today' => $today]);
            $bonus = 100;
        } else {
            if ($row['last_claim'] < $today) {
                $streak = ($row['last_claim'] == date('Y-m-d', strtotime('-1 day'))) ? $row['streak'] + 1 : 1;
                $stmt = $this->db->prepare("UPDATE daily_bonus SET last_claim=:today, streak=:streak WHERE user_id=:user_id");
                $stmt->execute(['today' => $today, 'streak' => $streak, 'user_id' => $this->userId]);
                $bonus = 100 * $streak;
            } else {
                $bonus = 0;
            }
        }

        if ($bonus > 0) {
            $stmt = $this->db->prepare("UPDATE users SET gold = gold + :bonus WHERE id = :user_id");
            $stmt->execute(['bonus' => $bonus, 'user_id' => $this->userId]);
        }

        return $bonus;
    }
}

Идеи для развития

  • добавить визуальную шкалу прогресса;
  • ввести редкие награды на 7-й день;
  • сохранять статистику пропусков.

Механика простая, но живая: игроки любят, когда игра что-то дарит просто за возвращение.

Использование

require 'DailyBonus.php';
$bonusSystem = new DailyBonus($pdo, $_SESSION['user_id']);
$bonus = $bonusSystem->claim();
if ($bonus > 0) echo "Ты получил $bonus золота за вход!";

php7