我做了一个小型的二十一点游戏,我想让计算机在他拉出的每张卡之间等待,但是使用System.Threading.Thread.Sleep(int x)
并不会让程序在牌之间等待,而是让它等待{{ 1}} ..
我也知道使用Thread.Sleep并不是一个好方法,所以我宁愿学习更好的方法,因为我完全是出于教育目的而创建这个程序。
我将添加下面的代码来决定是否应该绘制卡片,以及绘制卡片的方法。
x * amount of cards
答案 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...
}
答案 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毫秒才能完成上述代码。根据需要添加线程安全性。