如何在多人国际象棋游戏中实现计时器? 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 游戏,locks 在其上,检查调用的玩家是否该方法是现在应该采取行动的玩家,如果是,则对游戏的棋盘进行适当的更改,将此行动广播给该游戏的所有观察者,并在必要时结束游戏,宣布这是玩家的胜利X 或平局并将其从字典中删除。

我没有的是计时器。我认为计时器是必要的,因为如果没有它,许多游戏可能永远不会结束并永远徘徊在这个字典中。计时器的工作方式应该是,如果玩家未能在分配的时间内采取行动,游戏将自动结束,这样的玩家将被宣布为失败者。

不知道这样的定时器应该怎么实现。我有一些想法,但我不确定哪个是正确的(如果有的话)。

我必须解决这个对我来说似乎并不可怕的任务的唯一想法是这样的:ConcurrentDictionarygameIds 绑定到 Game class。然后每个这样的实例都有一个方法,该方法 awaits 直到应该移动的玩家的计时器用完或直到 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() ,它将停止计时器调用游戏结束。如果计时器用完,它会自动通知您游戏结束。