使用电报的文本游戏中的时间任务系统
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);
您好,我正在尝试使用 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);