gpt4 book ai didi

c# - 有问题的 if 语句

转载 作者:太空宇宙 更新时间:2023-11-03 18:06:33 24 4
gpt4 key购买 nike

我之前尝试过问这个问题两到三遍,但无法正确地解决这个问题,所以我想再试一次。我正在制作一个训练秒表应用程序。该应用程序的功能是计算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!";
}

最佳答案

您要实现的是所谓的 finite-state machine .从定时器推断这台机器的状态使得代码难以理解和阅读。我会以更直接的方式存储状态。正如 Plutonix 所说,使用枚举

public enum TrainingState
{
Stopped, // The state machine is not working yet or has finished its work.
Preparing,
Working,
Resting
}

此外,您将需要一个计数器来计算循环次数
private TrainingState _state = TrainingState.Stopped;
private int _roundNo;

现在您可以像这样制定状态转换
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;
}
}

您必须在启动时和内部调用此方法 timer_Tick .
private void timer_Tick(object sender, EventArgs e)
{
ChangeState();
}

private void btnStart_Click(object sender, EventArgs e)
{
ChangeState();
}

关于c# - 有问题的 if 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27767802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com