如何在多人国际象棋游戏中实现计时器? Asp.NET 核心
How to implement timer in a multiplayerchess game? Asp .NET Core
这是我目前拥有的:一个单例 class GameManager
,主要由一个 ConcurrentDictionary
组成,其中包含所有正在进行的游戏(将游戏板和两个玩家的缺口绑定到游戏 ID)。我还有一个 SignalR 集线器,GameHub
,其方法 MakeAMove(ulong gameId, Move move)
从字典中检索相关的 gameId
游戏,lock
s 在其上,检查调用的玩家是否该方法是现在应该采取行动的玩家,如果是,则对游戏的棋盘进行适当的更改,将此行动广播给该游戏的所有观察者,并在必要时结束游戏,宣布这是玩家的胜利X 或平局并将其从字典中删除。
我没有的是计时器。我认为计时器是必要的,因为如果没有它,许多游戏可能永远不会结束并永远徘徊在这个字典中。计时器的工作方式应该是,如果玩家未能在分配的时间内采取行动,游戏将自动结束,这样的玩家将被宣布为失败者。
不知道这样的定时器应该怎么实现。我有一些想法,但我不确定哪个是正确的(如果有的话)。
我必须解决这个对我来说似乎并不可怕的任务的唯一想法是这样的:ConcurrentDictionary
将 gameId
s 绑定到 Game
class。然后每个这样的实例都有一个方法,该方法 await
s 直到应该移动的玩家的计时器用完或直到 GameHub
通知此方法已发出移动命令,以先发生者为准.但是,我不知道如何实现这个。
这是正确的方法吗?如果是,那么我应该如何让这个方法等到计时器用完或直到移动命令到达 GameHub
?
编辑:我想我应该这样写:
await Task.WhenAny(
Task.Delay(players_available_time_left),
??something_to_mean_a_move_order_has_arrived??
);
- 这是正确的吗?如果是,我应该写什么来代替问号?
您可以简单地使用一个计时器,该计时器每回合开始并在移动完成后停止:
private System.Timers.Timer Timer = null;
private double TimerDelay = 30d * 1000d; // 30 seconds
private void StartTimer()
{
Timer = new System.Timers.Timer() { Interval = TimerDelay , AutoReset = false};
Timer.Elapsed += Timer_Elapsed;
Timer.Start();
}
private void StopTimer()
{
Timer.Stop();
}
private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
// stop the timer
StopTimer();
// call the method to make the player lose and end the game
EndGame();
}
当你启动播放器时,调用 StartTimer()
然后放手。当玩家结束时,轮到调用 StopTimer()
,它将停止计时器调用游戏结束。如果计时器用完,它会自动通知您游戏结束。
这是我目前拥有的:一个单例 class GameManager
,主要由一个 ConcurrentDictionary
组成,其中包含所有正在进行的游戏(将游戏板和两个玩家的缺口绑定到游戏 ID)。我还有一个 SignalR 集线器,GameHub
,其方法 MakeAMove(ulong gameId, Move move)
从字典中检索相关的 gameId
游戏,lock
s 在其上,检查调用的玩家是否该方法是现在应该采取行动的玩家,如果是,则对游戏的棋盘进行适当的更改,将此行动广播给该游戏的所有观察者,并在必要时结束游戏,宣布这是玩家的胜利X 或平局并将其从字典中删除。
我没有的是计时器。我认为计时器是必要的,因为如果没有它,许多游戏可能永远不会结束并永远徘徊在这个字典中。计时器的工作方式应该是,如果玩家未能在分配的时间内采取行动,游戏将自动结束,这样的玩家将被宣布为失败者。
不知道这样的定时器应该怎么实现。我有一些想法,但我不确定哪个是正确的(如果有的话)。
我必须解决这个对我来说似乎并不可怕的任务的唯一想法是这样的:ConcurrentDictionary
将 gameId
s 绑定到 Game
class。然后每个这样的实例都有一个方法,该方法 await
s 直到应该移动的玩家的计时器用完或直到 GameHub
通知此方法已发出移动命令,以先发生者为准.但是,我不知道如何实现这个。
这是正确的方法吗?如果是,那么我应该如何让这个方法等到计时器用完或直到移动命令到达 GameHub
?
编辑:我想我应该这样写:
await Task.WhenAny(
Task.Delay(players_available_time_left),
??something_to_mean_a_move_order_has_arrived??
);
- 这是正确的吗?如果是,我应该写什么来代替问号?
您可以简单地使用一个计时器,该计时器每回合开始并在移动完成后停止:
private System.Timers.Timer Timer = null;
private double TimerDelay = 30d * 1000d; // 30 seconds
private void StartTimer()
{
Timer = new System.Timers.Timer() { Interval = TimerDelay , AutoReset = false};
Timer.Elapsed += Timer_Elapsed;
Timer.Start();
}
private void StopTimer()
{
Timer.Stop();
}
private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
// stop the timer
StopTimer();
// call the method to make the player lose and end the game
EndGame();
}
当你启动播放器时,调用 StartTimer()
然后放手。当玩家结束时,轮到调用 StopTimer()
,它将停止计时器调用游戏结束。如果计时器用完,它会自动通知您游戏结束。