使我的程序在绘图卡之间暂停

时间:2014-05-01 17:26:46

标签: c#

我做了一个小型的二十一点游戏,我想让计算机在他拉出的每张卡之间等待,但是使用System.Threading.Thread.Sleep(int x)并不会让程序在牌之间等待,而是让它等待{{ 1}} ..
我也知道使用Thread.Sleep并不是一个好方法,所以我宁愿学习更好的方法,因为我完全是出于教育目的而创建这个程序。
我将添加下面的代码来决定是否应该绘制卡片,以及绘制卡片的方法。

x * amount of cards

2 个答案:

答案 0 :(得分:0)

我会在绘制成员之间添加最后绘制的时间和时间。然后在绘制卡片之前,获取从现在到最后一次拉动的时间。如果时间大于绘制它的冷却时间之间的允许时间。

private DateTime _lastWrite = DateTime.Now;
private TimeSpan _delay = TimeSpan.FromMilliseconds(100);

public void ComputerDrawCard() {
    var now = DateTime.Now;

    if (now - _lastWrite < _delay)
        return;

    _lastWrite = now;

    draw card...
}

Here's a gist of an example working correctly.

答案 1 :(得分:0)

有多种方法可以实现这样的目标。我相信你试图做的是模拟人类花时间做事。我建议使用预期等待时间和计时器的组合来实现您想要的效果。

class Example
{
    public Example()
    {
        // create a stalled timer
        _pulse = new Timer(this.TakeAction);
    }

    TimeSpan _drawdelay = TimeSpan.FromSeconds(2);
    DateTime _lastAction = DateTime.MinValue;
    Timer _pulse;

    public void Start()
    {
        // start the timer by asking it to call the worker method ever 0.5 seconds
        _pulse.Change(0, 500); 
    }

    public void Stop()
    {
        // stop the timer by setting the next pulse to infinitely in the future
        _pulse.Change(Timeout.Infinite, Timeout.Infinite);
    }

    void TakeAction(object x)
    {
        lock (_pulse)
        {
            DateTime now = DateTime.Now;
            if(now - _lastAction > _drawdelay)
            {
                // do work ...
                _lastAction = now;
            }
        }
    }
}

也就是说,如果正在完成的工作需要超过500毫秒才能完成上述代码。根据需要添加线程安全性。