1 c# if-statement windows-phone-8
我曾经尝试过两三次问这个问题,但未能正确分阶段,所以我想再试一次.我正在制作一个训练秒表应用程序.该应用程序的功能是计算10秒,让受训者10秒准备.一旦该时间过去,它将计入20秒,其中受训者在20秒内进行艰苦锻炼.之后,休息时间为10秒.然后它循环回到20秒的训练并继续这个循环8轮.
我的问题是,它将开始10秒准备,但然后它循环回到10秒计时器.出于某种原因,我的if else语句会循环回到准备时间.我正在使用秒表和时间跨度来表达if语句.
private void timer_Tick(object sender, EventArgs e)
{
//throw new NotImplementedException();
//timer timespan is more than zero, start stopwatch(get the prepare counter going)
if (timerWatch.Elapsed < new TimeSpan(0, 0, 11))// if its 5sec
{
milllisecond = timerWatch.ElapsedMilliseconds;
second = milllisecond / 1000;
milllisecond = milllisecond % 1000;
minute = second / 60;
second = second % 60;
hour = minute / 60;
minute = minute % 60;
txtblTime.Text = minute.ToString("00") + ":" + second.ToString("00");
}
else if (timerWatch.Elapsed >= new TimeSpan(0, 0, 10) && timerWatch.Elapsed < new TimeSpan(0, 0, 21))//more than 4sec
{
timerWatch.Restart();
milllisecond = timerWatch.ElapsedMilliseconds;
second = milllisecond / 1000;
milllisecond = milllisecond % 1000;
minute = second / 60;
second = second % 60;
hour = minute / 60;
minute = minute % 60;
txtblTime.Text = minute.ToString("00") + ":" + second.ToString("00");
txtblPrepare.Visibility = System.Windows.Visibility.Collapsed;
txtblGo.Visibility = System.Windows.Visibility.Visible;
}
else if (timerWatch.Elapsed < new TimeSpan(0, 0, 21))
{
timerWatch.Restart();
milllisecond = timerWatch.ElapsedMilliseconds;
second = milllisecond / 1000;
milllisecond = milllisecond % 1000;
minute = second / 60;
second = second % 60;
hour = minute / 60;
minute = minute % 60;
txtblTime.Text = minute.ToString("00") + ":" + second.ToString("00");
txtblGo.Visibility = System.Windows.Visibility.Collapsed;
}
else
txtblTime.Text = "Times Up!";
}
Run Code Online (Sandbox Code Playgroud)
您要实现的是所谓的有限状态机.通过计时器推断该机器的状态使得难以理解和读取代码.我会以更直接的方式存储州.正如Plutonix所说,使用枚举
public enum TrainingState
{
Stopped, // The state machine is not working yet or has finished its work.
Preparing,
Working,
Resting
}
Run Code Online (Sandbox Code Playgroud)
此外,您将需要一个计数器的循环次数
private TrainingState _state = TrainingState.Stopped;
private int _roundNo;
Run Code Online (Sandbox Code Playgroud)
现在你可以像这样制定状态转换
private void ChangeState()
{
switch (_state) {
case TrainingState.Stopped:
//TODO: Initialize and start the timer, display state
_state = TrainingState.Preparing;
break;
case TrainingState.Preparing:
//TODO: Adjust timer intervall for working phase, display state
_roundNo = 1; // We are going into the first round
_state = TrainingState.Working;
break;
case TrainingState.Working:
//TODO: Adjust timer intervall for resting phase, display state
_state = TrainingState.Resting;
break;
case TrainingState.Resting:
if (_roundNo == 8) {
_state = TrainingState.Stopped;
//TODO: stop timer, display state
} else {
//TODO: Adjust timer intervall for working phase, display state
_roundNo++; // We are going into the next round
_state = TrainingState.Working;
}
break;
}
}
Run Code Online (Sandbox Code Playgroud)
你必须在开始和里面时调用这个方法timer_Tick.
private void timer_Tick(object sender, EventArgs e)
{
ChangeState();
}
private void btnStart_Click(object sender, EventArgs e)
{
ChangeState();
}
Run Code Online (Sandbox Code Playgroud)