Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Забалуева Разработка программы кегельринг.rtf
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
753 Кб
Скачать
☆
  1. Подсчёт вытолкнутых кеглей для остановки после выполнения задачи.

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

  1. Выбор стратегии обхода.

Стратегия обхода кеглей напрямую зависит от плана их расположения, который задаётся заранее. Классическим вариантом является расположение их по кругу, на равном расстоянии друг от друга. Универсальной стратегией обхода кеглей в этом случае является схема «Звезда». Делением на количество позиций вычисляется угол поворота и робот вначале проверяет, есть ли кегля на позиции, затем, если она есть, то выталкивает её и возвращается на исходную позицию, чтобы потом повернуться на рассчитанное количество градусов. Проиллюстрируем это на схеме:

Схема 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);

}

}

Возможные формулировки задач базового уровня сложности(для примера):

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

  2. Контур представляет из себя эллипс, необходимо за минимальное время вытолкнуть из круга все кегли, количество которых известно, а расположение – задано.

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

Рекомендации:

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

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

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