На этом уроке мы допишем метод Box.Поймал() и запустим игру с квадратиками. Потом попробуем подружить квадратики с кружками, увидим, что это не так просто, да собственно и не нужно. Но возможно.
Дата отправки отчёта:
31 марта 2016 г.
Задание выполнено: за
1 час. 20 мин.
Чему научился:
Условие пересечения прямоугольников.
Что было сложным:
Сложностей не было.
Комментарии:
Поначалу решил, что предложенная в уроке функция проверки пересечения двух прямоугольников рассматривает только один частный случай, слишком уж "простая" она на вид. Однако проверил на практике - работает. Здесь я предположил, что боксики двигаются слишком быстро, поэтому в какой-то момент срабатывает "то самое" частное условие и боксик голится. Я не верил, что это решение корректное. Для полной проверки нужно было замедлять боксики и проверять на глаз пересечения, но мне не хотелось этим заниматься.
Я уже хотел было отправить отчет, но тут вспомнил совет Евгения Витольдовича, что следует довести дело до конца. Тут осенило, думаю, дай-ка создам unit-тесты на функцию isIntersect и проверю все возможные варианты пересечений и не пересечений. В итоге, нарисовал на бумаге разные варианты расположения прямоугольников, получалась 31 комбинация, создал для каждой из них свой тест, каждый тест запускал по мере написания и меня каждый раз шокировало, что функция-то работает:D На втором скриншоте показаны результаты выполнения 31 теста, все проходят. Подумал, может в Qt какая-нибудь бага, регрессировал код тестируемой функции, добавил в нее ошибку и тесты посыпались как надо, чудо. В общем, функция Евгения Витольдовича работает как надо.
Позже я еще раз логически проанализировал функцию проверки и да, тут уже понял, что код корректен. Первое впечатление оказалось обманчивым, следует внимательно читать код. Хороший урок для меня.
Мощно! Впечатляет подход к проработке уроков! Творчество в чистом виде. Учусь у Вас такому же отношению. И еще это очень здорово мотивирует! Молодец, Ильшат!
В уроке были ссылки с описанием алгоритмов. Так вот у них там есть ошибки :) Пришлось их исправлять, прежде чем вам показать. Были ли у тебя тесты, когда фигуры не пересекаются, а только касаются в одной точке?
Спасибо, таких тестов не было. Сегодня исправил пару ошибок в тестах, дописал новые на проверку касания боковыми сторонами, угловыми точками и при наложении друг на друга (одинаковые прямоугольники) - все работает.
Научился: Реализовал пересечение прямоугольников ещё на прошлом уроке.
Реализовал функцию Show(IGamer g) через свитч.
Всё отлично, идём дальше.
з.ы.
по поводу интерфейса, это не его суть, чтобы игроки были одинаковые, они и так одинаковые, так как у них всех единый интерфейс.
По поводу же реализации пересечения разных объетов, это немного другая задача. просто она сложнее, чем проверка одинаковых объектов. Поглядим реализацию в след. уроке.
Научился: определение столкновения боксиков реализовано через сравнение их величин Right, Left, Top, Bottom.
Боксики с шариками живут в разных вселенных и отсюда их параллельное броуновское движение.