0

我有一个游戏,其中涉及一个计时器。每经过两分钟,不同玩家之间的新一轮就开始了。所以,我有一个从 00:00 开始的文本框,并且每秒更改一次,直到等于 02:00。

现在,如果用户关闭表单,我想在一轮中间保存游戏状态。我需要做的是,在加载时,文本框从用户上次离开游戏的时间开始,并正常持续到 02:00。

我怎样才能做到这一点?

到目前为止,这就是我所拥有的,其中锦标赛是形式

public Tournament()
{
     _timer = new System.Windows.Forms.Timer();
     _timer.Interval = 1000;
     _timer.Tick += Timer_Tick;
     _myDateTime = DateTime.Now;
     newDate = new DateTime();
     newDate = newDate.AddMinutes(2.00);
     _timer.Start();
     InitializeComponent();
}

void Timer_Tick(object sender, EventArgs e)
{
     var diff = DateTime.Now.Subtract(_myDateTime);
     this.textBox1.Text = diff.ToString(@"mm\:ss");

     DateTime dt = Convert.ToDateTime(diff.ToString());

     if (newDate.Minute == dt.Minute)
     {
         _timer.Stop();
         _myDateTime = DateTime.Now;

         displayPointsOrResults();

         this.textBox1.Text = diff.ToString(@"mm\:ss");  
     }
   }

在我的 LoadGame 方法中:其中 timePassed 是我在文本框中写的

  string[] splitted6 = timePassed.Split(':');

  if (splitted6[0] == "00")
  {
      int remainingTime = 120 - Convert.ToInt32(splitted6[1]);

      DateTime time = DateTime.Now.Date; 
      time = time.AddMinutes(remainingTime);

      _myDateTime = time;
  }
  else
  {
      int leftTime = Convert.ToInt32(splitted[0].Trim('0') + splitted[1]);
      int remainingTime = 120 - leftTime;

      DateTime time = DateTime.Now.Date; 
      time = time.AddMinutes(remainingTime);

      _myDateTime = time;
  } 
4

2 回答 2

2

使用TimeSpan而不是DateTime保存和加载当前超时:

int _roundDuration = 2 * 60; // 2 minutes

void Timer_Tick(object sender, EventArgs e)
{
     TimeSpan diff = DateTime.Now - _myDateTime;
     textBox1.Text = diff.ToString(@"mm\:ss");
     if (diff.TotalSeconds >= _roundDuration)
     {
          _timer.Stop();    
          _myDateTime = DateTime.Now;
          displayPointsOrResults();
     }
}

加载游戏时(解析textBox1.Text):

TimeSpan diff = TimeSpan.ParseExact(textBox1.Text, @"mm\:ss", null);
_myDateTime = DateTime.Now.Substract(diff);

每当您加载游戏时,开始时间将按照开始显示超时前计算。

于 2012-12-09T10:39:09.597 回答
1

到目前为止,您过于复杂了!不要将值保存为字符串(例如标签Text)或解析任何“字符串化”值。

而是使用出于显示原因格式化的幕后计数器(例如计算秒数):

int _seconds = 0;
const int _roundDuration = 120; // 2 minutes

...

void Timer_Tick(object sender, EventArgs e)
{
    if (_seconds++ >= _roundDuration)
    {
        _seconds = 0;
        displayPointsOrResults();
    }
    textBox1.Text = (_seconds / 60).ToString("D2") + ":" + (_seconds % 60).ToString("D2");
}
于 2012-12-09T11:01:19.343 回答