使用电报的文本游戏中的时间任务系统

Quests system with time in a text game using telegram

您好,我正在尝试使用 C# api 在 Telegram 中制作基于文本的游戏。 我有一个包含以下内容的数据库: 玩家(玩家 ID、用户名、生命值、金钱、任务 ID、任务持续时间)。

MissionID 和 missionDuration 可以为 NULL。

任务(任务ID,描述)。

当玩家向机器人发送命令“/mission”时,系统会为玩家分配一个随机任务,并生成一个随机持续时间数字。

如何查看任务是否结束?

我制作了这段代码来检查持续时间是否结束:

    public static bool Check(double duration)
    {
        DateTime now = DateTime.Now;
        DateTime end = DateTime.Now;

        end = end.AddSeconds(duration);

        while (now < end)
        {
            now = DateTime.Now;
        }

        return true;
    }

当然这是错误的,因为总是使用 cpu。 有没有一种方法可以更好地检查时间是否已经过去?

通常情况下,您在这种情况下要做的是创建一个计时器,该计时器将在给定的持续时间后到期。当计时器到期时,回调将设置一个事件,指示间隔已结束。这是一种方法:

using System.Threading;
static private Timer questTimer;
static private ManualResetEvent questExpired = new ManualResetEvent(false);

// in your code where you start the quest

// clears the event to show that the quest has not ended
questExpired.Reset();

// start the timer.
questTimer = new Timer(QuestEndedCallback, null, TimeSpan.FromSeconds(duration), TimeSpan.FromMilliseconds(-1));

这将创建一个立即启动的计时器。 duration 毫秒后,计时器将过期并调用 QuestEndedCallback 方法。 TimeSpan.FromMilliseconds(-1) 表示它是一个 "one-shot" 计时器:它会滴答一次然后退出。

QuestEndedCallback是:

static void QuestEndedCallback(object state)
{
    // Set the timer to indicate that the quest has ended.
    questExpired.Set();
}

在执行处理的代码中,每当您想查看任务是否已结束时,检查事件:

bool questHasEnded = questExpired.WaitOne(0);