Цикл не даёт принять решение, а всё делает сам
- Войдите на сайт для отправки комментариев
Ср, 11/04/2018 - 20:34
Добрый день. Такой вопрос:
По сценарию, необходимо,чтобы у игрока было 3 секунды на принятие решения - нажимать кнопку или нет.
Если нажмёт - выполняется сценарий Награды.
Если нет - проиграл.
Сам сценарий выполняется, но выбор всегда происходит с Наградой и повлиять никак не получается.
void Hungry()
{
display.drawImage (eat, 25 , 64, IMG_ROM);
tone(sound, 500, 200);
delay(200);
tone(sound, 1000, 200);
delay(400);
uint32_t X;
X = millis();
do
{
digitalWrite(bluePinLED, HIGH);
display.setFont(SmallFontRus);
display.print("Хочу есть!!!", 20, OLED_L);
if (digitalRead(bluePinLED)==HIGH)
{
Eat(); //Launch void win
break; // escape
} else
{
Death();
}
} while (millis() - X <= 30000);
}
Мне бы такой цикл, чтобы сам за меня все делал.
На первую строку в своем цикле посмотрите.
Блин, иногда так вопросы задают, что хочется попросить поделиться куревом :-)
Мне бы такой цикл, чтобы сам за меня все делал.
На первую строку в своем цикле посмотрите.
Я тоже люблю шутки,но особенно тогда,когда я их понимаю.
Не очень понял,на что надо обратить внимание. Подскажите, пожалуйста, более конкретно.
Более конкретно: посмотри на строчку 12 и задайся вопросом для чего она и на как она влияет на строку 15
блин, мужик, ты в 12 строке сам принудительно выставляешь пин в HIGH. а в 15 строке его читаешь. И что ты думаешь там будет?????
И еще - если процесс должен ждать 3 секунды. то почему в последней строке интервал 30000 ?
О, спасибо! Слепой совсем. Имена переменных отличаются только приставкой LED, всё уже сливается.
Про 30000 - тоже 0 лишний,увидел уже. Спасибо.
Вот так всегда - поможет человек, а благодарят бога.
Вот так всегда - поможет человек, а благодарят бога.
Я потому и отредактировал! Сам я атеист,но от языковых клише не уберег себя. :-)
void Hungry() { display.drawImage (eat, 25 , 64, IMG_ROM); display.update(); tone(sound, 500, 200); delay(200); tone(sound, 1000, 200); delay(400); uint32_t X; X = millis(); do { digitalWrite(bluePinLED, HIGH); display.setFont(SmallFontRus); display.print("Хочу есть!!!", 20, OLED_L); display.update(); delay(500); if (digitalRead(bluePin)==HIGH) // if button pushed { Eat(); //Launch void win break; // escape } else { Death(); //Launch void flub } } while (millis() - X <= 3000); }Внёс изменения, но он теперь срабатывает не тогда,когда в этом промежутке кнопку нажали, а если в момент,когда надпись на экране - кнопка была зажата.
Что надо убрать/добавить?
Заранее спасибо.
Так смерть вызывается внутри do если кнопка не нажата.
Так смерть вызывается внутри do если кнопка не нажата.
Так если кнопку не нажали,то смерть и должна наступить.
По сценарию, необходимо,чтобы у игрока было 3 секунды на принятие решения - нажимать кнопку или нет.
Ну да? А 3 секунды подождать, не?
Это уже какая-то полемика.
Условие ясно - в течение 3 секунд нажать или не нажать кнопку.
Если нажал - получил награду, ждём следующего раза вызова цикла.
Если не нажал - умер.
Вопрос в том,что сейчас, при данных настройках, кнопка должна быть зажата все это время,как начался цикл и до момента проверки,а это несколько не то,что нужно.
Да, и я написал - смерть вызывается внутри цикла do, то есть в течении 3 секунд пока работает цикл и кнопка не нажата у вас срабатывает смерть. А на самом деле смерть должна срабатывать не внутри цикла, а после, при условии, что кнопка не была нажата.
boolean buttonblueWasUp = true; void Hungry() { display.drawImage (eat, 25 , 64, IMG_ROM); display.update(); tone(sound, 500, 200); delay(200); tone(sound, 1000, 200); delay(400); uint32_t X; X = millis(); do { digitalWrite(bluePinLED, HIGH); display.setFont(SmallFontRus); display.print("Хочу есть!!!", 20, OLED_L); display.update(); delay(500); boolean buttonblueIsUp = digitalRead(bluePin); if (buttonblueWasUp && !buttonblueIsUp) { delay(10); buttonblueIsUp = digitalRead(bluePin); if (!buttonblueIsUp) { Eat(); break; } else { Death(); } } }while (millis() - X <= 3000); }Вот добавил проверку нажатия, но теперь,как в самом начале, условие автоматом прогоняется как ВЫПОЛНЕННОЕ.
Это треш какой-то.
1. Надо в прошлом варианте убрать смерть из цикла do
2. После цикла do проверять была ли нажата кнопка и если нет то
Death();Это треш какой-то.
1. Надо в прошлом варианте убрать смерть из цикла do
2. После цикла do проверять была ли нажата кнопка и если нет то
Death();Да,я прочитал ваше сообщение уже после того,как моё отправилось. Щас буду переделывать. Спасибо.
а, нафиг цикл вообще? О_О
а, нафиг цикл вообще? О_О
Смысл такой:
На дисплее человек.
Есть кнопка.
В какой-то момент(рандомно) на экран подается картинка,что человек хочет есть.
У нас есть 3 секунды,чтобы принять решение - накормить или нет.
Результат - или продолжаем дальше или смерть.
Кроме как циклом я не придумал, в каком виде это реализовать.
void Hungry() { display.drawImage (eat, 25 , 64, IMG_ROM); display.update(); tone(sound, 500, 200); delay(200); tone(sound, 1000, 200); delay(400); uint32_t X; X = millis(); boolean buttonblueIsUp = digitalRead(bluePin); do { digitalWrite(bluePinLED, HIGH); display.setFont(SmallFontRus); display.print("Хочу есть!!!", 20, OLED_L); display.update(); if (digitalRead(bluePin)==HIGH) { Eat(); break; } }while (millis() - X <= 3000); if (buttonblueWasUp && !buttonblueIsUp) { delay(10); buttonblueIsUp = digitalRead(bluePin); if (buttonblueIsUp != HIGH) { Death(); } } }Так, про отработку кнопки за 3 секунды - заработало. Теперь не работает Смерть ))
На дисплее человек.
Есть кнопка.
В какой-то момент(рандомно) на экран подается картинка,что человек хочет есть.
У нас есть 3 секунды,чтобы принять решение - накормить или нет.
Результат - или продолжаем дальше или смерть.
void Hungry() { display.drawImage (eat, 25 , 64, IMG_ROM); display.update(); tone(sound, 500, 200); delay(200); tone(sound, 1000, 200); delay(400); uint32_t X; X = millis(); boolean buttonblueIsUp = digitalRead(bluePin); do { digitalWrite(bluePinLED, HIGH); display.setFont(SmallFontRus); display.print("Хочу есть!!!", 20, OLED_L); display.update(); if (digitalRead(bluePin) == HIGH) { buttonblueIsUp = true; Eat(); break; } } while (millis() - X <= 3000); if (!buttonblueIsUp) { Death(); } }Вот в таком варианте всё заработало!
upd. Код почистил.
buttonblueWasUp можно убрать
Вот так всегда - поможет человек, а благодарят бога.
Это как раз нормально. Он жеж не сволими руками помогает, а исключительно людскими, тутошними. Вот кто надоумил автора зайти в тему? То-то! :)
-"Господи! Я такой праведный, я всегда соблюдаю все обеты и моления, но я так беден, что иногда мне даже нечего поесть, а ты так ни разу мне и не помог. Что я делаю не так?"
(глас с небес): -"Блин, да как же тебе помочь, коли ты - безработный? Кошелек тебе подкидывал, кто его в ментовку снес? Ты хоть лотерейку купи что-ли.."
Как-то так, не помню ужо. :)