2015-08-08 108 views
2

我创建了一个控制台游戏,就像“我生成一个随机数,找到它”一样简单,但有很多选项。x秒后停止循环线程方法

我当前的代码(没有什么,我想在这里)是availlable在GitHub上:https://github.com/crakmaniaque/trouvezmoi

我要的是创造我的游戏版本将被定时,所以计算机生成号码,用户发现,它会产生一个新的玩家,玩家有90秒可以找到最多的随机数。我可以很容易地编码。

我需要帮助的是在90秒后停止游戏(一个线程)并检索从线程创建的答案的数量。 Console.Title也应该显示剩余时间。我尝试过的尝试可行,但如果控制台要求输入号码(Console.ReadLine()),线程不会中断。但是计时器是针对整个过程的,不仅仅是用户输入。

private static void timerb() 
{ 
    int t = 90; 
    for (int i = 0; i < 90; i++) 
    { 
     Console.Title = t + " seconds remaining"; 
     Thread.Sleep(1000); 
     t--; 
    } 
} 
private static void cGame() 
{ 
    Thread t = new Thread(timerb); 
    t.Start(); 
    while (t.IsAlive) 
    { 
     bool good = false; 
     int rnd = new Random().Next(0,10); // 0 and 10 are sample 
     while (!good) 
     { 
      try 
      { 
       Console.Write("Enter a number between x and y >"); 
       int i = int.Parse(Console.ReadLine()); 
       if (i == rnd) 
       { 
        good = true; 
       } 
      } 
      catch (FormatException) 
      { 
       Console.WriteLine("Invalid answer."); 
      } 
     } 
    } 
} 

我对线程知之甚少,在那一点上我被困住了。 有人可以帮我解决我的问题吗?我正在使用.NET 2.0。

+0

可能重复[如何添加超时到Console.ReadLine()?](http://stackoverflow.com/questions/57615/how-to-add-a-timeout-to-console-readline) – Amit

+0

我读过这个话题,实际上这里的超时只是用户输入并不是所有的流程,验证等。 –

+0

这就是你遇到问题的地方。你自己说过:*但是如果控制台要求输入数字(Console.ReadLine())*,线程不会中断。使用该答案中的信息来解决您的问题。 – Amit

回答

0

也许你正在寻找一个计时器?你可以注册一个事件,这个事件会在90秒后触发,在循环发生时运行。文档可以在这里找到:Timer class MSDN documentation

我相信用法是:

Timer timer = new Timer { Interval = new Timespan (0,1,30); 
timer.elapsed += //function to fire to kill the app or the game 
+0

我会研究它,谢谢一堆。如果它能奏效,我会给出新闻。 –

0

You'd need to make each console read with a timeout equal to the amount of time left in the game.这解决了这个问题。

然后,您需要一种方式来指示timerb线程在主游戏循环结束时关闭。我认为最简单的方法是在剩余时间为< = 0时结束游戏循环。或者,你可以让timerb主线程在t == 0时关闭。不过,线程间通信总是很复杂且容易出错。

您可以通过设置volatile bool shutdowntrue并让timerb轮询该变量并自行关闭来发信号通知timerb线程关闭。