- •Разработка программы «Кегельринг»
- •Оглавление
- •Постановка задачи:
- •Описание задачи
- •Подзадачи:
- •Базовый уровень сложности.
- •Подсчёт вытолкнутых кеглей для остановки после выполнения задачи.
- •Выбор стратегии обхода.
- •Средний уровень сложности
- •Повышенный уровень сложности.
- •Заключение
- •Приложение 1. Требования к рингу, кеглям и роботу, предъявляемые на соревнованиях по кегельрингу:
- •Приложение 2. Таблица параметров, рассматриваемых в задаче «Кегельринг»
- •* Контур не должен иметь перекрёстков, вложенных контуров и острых углов.
Подсчёт вытолкнутых кеглей для остановки после выполнения задачи.
Для реализации подсчёта кеглей удобнее всего использовать обычный счётчик, прибавляя к нему единицу после каждого выталкивания.
Выбор стратегии обхода.
Стратегия обхода кеглей напрямую зависит от плана их расположения, который задаётся заранее. Классическим вариантом является расположение их по кругу, на равном расстоянии друг от друга. Универсальной стратегией обхода кеглей в этом случае является схема «Звезда». Делением на количество позиций вычисляется угол поворота и робот вначале проверяет, есть ли кегля на позиции, затем, если она есть, то выталкивает её и возвращается на исходную позицию, чтобы потом повернуться на рассчитанное количество градусов. Проиллюстрируем это на схеме:
Схема 2. Стратегия обхода классического расположения кеглей.
Упавшие, вместо того, чтобы быть вытолкнутыми, кегли не контролируются, потому как это представляет собой задачу иного класса.
Итоговый код программы.
Задача: Имеется четыре кегли, расположенные на четырёх случайных позициях из восьми, показанных на схеме 2. Необходимо вытолкнуть их из круга за кратчайшее время.
#pragma config(Sensor, S1, sonar, sensorSONAR)
//*!!Code automatically generated by 'ROBOTC' configuration wizard !!*//
const int K_COUNT=4; /* Константа, означающая количество кеглей, которые необходимо вытолкнуть. Решается подзадача №3 */
task main() {
int k=0; // Количество вытолкнутых кеглей.
while (k<K_COUNT) {
/*Определение наличия кегли на указанной позиции Решается подзадача №1*/
if (SensorValue[sonar]<30) {
k++;
/*Выталкиваем кеглю. Решается подзадача № 2. Расчёт количества градусов, на которое должно повернуться колесо ведётся исходя из размера колеса и размеров поля. */
nMotorEncoder[motorA]=0;
while(nMotorEncoder[motorA]<1100) {
motor[motorA]=50;
motor[motorC]=50;
}
motor[motorA]=0;
motor[motorC]=0;
/*Возвращаемся обратно на то же расстояние. Решается подзадача №4*/
nMotorEncoder[motorA]=0;
while(nMotorEncoder[motorA]>-1100) {
motor[motorA]=-50;
motor[motorC]=-50;
}
motor[motorA]=0;
motor[motorC]=0;
}
/*Разворот на 45®. Решается подзадача №4*/
motor[motorA]=50;
motor[motorC]=-50;
wait1Msec(525);
}
}
Возможные формулировки задач базового уровня сложности(для примера):
Контур представляет из себя круг, необходимо за минимальное время вытолкнуть из круга все кегли, количество которых известно, а расположение – задано.
Контур представляет из себя эллипс, необходимо за минимальное время вытолкнуть из круга все кегли, количество которых известно, а расположение – задано.
Контур представляет из себя круг, необходимо за заданное время вытолкнуть из круга максимальное количество кеглей, расположение всех кеглей задано.
Рекомендации:
Данный код описывает только один из вариантов решения задачи. Для задач данного типа он не описывает самый быстрый вариант обхода из возможных, однако хорошо подходит для использования в более сложных задачах.
Также выталкивание кеглей при рассмотренной расстановке можно осуществить при помощи движения по кругу или квадрату, но данные варианты обхода плохо применимы для задач, где нужно вытолкнуть кегли только одного цвета.
Иные решения остальных подзадач так же возможны, однако, в сравнении с выбором способа обхода контура, они не столь значительны, потому что не могут дать большого выигрыша во времени.
