<< Вернуться на главную

СИРИУС

Скоро новый год, а значит приближается очередной, новогодний конкурс программистов.

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

В ходе конкурса нужно было пройти какой-то маршрут. Задача осложнялась инерцией корабля, слабопредсказуемыми поворотами и столкновениями с препятствиями. В общем в бассейне как в бассейне!

Вот мы и решили смоделировать этот кораблик и предложить Вам потренироваться в управлении таким интересным объектом.

Итак, имеется бассейн размером 800 на 600. В нем плавает простейший кораблик из пенопласта (для простоты ему придана круглая форма). В центре кораблика врезаны два гребных колеса (одно правее а другое левее центра). Гребные колеса могут крутиться вперед и назад.

Игровое поле представлено на рисунке:

Сам корабль (зеленый круг) виден в нижнем правом углу. Белая полоса на нем указывает направление "Вперед".
Два ряда буев образуют стенки лабиринта. Необходимо не касаясь стенок бассейна и буев привести корабль в левый верхний угол экрана (Зона финиша отмечена зеленым цветом). При прохождении начисляются штрафные баллы. За каждый лишний ход +1, За касание буя или стенки +10.
Победит тот, кто наберет НАИМЕНЬШЕЕ число штафных баллов (а это возможно только если пройти трассу быстро и чисто).

Задача усложнена тем, что в нашем бассейне имеется небольшое течение (и конечно навстречу :-) , а у кораблика слегка "барахлит" правый двигатель (совсем чуть чуть и по случайному закону).

Игрушку с ручным управлением для ознакомления можно скачать тут.
Управление в игрушке производится стрелками. Правая нажата - правый двигатель вперед
Левая - левый.
Клавиша "вверх" - оба вперед
"Вниз" - оба полный назад.

Если вы хотите попробовать свои силы в конкурсе, то скачиваете проект заочного этапа (в соответствии с удобным для вас языком программирования). Распаковываете и пробуете!
Версия для LAZARUSа.
Версия для С++BUILDER 9.
Как обычно программа написана полностью и работоспособна. Вы должны править в основном только подпрограмму "HOD", которая вызывается пока корабль не попадет полностью в зону финиша.

Управление производится подпрограммой M_UPR, которой передается мощность двигателей (левый и правый двигатели). Мощность можно задавать от -1 до +1 (соответственно +1 - вперед а -1 - назад). Если вы ошибетесь, и передадите мощность больше, то ошибки не будет, мощность будет уменьшена до допустимых величин.
Прототип функции управления выглядит так: M_UPR(D_left,D_right:REAL);
Если вы дадите M_UPR(1,-1) - корабль будет вращаться по часовой стрелке
Если вы дадите M_UPR(0,+1) - корабль будет двигаться вперед и сильно заворачивать влево
А если дадите вперед M_UPR(1,1), то поедет вперед (хотя из-за "барахлящего" правого двигателя может слегка поворачивать вправо)

Для того, чтобы знать где корабль находится, куда он повернут и нет ли столкновения, вы можете запросить параметры корабля при помощи подпрограммы M_GET_TM, которая имеет интерфейс:
PROCEDURE M_GET_TM(var X, Y, UG: REAL; var PR: BYTE);
Где "X" и "Y" - координаты корабля
UG - Угол поворота в радианах (=0-вверх)
PR - датчик касания (=0 нет касания, =1-есть касание с препятствием).

Задача конкурса - за наименьшее количество ходов обеспечить приход корабля в зону финиша (и желательно лбом в препятствия не стучаться! :-) ).

Как всегда за месяц предлагается освоить управление, попробовать максимально улучшить показатели, наработать полезные подпрограммы (можно конечно ничего не делать если вас не интересует результат :-) ). Ну а на очном этапе милости просим в СЮТ с готовыми исходниками и собственными идеями. Обещаем как минимум усложнить жизнь.

В конкурсе будет поддержано несколько оболочек и языков программирования . В зависимости от того какая оболочка вам более комфортна вы можете выбрать то что вам ближе. А почему именно такой выбор? Да просто потому, что именно эти оболочки официально куплены нами в СЮТ. А значит, на очном этапе вы можете выбрать любую из этих оболочек. Если у вас другие версии, то вы можете адаптировать проект под вашу оболочку. Это легко делается, потому что основные функции вынесены в DLL. Но учтите, что на очном этапе мы можем обеспечить вам только указанные версии! Впрочем вы можете прийти и со своим ноутбуком, если вас не устраивают наши средства. Игра написана так, что от производительности компьютера она совершенно не зависит.

Подпрограмма "M_OTRIS" пересчитывает модель и рисует обстановку (собственно именно она и делает ход). А вот подпрограмма управления может быть вызвана множество раз, сработает только последняя установка! Будьте внимательны!

Дерзайте, все в ваших руках и головах! Мало того, чтобы потом на очном этапе сюрпризов не случилось, нужно хорошенько погонять это ПО. Вдруг что-то работает не совсем так как заявлено. Пишите, ошибки подправим. На очном этапе все ошибки обзываются "багами" и исправлению не подлежат!

Месяц всем на ознакомление с задачей, наработки своих методик и подпрограмм, тестирование. А в новогодние каникулы (а конкретно 06.01.2018 (воскресенье), в 12:00 в кабинете 2-24 СЮТ) состоится очный этап.
Не забудьте перед тем как сесть за праздничный стол, заглянуть на сайт и поинтересоваться конкретно временем и датой. Вдруг что-то поменялось :-)

ВНИМАНИЕ!

Желающим принять участие в конкурсе очень желательно зарегистрироваться. Чтобы заранее "застолбить" место на очном этапе.
РЕГИСТРАЦИЯ

Учтите, если вы зарегистрировались, то сразу в таблице себя не увидите. Мы постараемся внести информацию в течении 2-х дней.

На сегодня зарегистрировались:

Фамилия и имя Школа Класс Предпочитаемая оболочка
??????? ??????? ??????? ???????

По всем вопросам обращайтесь к администрации "Звездного Мира" через систему

Вопрос-ответ.

или по почте