Функция времени иногда работает, иногда нет

Поэтому я пытаюсь сделать функцию времени, которая ведет обратный отсчет. Это основано на том, что я видел здесь. Переменные даны из другой функции. Когда время истекает, переменная финиш становится равной 1, и она покидает функцию.
Эта функция иногда работает, а иногда она не работает, например, если я даю ей 11 секунд, она работает нормально, но если я даю 1 час, она не работает. Может кто-нибудь сказать мне, что не так с кодом.

if (time1 == 0 && time2 == 0 && time3 == 0 && time4 == 0)
//if all the time is 0 finish the sequence
finish = 1;

if (time1 != 0) //Checking to see if the first digit is NOT at 0
time1 = time1 - 1; //  subtract time 1 by 1
else {
time2 = time2 - 1;  //When time1 is 0
time1 = 9;
} //Time1 going back to it's original value

if (time2 == 0 && time1 == 0) { //if time1 and time2 are 0s
if (time3 != 0) { //The minute value (time3)
time2 = 5;  //60 SECONDS
time3 = time3 - 1;
time1 = 9;
}
} //Put time 1 to its original value
if (time2 <= 0 && time1 <= 0 && time3 <= 0) {
if (time4 != 0) { //The minute value (time3)
time2 = 5; //60 SECONDS
time3 = 9;
time4 = time4 - 1;
time1 = 9;
}
} //Put time 1 to its original value

Время4 = 3, Время3 = 2, Время2 = 1, Время1 = 0. Это будет означать, что время в 32:10 мин.

1

Решение

Вы не можете просто проверить ненулевое значение, вам нужно проверить, является ли данное время положительным, иначе вы можете считать с отрицательными значениями, и счетчики могут переполниться.

if (time1 > 0)
time1 -= 1;
if (time3 > 0)
time3 -= 1;

Еще одна мысль: вы начинаете отсчет с каждой цифрой минут и секунд, почему бы просто не использовать секунды, преобразовав свое время в секунды. Например, чтобы отсчитать 1:23:

int minutes = 1;
int seconds = 23;
int timer = minutes * 60 + seconds;

// in your timer function
if (seconds == 0) {
finish = 1;
} else if (seconds > 0) {
seconds -= 1;
} else {
// error
}

Таким образом, это будет также расширяемым, что, если вы хотите обрабатывать часы, просто добавьте hours * 3600 в secondsВы можете сделать это легко, чтобы обрабатывать дни, даже месяцы. При вашем подходе добавьте, что это приведет к слишком большому количеству случаев, с которыми почти невозможно справиться правильно.

3

Другие решения

Проблема в том, что вы сравниваете с нулем после того, как изменили число на ненулевое.

Предполагая, что 1:00 кодируется как

time1 = 0
time2 = 0
time3 = 1

Вы можете следовать своей собственной логике:

if (time1 != 0) // Nope
time1 = time1 - 1;
else { // Yes
time2 = time2 - 1;
time1 = 9;
}

Теперь у вас есть

time1 == 9
time2 == 0
time3 == 1

if (time2 == 0 && time1 == 0) { // Nope, time1 is 9
if (time3 != 0) {
time2 = 5;
time3 = time3 - 1;
time1 = 9;
}
}

а у тебя еще есть

time1 == 9
time2 == 0
time3 == 1

и наконец

if (time2 <= 0 && time1 <= 0 && time3 <= 0) { // Nope
if (time4 != 0) {
time2 = 5;
time3 = 9;
time4 = time4 - 1;
time1 = 9;
}
}

так что вы в конечном итоге

time1 == 9
time2 == 0
time3 == 1

то есть 1:09.

Единственное время, когда вы хотите изменить времяК когда времяK-1 «пересек» ноль.
Это можно сделать с помощью гнезда условий:

if (time1 > 0 || time2 > 0 || time3 > 0 || time4 > 0)
{
time1 -= 1;
if (time1 < 0)
{
time1 = 9;
time2 -= 1;
if (time2 < 0)
{
time2 = 5;
time3 -= 1;
if (time3 < 0)
{
// ...
}
}
}
}
2

По вопросам рекламы [email protected]