Найти тему

Построение логики для детской задачи

Оглавление

Поиск идеи для реализации

Чтобы как-то продемонстрировать работу программы мне нужна была идея для реализации. Недавно добавил возможность использовать дисплей, и у меня сразу появилось 8 кнопок, 8 светодиодов и дисплей на 8 разрядов (и все это за каких-то 150 руб). В поисках идеи я вспомнил загадку из детства, пару кликов и я нашел ее текст.

Однажды крестьянину понадобилось перевезти через реку волка, козу и капусту. У крестьянина есть лодка, в которой может поместиться, кроме самого крестьянина, только один объект — или волк, или коза, или капуста. Если крестьянин оставит без присмотра волка с козой, то волк съест козу; если крестьянин оставит без присмотра козу с капустой, коза съест капусту.
Как крестьянину перевезти на другой берег всё своё имущество в целости и сохранности?

Кто не знает загадку, то посмотрите здесь.

Назначение кнопок и светодиодов

Назначение кнопок и светодиодов tm1638
Назначение кнопок и светодиодов tm1638

Если светодиод горит, то соответствующий объект находится на соответствующем берегу; кнопками переправляем объекты на другой берег.

Схема устройства

Подключение Arduino UNO и tm1638
Подключение Arduino UNO и tm1638

Питание платы платы VCC, GND - обязательно как указано; остальные выводы можно и по другому, но необходимо скорректировать в свойствах блока tm1638.

Свойство блока tm1638
Свойство блока tm1638

Построение программы

Создание программы в "живую" смотреть здесь, итоговым вариант на скриншоте ниже. Необходимо еще продумать как пользователя обрадовать победой и огорчить поражением.

Алгоритм головоломки
Алгоритм головоломки

Краткое описание логики

В проекте использованы: блок для работы с дисплеем tm1638 (сверху, в его свойствах задается куда подключаем вывода от tm1638), блок опроса кнопок (слева), и блок управления светодиодами (справа). Тестирование дисплея на контроллере tm1638 можно посмотреть здесь.

Блоки дисплея на контроллере tm1638
Блоки дисплея на контроллере tm1638

Чтобы программа была более читаема, я скрыл большинство соединений и заполнил подсказки соединений. Название писал кратко поэтому получилось не столь понятно. Опрашиваем кнопки

-6

RS триггера хранения положения объектов и блоки инверсии их значений

-7

Вывод состояний объектов на светодиоды

-8

Логика формирования команд взведения и сброса триггеров объектов "Капуста", "Козел", "Волк". Например, команду "Капуста направо" сформируем только тогда, когда объекты "мужик" и "капуста" находятся слева и нажата кнопка переправить "капусту и мужика" направо.

-9

Взведение и сброса триггера для состояния "мужика" формируем по логике или при переправе объектов или просто одного "мужика"

-10

Логика формирования сигнала "Проиграл!". Если берегу остались "Капуста" и "Козел" или "Козел" и "Волк" и при этом нет "Мужика" то формируется сигнал проигрыша на соответствующем берегу. По закону или складываем и управляем свечением дисплея.

-11

Как я уже говорил выше, необходимо еще продумать как пользователя обрадовать победой и огорчить поражением.

Заключение

Спасибо всем за внимание.