Online обучение c#

Формула программиста

основатель — Волосатов Евгений Витольдович

Статистика по видеоурокам

  • Всего просмотрено уроков: 248
  • Всего выполнено уроков: 248

Отчёты по видеоурокам

Дата Видеоурок Результат
2016-09-26 18:37 Демо софт Квадратный калейдоскоп + 1 1 час. 50 мин.
Научился рисовать на форме квадратный калейдоскоп.
Проблем не было.
Понравился результат работы программы, смотрится красиво. Спасибо)
2016-09-25 13:25 Демо софт Текстовый процессор + 21 1 час. 50 мин.
Поиску и замене текста в виджете отображения многострочного текста.
Проблем не было.
Еще одна хорошая программка с большими возможностями для экспериментов, спасибо)
2016-09-24 17:56 Нанософт Средняя оценка + 21 1 час. 30 мин.
Повторил создание графического интерфейса программы, реализацию делегата.
Не было.
Небольшая и полезная программка, спасибо)
2016-09-23 21:57 Демо софт Менеджер паролей   1 час. 40 мин.
Работать с буфером обмена, повторил создание единого обработчика событий от различных кнопок.
Сложностей не было.
В моем случае нет поля tag, информацию о логинах/паролях загружаю из файла. Вся информация в открытом виде, что ни есть хорошо. Напрашивается шифрование, редактирование и сохранение данных, займусь этим позже. Спасибо за интересную и полезную программу)
2016-09-22 22:02 Секундомер Секундомер - Написание кода + 20 2 час. 10 мин.
Повторил работу с классами даты и времени, научился обработке события закрытия окна.
Проблем не было.
Интересный формат, выполняешь по инструкции и получаешь результат. Легче найти ошибку, если что-то недоглядел и неправильно написал. Если достаточно детально составить скриншоты всех этапов, то в итоге проще написать какую-нибудь программу с нуля, хорошо для новичков. С другой стороны, формат видео лучше, так как идет попутное объяснение и получаешь больше информации. Спасибо за уроки)
2016-09-22 16:55 Секундомер Секундомер - Настройка формы + 20 1 час. 10 мин.
Устанавливать точное значение ширины столбца таблицы. Выбор столбца с автоматическим изменением ширины в зависимости от текущих размеров таблицы.
Добиться автоматического изменения ширины нужного столбца.
Чувствуется нехватка некоторых возможностей в программе Qt Designer для создания интерфейса программы, приходится делать вручную и писать код. В среде Visual Studio удобнее и понятнее.
2016-09-21 21:46 Демо софт Английские карточки + 20 2 час. 50 мин.
1) Составлять список файлов в каталоге.
2) Воспроизводить mp3 и mp4 файлы.
Небольшие сложности с получением списка файлов. Корректный вывод видео на экран, прерывание воспроизведения при переходе на другую карточку.
Хороший урок, приобрел полезные навыки для воспроизведения медиа-информации.
2016-09-06 15:03 Морской Бой ФИНАЛЬНЫЙ УРОК + 21 30 мин.
Повторил создание видео обзоров.
Проблем не было.
Спасибо за отличный курс :)
2016-09-06 14:08 Морской Бой Последний Бой! + 20 1 час. 30 мин.
Повторил работу с таймером, настройкой интерфейса программы.
Проблем не было.
Компьютер играет очень даже здорово:)
2016-09-05 23:54 Морской Бой Интерфейс игры + 20 1 час. 10 мин.
Повторил работу с интерфейсом программы, обработку событий мышки.
Сложностей не было.
Реализовал секретную функцию, предложенную в уроке: два клика правой кнопкой мышки показывают корабли компьютера, клик левой кнопкой - скрывает.
2016-09-05 20:27 Морской Бой Рефакторинг кода + 21 1 час. 20 мин.
Повторение рефакторинга.
Проблем не было.
Все ок, рефакторинг на пользу, меньше деталей в классе формы)
2016-09-05 17:16 Морской Бой Олимпиада - Создание ИИ - Добивание корабля + 20 1 час. 50 мин.
Повторение материала из прошлых уроков, работа с рекурсией.
Проблем не было.
Все ок, хорошо придумано использовать вывод матрицы put на экран, наглядно.
2016-09-05 08:08 Морской Бой Олимпиада - Создание ИИ - Шаблон ударов + 20 1 час. 30 мин.
Повторил создание и обработку двумерных массивов.
Небольшая ошибка, опечатка в границах цикла при инициализации двумерного массива.
Интересный алгоритм, случайный выбор из матрицы put ячейки с наибольшим значением веса.
2016-09-04 14:16 Морской Бой Олимпиада - Создание ИИ - Стратегия + 1 4 час. 20 мин.
Познакомился в библиотекой консольного вывода ncurses.
Реализовать алгоритм.
На первом скриншоте результат работы алгоритма для прямого расположения кораблей и ниже для случайного. На втором скриншоте при запуске с командой строки задаю количество тестов случайных расположений, нахожу минимальное, среднее и максимальное количество шагов. Спасибо за отличный урок, хорошо попрактиковался:)
2016-09-03 11:08 Морской Бой Олимпиада - Угадай число + 20 50 мин.
Повторил работу с генератором случайных чисел.
Проблем не было.
Хорошая разминка, понравилось разделение классов.
2016-09-02 23:41 Морской Бой Олимпиада - Самый лучший алгоритм + 21 1 час. 10 мин.
Познакомился с разными вариантами алгоритмов ИИ для игры в Морской бой.
Сложностей не было.
Понравились алгоритмы 4004 и public. В моем случае я бы так же сначала искал 4-палубник, попутно сразу добивая найденные корабли, и после потопления 4-палубника, искал бы 2-палубники.
2016-09-02 21:01 Морской Бой Установка кораблей + 20 2 час. 10 мин.
Повторил обработку событий мышки и клавиатуры.
Реализовать выделение ячеек.
Хороший урок, попрактиковался с компонентом QTableWidget для вывода таблицы, были некоторые проблемы с обработкой выделения мышкой ячеек и выводом результата добавления.
2016-09-02 15:39 Морской Бой Делегаты отображения + 20 1 час. 30 мин.
Повторил работу с делегатами.
Сложностей не было.
На верхнем скриншоте раскраска клетки поля при промахе. На нижнем - рассмотрены случаи попадания и потопления корабля.
2016-09-02 01:30 Морской Бой Редактор и Сетка + 20 2 час. 40 мин.
Повторил работу с компонентом QTableWidget - аналог DataGridView.
Проблем не было.
Интересный способ случайного размещения кораблей. Каждый раз, когда проверял отчеты формулистов по морскому бою я задавался вопросом - почему на верхнем заголовке таблиц написано РЕСПУБЛИКА? Теперь стало понятно, это оказалось предложением одного из формулистов :)
2016-09-01 19:31 Морской Бой Море и Корабль   2 час. 10 мин.
Повторил работу с матрицами boost::ublas, указателями unique_ptr.
Проблем не было.
Без использования наследования и полиморфизма трудно назвать полученную систему классов объекто-ориентированной. Страуструп называет такой стиль программирования - абстракцией данных, когда создаются мелкие служебные классы, которые инкапсулируют внутри себя данные и открывают к ним доступ через разрешенный интерфейс. Это подготовительный этап к ООП, переходный от процедурного стиля. Не очень нравится реализация классов Моря и Корабля, например их конструкторы не работают как надо. Но это все сложности, они дадут о себе знать, когда программа будет эволюционировать. На данный момент это не важно, реализация системы получилась простой и ясной, понравилась идея двух массивов, здесь она тоже кстати. Евгений Витольдович хорошо продумал, чтобы код получился как можно проще и понятнее, спасибо:)
2016-09-01 14:03 Морской Бой Планирование + 20 1 час. 40 мин.
Повторил работу со статическими переменными и массивами.
Проблем не было.
Все ок.
2016-08-27 12:42 Микроигры VIP урок. Змейка + 20 3 час. 50 мин.
Повторил обработку нажатия клавиш keyPressEvent, работу с таймером QTimer, матрицами boost::ublas, очередью std::queue.
Остановиться в абстракции кода.
В качестве структуры данных для хранения тела змеи использовал очередь.
2016-08-25 16:15 Морской флот ФИНАЛЬНЫЙ УРОК. + 21 30 мин.
Повторил создание видео обзоров.
Проблем не было.
Отличный курс, рекомендую всем, кто хочет познакомиться с работой клиент-серверных приложений. Следующий курс - Морской бой.
2016-08-25 14:26 Морской флот Свежий взгляд. Завершение проекта. + 20 50 мин.
Код знакомый, ранее написанный, повторение пройденного материала.
Сложностей не было.
Все ок)
2016-08-25 00:47 Морской флот Свежий взгляд. Размещение кораблей. + 20 1 час. 15 мин.
Повторение обработки запроса serverShip.
Сложностей не было.
Все ок.
2016-08-24 22:26 Морской флот Свежий взгляд. Ожидание запуска. + 20 30 мин.
Вспомнил более удобный способ установки картинки, для этого изменил тип объекта pictureMain.
Проблем не было.
Как вариант, вместо ручного выделения и копирования содержимого файлов map.cs и server.cs, можно просто скопировать сами файлы в папку нового проекта и подключить.
2016-08-24 17:16 Морской флот Свежий взгляд. Управление из таймера. + 20 20 мин.
Повторил работу с таймером.
Сложностей не было.
Короткий и понятный урок, идем дальше.
2016-08-24 16:18 Морской флот Свежий взгляд. Схема проекта. + 20 1 час. 10 мин.
Повторил процесс создания и настройки формы приложения.
Проблем не было.
Хороший урок, теперь больше ясности в переходах между состояниями игры.
2016-08-24 13:43 Морской флот Финишная миля. Найти победителя + 20 1 час. 10 мин.
Повторение пройденного материала, код на php и обработка перехода между состояниями игры на стороне клиента.
Проблем не было.
Добавил вывод сообщения о результатах игры. Понравился смех Евгения Витольдовича на 17:36, когда программа при старте выдает сообщение с ошибкой:)
2016-08-24 00:39 Морской флот Финишная миля. Мой океан. + 20 1 час. 15 мин.
Повторение пройденного материала.
Проблем не было.
Осталось найти победителя, перезапускать игру и доработать интерфейс)
2016-08-23 15:40 Морской флот Финишная миля. Перезагрузка. + 20 10 мин.
Повторение работы с php-кодом.
Проблем не было.
Простая и полезная функция для рестарта игры.
2016-08-23 15:08 Морской флот Одинокий капитан - Победа! + 20 1 час. 15 мин.
Повторил работу с таймером.
Проблем не было.
Понравилась настройка времени полета снаряда и перезарядки пушки - игра получилась более динамичная.
2016-08-23 01:05 Морской флот Одинокий капитан - Выстрелы + 20 1 час. 10 мин.
Закрепление полученных навыков.
Сложностей не было.
Добились полуавтоматической работы программы: делаем выстрел, жмем кнопку game и получаем результат:)
2016-08-22 23:42 Морской флот Одинокий капитан - Прицел + 20 1 час. 15 мин.
Повторил создание и обработку картинок в GIMP.
Нарисовать картинку с прицелом.
Поймал warning в фабричной функции Box::create, о том, что рассмотрены не все варианты перечисления EnumIcons. Добавил строчку, где case fire для создания объекта FireBox.
2016-08-22 21:43 Демо софт Вам телеграмма! + 21 15 мин.
Установил программу telegram.
Проблем не было.
Все ок.
2016-08-22 20:08 Морской флот Клиентский флот - Класс ServerGame + 20 1 час. 50 мин.
Научился извлекать список записей по тегу из xml
Сложностей не было.
Понравилась работа команды game по параметру last_tick.
2016-08-22 15:53 Морской флот Клиентский флот - Класс ServerFire + 20 2 час. 10 мин.
Повторил пройденный материал, немного почистил код.
Небольшие технические сложности в реализации вызова "делегата".
Основа игры готова, можно пострелять и поиграть. На скриншоте вел игру за 0 океан, читерски подсматривая информацию о размещении кораблей в базе данных:)
2016-08-21 15:03 Морской флот Клиентский флот - Класс ServerShip + 20 1 час. 50 мин.
Повторение работы с матрицами библиотеки boost.
Сложностей не было.
Хороший урок, идем дальше.
2016-08-21 01:16 Морской флот Клиентский флот - Класс ServerInfo + 20 1 час. 50 мин.
Повторение рефакторинга и работы со специализациями шаблонов.
Сложностей не было.
Идея понравилась, использовать наследование для разных типов запросов.
2016-08-20 17:46 Морской флот Клиентский флот - Парсинг XML + 20 1 час. 30 мин.
Познакомился с классами XML, научился простому способу извлечения информации из XML.
Сложностей не было, использовал простой способ извлечения из видео урока, дополнительно почитал про парсинг XML в книге Qt и документации.
Перед просмотром видео я полагал, что мы будем вручную парсить XML, оказалось что нет, взяли готовые классы:) Я тоже не изобретал велосипед, использовал возможности библиотеки.
2016-08-20 14:13 Морской флот Клиентский флот - Подключение к серверу + 20 2 час. 15 мин.
Познакомился с классами поддержки сети в Qt, научился получать данные по url-запросу.
Получить xml-ответ от php-скрипта.
Основа заложена, теперь можно выполнять запросы к серверу и получать простые данные:)
2016-08-18 17:10 Морской флот ПОЛУФИНАЛЬНЫЙ УРОК. Большая игра + 20 1 час. 15 мин.
Повторил создание видео обзора.
Сложным было говорить кратко, время видео отчета больше 10 минут, хотя я старался говорить быстро и вкратце описать работу протокола. При этом, не рассказал многие моменты связанные с перезарядкой и обработкой ошибок. Перезаписывал обзор два раза, не получается уложиться в меньшее время, оставил последний вариант:)
В одном из отчетов я написал, что в данном проекте необходимо больше внимание уделить планированию. Но выполнив несколько следующих уроков по описанию протокола, по запросам SQL, я понял, что поторопился с выводами: с планированием здесь все отлично и результат виден при реализации в php-коде. Отдельное спасибо за экспресс-уроки SQL с демонстрацией результатов запросов.
2016-08-17 22:28 Морской флот Серверный флот - Функция do_game + 20 30 мин.
Повторение, закрепление навыков php, phpmyadmin
Сложностей не было.
Радует работа протокола, теперь дело за клиентской частью.
2016-08-17 16:49 Морской флот Серверный флот - Функция do_fire + 20 1 час. 50 мин.
Использование функции count в php.
Исправление мелких ошибок в SQL-запросах: незакрытая скобка или пропущенная запятая.
Понравилась работа протокола, подготовительная работа по созданию схемы не прошла даром:)
2016-08-16 23:49 Морской флот Серверный флот - Функция do_ship + 20 2 час. 10 мин.
Практика в php, запросы к БД.
Сложностей не было.
Функция получилась длинной, применение внешнего цикла весьма странное, но работает. Нравятся комментарии Евгения Витольдовича о подводных камнях использования php.
2016-08-16 13:16 Морской флот Серверный флот - Капитан очевидность + 20 40 мин.
Использование константы MYSQLI_NUM в качестве аргумента для функции mysqli_fetch_array.
Сложностей не было.
Хороший урок, с примерами использования MYSQLI_NUM и реализацией тиков в функции now_tick.
2016-08-16 11:41 Морской флот Серверный флот - Функция do_info + 20 30 мин.
Использование textarea, функции isset и @.
Сложностей не было, для вывода ошибок и предупреждений изменил файл php.ini, установив error_reporting = E_ALL и display_errors = On
Интересная идея использовать textarea.
2016-08-16 01:03 Морской флот Серверный флот - Рефакторинг РНР-кода + 20 50 мин.
Познакомился с функциями mysqli_errno, mysqli_num_rows.
Сложностей не было.
Хороший урок, быстрый курс по функциям php и способам решения возможных проблем и ошибок.
2016-08-15 23:24 Морской флот Серверный флот - Как PHP дружит с MySQL + 20 20 мин.
Познакомился с новыми функциями работы с базами данных.
Сложностей не было, повторил действия на видео.
Быстрый вводный урок в php, сразу работа с базами данных:)
2016-08-15 22:45 Морской флот Серверный флот - FTP подключение + 20 35 мин.
Повторил использование тега <h1>
Сложностей не было.
Выполнил задание без ftp-подключения: скопировал папку с файлом init.php в веб-директорию сервера Apache2.
2016-08-14 00:35 Морской флот Протокол - Команда GAME + 20 25 мин.
Познакомился с описанием команды game, закрепил навыки из прошлых уроков.
Сложностей не было.
Понравилась идея использовать в SQL-запросе ограничение по времени tick <= $now_tick
2016-08-13 23:40 Морской флот Протокол - Команда FIRE + 20 1 час. 40 мин.
Повторил работу с составлением SQL-запросов.
Сложностей не было.
Хороший урок, несколько раз подробно рассматривается протокол для команды fire, учитываются разные варианты исходных данных от клиента.
2016-08-13 01:25 Морской флот Протокол - Команды INFO и SHIP + 20 2 час. 15 мин.
Повторил создание SQL-запросов и их выполнение в phpMyAdmin.
Сложностей не было, повторял все действия на видео.
Понравилось подробное и ясное описание протокола и то что часть обработки данных выполняется в SQL-запросах.
2016-08-11 22:39 Морской флот Протокол - Список команд + 20 1 час. 15 мин.
Познакомился со схемой протокола обмена данных между клиентом и сервером.
Составить команды клиента и ответы сервера в формате xml.
Интересное самостоятельное задание, составить варианты команд для протокола обмена.
2016-08-11 16:05 Морской флот База Морского Флота - Запросы SQL + 20 1 час. 50 мин.
Практика в SQL-запросах, отличие DELETE от TRUNCATE.
Сложностей не было.
Хороший урок, попрактиковался в SQL-запросах, спасибо.
2016-08-11 00:05 Морской флот База Морского флота - Экспресс SQL + 20 1 час. 20 мин.
Повторил работу с запросами SQL, узнал про SHOW CREATE TABLE.
Проблем не было, материал хорошо объясняется и показывается на практике.
Хороший экспресс-курс в SQL, понравилась демонстрация запросов и было удобно сразу практиковаться на своей базе данных.
2016-08-10 12:47 Морской флот База Морского Флота - phpMyAdmin + 20 2 час. 30 мин.
Установка и настройка mysql, phpmyadmin.
Сложностей не было.
На первом скриншоте содержимое таблицы info, на втором - структура трех таблиц info, ship, game.
2016-08-09 22:28 Морской флот База Морского Флота - GAME + 20 50 мин.
Познакомился со способом хранения realtime-данных игры в таблице базы данных.
Нарисовать таблицу, использовал Libre Office Calc, Draw - аналоги Excel, PowerPoint.
Интересный способ хранения данных в таблице Game.
2016-08-09 21:09 Морской флот База Морского Флота - SHIP + 20 25 мин.
Идея использования составного ключа из трех полей вместо id.
Сложностей не было.
Понравился способ проверки готовности корабля к выстрелу, используя поле CoolTick.
2016-08-09 20:25 Морской флот База Морского Флота - INFO + 20 30 мин.
Идея сохранения настроек игры в отдельной таблице базы данных.
Проблем не было.
Короткий и понятный урок, идем дальше.
2016-08-09 17:31 Морской флот Архитектура - Мышкой по кораблям + 20 50 мин.
Повторил обработку события клика мышки, работу с делегатами.
Проблем не было.
Все хорошо и понятно объясняется.
2016-08-09 12:30 Морской флот Архитектура - Фабрика картинок + 21 35 мин.
Использовать фабрику картинок Box.Create().
Сложностей не было.
Понравилась работа "предохранительного клапана" и простота изменения режимов игры.
2016-08-09 11:21 Морской флот Архитектура - Наследие картинок + 20 1 час. 10 мин.
Повторил работу с ресурсами программы, выводом и позиционированием изображения на форме.
Сложностей не было.
Интересная идея, для каждой картинки создать свой отдельный тип.
2016-08-08 21:35 Морской флот Архитектура - Карта Пиратов + 20 1 час. 20 мин.
Повторил использование "предохранительного клапана" для цикла генерирующего случайное число. Создание матрицы на основе комбинаций значений нескольких типов Enum.
Сложностей не было.
Понравилось создание матрицы Icons на основе Ships и Fires.
2016-08-08 13:48 Комбинаторика VIP. Простые числа. Оптимизация алгоритма + 20 3 час. 10 мин.
Практиковался с алгоритмами поиска простых чисел, реализовал "решето Эратосфена", повторил работу с модульными тестами.
Сложностей не было, в основном мелкие ошибки типов данных и границ поиска.
Проверку функций реализовал с помощью модульных тестов библиотеки boost. Опробовал создание функций isPrime* через некое подобие TDD. Поначалу было трудно привыкнуть, но в итоге понравилось, больше уверенности в работоспособности своего кода.

Выполнил проверку скорости работы функций, как было предложено в уроке, за определенное время: странно, функция isPrimeSqrtP оказалась медленнее, чем ожидалось. Реализовал алгоритм "решето Эратосфена", для ее проверки выбрал другой способ: задаю максимальное число и засекаю время выполнения функций. Результат удивил, алгоритм Эратосфена и isPrimeSqrtP проиграли по времени isPrimeSqrt3. При бОльших границах интервала поиска отставание уменьшается, я полагаю проблема в реализации алгоритма.

Урок понравился, поработал с консолью, тестами, оптимизацией, реализацией алгоритма. Спасибо!:)
2016-08-05 14:41 Комбинаторика Рекурсия. Фракталы. Кривая Гильберта + 20 1 час. 50 мин.
Повторил вывод графики на форму, работу с рекурсией.
Понять рекурсивные функции.
Рекурсивные функции впечатляют, краткие и в то же время емкие. Понравился процесс прорисовки "красных" линий, соединяющих графические элементы, нарисованные на этапе рекурсии более низшей вложенности. Причем из этих же "красных" линий по сути создается весь рисунок.
Спасибо за урок, хорошее объяснение и демонстрация рекурсии, я впечатлен:)
2016-08-04 15:13 Сокобан VIP. Бот для игры БАЛДА + 21 4 час. 20 мин.
Повторил работу с рекурсией, множествами, динамическими массивами.
Рекурсивная функция поиска search.
Данный урок ранее выполнял в предновогоднюю чашку кофе, тогда сроки выполнения задания были сжаты и поэтому мало времени уделил разбору алгоритма. В этот раз времени много, пишу самостоятельно и хотя использовал алгоритм из урока: двойной цикл по матрице, в нем цикл по алфавиту, далее двойной цикл по матрице с подставленной буквой и запуском рекурсии, но часто возникали мелкие недочеты, ручка с тетрадкой хорошо помогли:). Понравилась работа рекурсивной функции и как она "заметает" за собой следы. Оптимизация поиска так же хорошо подошла для этой задачи.
2016-08-01 21:47 Морской флот Архитектура - Перезагрузка проекта + 20 1 час. 30 мин.
Попрактиковался в создании диаграмм на draw.io
Продумать разные варианты архитектуры проекта, в результате остановился на варианте из урока.
На мой взгляд, для этого урока, для планирования, следует выделить больше времени - до часа, с интенсивным обменом мнений между участниками вебинара для объяснения выбора той или иной архитектуры. Конечно, у Евгений Витольдовича есть своя идея, она основная и на ее основе строится будущий проект, чтобы по окончанию вебинара был конкретный результат планирования, а не хаос.

На вчерашнем вебинаре по тетрису Евгений Витольдович как обычно сказал "У вас есть выбор, либо пишете самостоятельно, либо с нами и нашей поддержкой". И еще раз сделал упор на том, что доступ к урокам последовательный. Эти две идеи очень кстати подошли в моем случае для этого урока, так как я чрезмерно продумал архитектуру проекта, излишне обобщил, забегал вперед и готов был самостоятельно написать весь Морской флот. Но я подписывался на этот курс для обучения, получения новых решений в видеоуроках и пошаговом выполнении с небольшими конечными целями. Поэтому советую формулистам не увлекаться изменением архитектуры на первых уроках. К концу проекта, когда уже будет получена реализация, можно придумать свое решение.

P.S. Отчет отправляю повторно, почему-то не могу загрузить новые скрины, сайт подставляет старые скриншоты.
2016-05-07 13:04 Морской флот Анимация - Полёт по таймеру + 20 1 час. 50 мин.
Использование Math.sqrt, динамический расчет времени анимации в зависимости от скорости снаряда и расстояния полета.
Сложностей не было.
В моем случае нет таймера, анимация встроена в сам язык QML и мне достаточно задать начальное, конечное значение переменной и время анимации; удобный подход. Меня не устраивало то, что снаряд двигается с разными скоростями в зависимости от требуемого расстояния, то есть время анимации жестко задано и период срабатывания "таймера" управляет скоростью снаряда. Кроме того, предложенный в уроке способ подбора значений для сокращения чисел в формулах это конечно круто, магия и все дела, но в данном случае движение снаряда описывается обычными физическими законами - кинематикой. Как известно, координаты объекта в случае равномерного движения вычисляются по простой формуле, s = s0 + vt. Необходимо выразить t и установить в качестве времени анимации, остальные переменные известны.
2016-05-06 21:02 Морской флот Анимация - Отображение кадров + 20 2 час. 10 мин.
Создавать анимации перемещения, изменения свойств объектов в QML.
Анимацию перемещения сделал быстро, а вот с анимацией сменой картинок было не так очевидно, первые варианты были громоздкими, искал альтернативы.
От себя добавил настройку конечной цели полета снаряда: место щелчка мышкой. Начало полета - всегда левый верхний угол карты. Получилось интересно.
2016-05-06 11:12 Морской флот Анимация - Полёт снаряда + 20 50 мин.
Масштабировать, поворачивать изображение в GIMP.
Выбрать картинку.
Сделал 20 кадров анимации, на первых кадрах выполняется увеличение ядра и его вращение. В последующих кадрах просто вращение.
2016-05-05 21:32 Морской флот Графика - Рефакторинг + 20 2 час. 20 мин.
Много чему: создавать сигналы, вызывать их, создавать свойства, обращаться к ним, постигал азы модульности в qml+javascript.
Добиться модульности: Графика и Модель игры в отдельных javascript файлах, их вызывает qml файл-контроллер, а его в свою очередь главный qml файл, хитросплетения-велосипеды однако. Еще был момент: весь код написал, все должно было заработать, но не работало. Почитал в книжке по Qt пример, нашел ошибку, исправил, заработало, ура!
Полученным решением доволен, графика и модель игры в разных файлах, независимы друг от друга, тема урока по рефакторингу очень даже оказалась к месту, спасибо.
2016-05-05 10:07 Морской флот Графика - Выстрелы по Кораблям + 20 1 час. 50 мин.
Выводить диалоговое окно с сообщением, немного попрактиковался работе в дизайнере форм.
Особых сложностей не было.
Добавил вывод небольшой статистики: количество выстрелов, попаданий, оставшихся кораблей. Получилась работающая игровая программа, в которую можно поиграть. Идем дальше.
2016-05-04 16:39 Морской флот Графика - Карта Морского флота + 21 2 час. 40 мин.
Создавать аналог enum в javascript. Повторил работу с двумерными массивами.
Создать аналог enum.
Методика Евгения Витольдовича работает: минимум теории, сразу к практике. Теории именно столько, сколько нужно для решения задачи. В итоге, задача решена, однако в голове каша, нехватка некоего стержня или опоры для обобщения знаний. Я так полагаю, что в такие моменты как раз следует немного отвлечься от практики и почитать теорию.
2016-05-04 11:08 Морской флот Интерфейс - А на море корабли + 21 1 час. 10 мин.
Попрактиковался с математическими функциями Math.random, Math.floor в javascript.
Сложностей не было.
Понравился способ выбора случайной картинки.
2016-05-03 13:13 Морской флот Интерфейс - Первый кораблик + 20 2 час. 30 мин.
Обработка событий рисования и клика мышкой в технологии QML.
Нарисовать картинки при клике мышкой.
В качестве эксперимента, решил создавать клиентскую часть игры с использованием технологии QML. Интерфейс формы описывается на декларативном языке, а логика динамической прорисовки и обработки кликов мышки реализована на JavaScript.
2016-05-03 09:06 Морской флот Вступление + 20 2 час. 10 мин.
Повторил работу с редактированием изображений.
Найти и подготовить картинки.
Понемногу осваиваю работу в редакторе GIMP, полезный навык.
2016-04-28 19:24 Микроигры VIP урок. Стрелялка + 20 3 час. 10 мин.
Воспроизводить звук.
Подготовить ресурсы для игры: картинки и звуки.
Выполнил два дополнительных задания: создал требуемый базовый класс Zero и добавил звуки на выстрел и попадание. Перенес управление кораблем на клавиатуру: влево - стрелка Влево, вправо - стрелка Вправо, выстрел - Пробел. От себя добавил счетчик количества выстрелов и попаданий.
2016-04-26 12:11 Микроигры ФИНАЛЬНЫЙ УРОК + 20 30 мин.
Повторил создание видео обзора.
Не было.
Курс понравился, спасибо! :)
2016-04-26 10:02 Микроигры VIP урок. Формула 1 + 20 1 час. 20 мин.
Повторил работу с загрузкой ресурсов, обработкой событий клавиатуры.
Не было.
Понравились формулы для заднего хода и расчета углов поворота, кратко и понятно.
2016-04-25 14:38 Микроигры Крестики-Нолики. Игра с компьютером + 1 3 час. 50 мин.
Повторил работу с STL алгоритмами поиска, подсчета элементов, созданием своего функтора поиска выигрышной линии.
1) Реализовать асинхронный выбор ячейки для Игрока-Человек.
2) Выиграть у компьютера игрой ноликами (второй скриншот).
Логика работы игры Крестики-Нолики была написана в прошлом уроке. Мне не хотелось менять, ломать, модифицировать работающий код.  По сути, нет разницы кто играет, человек или компьютер, правила игры от этого не меняются. Главное, чтобы игрок мог посмотреть на игровое поле, оценить ситуацию и сообщить координаты хода. Поэтому искал решение, пришел к похожему варианту, предложенному во второй части курса ООП. Выделил интерфейс Игрок, реализовал его в двух классах Игрок-Человек и Игрок-Компьютер. Добавил новую оболочку для Логики, которая принимает ввод от Игрока и перенаправляет его Логике. Здесь были некоторые проблемы со вводом от Игрока-Человека, так как он асинхронный. Алгоритм Компьютера не менял, взял из урока.

Результатом доволен, понравилось играть с компьютером :)
2016-04-22 14:59 Микроигры Крестики-Нолики. Игра на двоих + 20 2 час. 10 мин.
Повторил настройку формы, создание меню, горячих клавиш.
Подобрать три картинки для фона, крестика и нолика.
Понравился способ проверки состояния игры, сразу после хода игрока. В этом случае нет необходимости проверять все строки и столбцы, а только те, на которые был совершен ход. Для игры 3 на 3 это не имеет особого значения, но для матриц большого размера разница в производительности уже будет давать о себе знать, спасибо за идею.
2016-04-21 00:29 Игры со словами Виселка. Алгоритм помощника + 20 15 мин.
Повторил работу с формой, свойства объектов.
Не было.
Программу написал в прошлом уроке, в этом без особых изменений. Как было предложено в уроке, добавил вывод дополнительной информации - количество найденных слов по шаблону и количество слов, в которых встречается рекомендуемая буква.
2016-04-20 02:30 Игры со словами Виселка. Блоксхема помощника + 20 3 час. 40 мин.
Повторил работу с формой, созданием блок-схем.
Продумать и создать интерфейс программы.
В уроке была идея расширить игру, добавить в нее код помощника для сообщения возможных комбинаций слов и подсказки следующей буквы. По предложенному алгоритму я написал свою реализацию, подсказки выводил в консоль. Алгоритм работал, все устраивало, но хотелось доработать. Поэтому я создал новую программу, отдельно от игры. Достаточно долго продумывал интерфейс бота. Остановился на таком решении: пользователь в верхней части формы с помощью списка combobox выбирает буквы и составляет искомый шаблон слова, там где буквы неизвестны устанавливает "." В средней части формы расположены кнопки, они необходимы для того, чтобы вводить в программу те буквы, которых нет в слове, то есть бот предложил букву, пользователь ее ввел в игру, а ее не оказалось в слове (на втором скриншоте это буквы О и Е). Для безопасности добавил синхронизацию ввода между верхними combobox и нажатыми кнопками, все можно сбросить, перенастроить, сменить длину слова. Внизу формы выводится список слов, рекомендуемая буква и кнопка запуска бота. Словарь использовал тот же самый, из игры. В итоге, доволен программой, бот значительно упрощает поиск слов.
2016-04-18 19:35 Игры со словами Виселка. Поле чудес + 1 3 час. 50 мин.
1) Создавать файлы ресурсов.
2) Загружать данные из файла, работать со списком строк.
3) Повторил работу с настройкой интерфейса программы.
Создать желаемый интерфейс программы.
Данный урок ранее выполнял в предновогоднюю чашку кофе. Для закрепления решил создать новую программу. Написал с нуля, достаточно долго настраивал интерфейс. Целью было создать схожую внешне программу с предновогодней версией. Были проблемы с компоновкой, фоном, рамок вокруг меток. Я принципиально сделал упор на автоматическую компоновку объектов на форме, то есть, без ручного подсчета координат и размеров виджетов. Объекты сами рассчитывают свои размеры, а я лишь задаю описание, например, объект картинка "должен занимать весь левый угол формы", объект загадываемое слово "правую и верхнюю часть формы". В Windows Forms для этого используются Dock, Anchor, TableLayoutPanel.
Вообще говоря, думаю следует копать в сторону максимальной изоляции кода формы от кода логики, напрягает их смешивание. На ум приходит использование декларативного описания элементов формы с помощью qml + javascript. Если не ошибаюсь, в C# для этого используется WPF.
2016-04-15 11:06 Микроигры ПОЛУФИНАЛЬНЫЙ УРОК + 20 30 мин.
Повторил создание видео обзоров.
Не было.
Хорошие игры получились, спасибо :)
2016-04-15 01:30 Микроигры 2048 - Смещение + 22 3 час. 50 мин.
Повторил работу с рекурсией.
Понять работу рекурсивных функций shift и combine, организовать прорисовку меток через самописный делегат и исправить небольшие недочеты с табличной компоновкой.
Во время написания кода прокачался в некоторых технических аспектах, поработал с "делегатами". В моем случае табличная компоновка не сказывалась на скорости отрисовки матрицы меток, поэтому оставил. Понравились рекурсивные функции - красиво. В итоге, хорошая игра в копилочку, есть куда расширять и улучшать.
2016-04-14 01:24 Микроигры 2048 - Интерфейс + 20 1 час. 50 мин.
Обработка события нажатия клавиши, повторил работу с табличной компоновкой виджетов.
Подобрать цвета меток.
Интересный способ подбора цветов в цикле, правда не совсем точный и непросто подобрать желаемые цвета.
2016-04-13 00:31 Микроигры 2048 - Учимся играть + 20 1 час. 40 мин.
Играть в игру 2048.
Набрать 1024 или 2048.
Интересная игра, захватывает. Ранее не играл в нее. Руководствовался советами Евгения Витольдовича из видеоурока, это сильно помогло.
2016-04-12 17:55 Микроигры Игра 15 - Картинка + 20 3 час. 10 мин.
Разрезать картинку на фрагменты.
Абстракции... Вовремя остановиться :D Заметил, что код в играх пятнашки и пазл практически идентичен. Хороший посыл для наследования. Кроме того, в следующих уроках будет игра 2048, где по сути выполняются те же действия с объектами и можно будет обобщить. Но я решил не торопиться и сначала получить конкретные классы всех трех игр и потом уже смотреть есть ли смысл выделять общий интерфейс.
В уроке убрали одно условие и все - новая игра - пазл! Это здорово. Для игры пятнашки думаю не стоит использовать картинки, отвлекают от сути, а в пазле самое то. Поэтому на скриншотах игра пазл 5 на 5. Вне задания поработал над кодом, потребовалось расширить свой шаблон Matrix для классов без конструктора по умолчанию и для классов с запрещенными операциями копирования, например std::unique_ptr.
2016-04-10 14:16 Микроигры Игра 15 - Алгоритм + 20 2 час. 40 мин.
Интересному способу случайного перемешивания кнопок в игре 15.
Пройти игру :)
Понравился способ перемешивания кнопок в функции shift_random(), здорово придумано :) Так же было интересно посмотреть на реализацию функции перемещения кнопок при клике мышкой - решение простое и понятное, без анимаций - сброс значения свойства visible для требуемой кнопки.
В этом уроке вновь встретил двумерные массивы, поэтому решил добавить более удобный интерфейс для доступа к данным и поэкспериментировать. Создал класс Matrix в котором в качестве представления данных использовал одномерный динамический массив STL vector, перегрузил оператор () для доступа по индексам строк и столбцов, превратил класс Matrix в шаблон. Мои эксперименты не входили в урок, но были полезными; в итоге, повторил работу с generic кодом.
2016-04-09 16:39 Микроигры Игра 15 - Кнопки + 20 50 мин.
1) Размещать объекты на форме с использованием QGridLayout (аналог TableLayoutViewer в Windows Forms).
2) QSignalMapper - отображение сигналов нажатия различных кнопок в один слот-функцию обработчик нажатия ( аналог "одной функции на нажатие любой кнопки" в Windows Forms)
Создать табличное размещение кнопок на форме и реализовать обработку нажатия в единственной функции-обработчике.
Короткий и ясный урок, идем дальше.
2016-04-01 21:44 Теория ООП Интерфейс. VIP. Тяжёлая дружба кругов и квадратов. + 20 3 час. 00 мин.
Поэкспериментировал с интерфейсами, повторил создание видео обзоров.
Выбрать какое-то одно решение проблемы на проверку пересечения объектов.
Проблему проверки пересечения объектов решил немного другим путем, с помощью интерфейса Boundable, который требует, чтобы реализующие его объекты определили ограничивающие круги и прямоугольники вокруг фигуры. Это позволяет сравнивать не сами объекты со сложной конфигурацией, а упрощенные элементы, например, такие как круги. Для того, чтобы добавить нового игрока в игру, достаточно описать список этих ограничивающих поверхностей, а другие функции более высокого уровня уже работают не с самими объектами, а их границами, таким образом нет тесной связи между типами. Да, проверка получается грубее и менее точная. Здесь можно было бы изменить начальный интерфейс, но я пошел другим путем, оставил все как есть и искал куда бы добавить свой интерфейс Boundable. Мое решение так себе, пока не знаю как сделать лучше, но это позволяет создавать новых игроков и не беспокоиться об их сравнении с другими игроками. Для верности, добавил двух новых игроков с более сложной конфигурацией.

Курс понравился, стоит пересмотреть еще раз, так как многие "очевидные" моменты открываются с новой стороны. Спасибо, Евгений Витольдович!
2016-03-31 01:31 Теория ООП Интерфейс. VIP. Пересечение прямоугольников. + 21 1 час. 20 мин.
Условие пересечения прямоугольников.
Сложностей не было.
Поначалу решил, что предложенная в уроке функция проверки пересечения двух прямоугольников рассматривает только один частный случай, слишком уж "простая" она на вид. Однако проверил на практике - работает. Здесь я предположил, что боксики двигаются слишком быстро, поэтому в какой-то момент срабатывает "то самое" частное условие и боксик голится. Я не верил, что это решение корректное. Для полной проверки нужно было замедлять боксики и проверять на глаз пересечения, но мне не хотелось этим заниматься.

Я уже хотел было отправить отчет, но тут вспомнил совет Евгения Витольдовича, что следует довести дело до конца. Тут осенило, думаю, дай-ка создам unit-тесты на функцию isIntersect и проверю все возможные варианты пересечений и не пересечений. В итоге, нарисовал на бумаге разные варианты расположения прямоугольников, получалась 31 комбинация, создал для каждой из них свой тест, каждый тест запускал по мере написания и меня каждый раз шокировало, что функция-то работает:D На втором скриншоте показаны результаты выполнения 31 теста, все проходят. Подумал, может в Qt какая-нибудь бага, регрессировал код тестируемой функции, добавил в нее ошибку и тесты посыпались как надо, чудо. В общем, функция Евгения Витольдовича работает как надо.

Позже я еще раз логически проанализировал функцию проверки и да, тут уже понял, что код корректен. Первое впечатление оказалось обманчивым, следует внимательно читать код. Хороший урок для меня.
2016-03-30 16:50 Теория ООП Интерфейс. VIP. Квадратики тоже хотят играть. + 25 4 час. 10 мин.
Повторил применение интерфейсов.
Реализовать функцию пересечения прямоугольников.
Данный урок выполнил в Linux Mint с использованием Qt. Я давно интересовался Linux, неделю назад установил себе на компьютер и теперь осваиваю работу в этой ОС. Вчера получил письмо от Евгения Витольдовича с предложением закончить курс ООП, Согласился, продлил курс, но решил выполнить задание с использованием C++ Qt. Программу писал с нуля, по памяти и это большой плюс для меня, так как в завершении совершенно другими глазами смотрел на код Евгения Витольдовича и оценивал как он решал те или иные архитектурные задачи. В целом, функционально код во многом совпал, но структурно были отличия, позже корректировал с учетом решения в видеоуроке. В конце урока было предложено реализовать функцию пересечения прямоугольников, это было сделано, на скриншотах результаты игры GameVirused с "боксиками".

P.S. Евгений Витольдович, я хочу продолжить обучение с использованием своих инструментов разработки, Вы это одобряете? То есть, функционально я буду выполнять требования из видеоуроков, получать навыки программирования, но с помощью C++.
2016-03-06 16:34 Комбинаторика ФИНАЛЬНЫЙ УРОК + 20 25 мин.
Повторил создание видео обзоров.
Кратко рассказать про программу заливки области.
Курс очень понравился, спасибо, Евгений Витольдович :)
2016-03-06 15:27 Комбинаторика Динамика. Выход из Лабиринта + 20 1 час. 20 мин.
Повторил работу с очередью Queue, поиском в ширину в графе.
Сложностей не было.
Данную тему ранее проходил в курсе Сокобан, здесь было повторение и закрепление.
2016-03-03 20:58 Комбинаторика Динамика. Счастливые билеты 20 + 20 3 час. 10 мин.
Увидел применение динамического программирования для решения задачи поиска счастливых билетов.
Разобраться в алгоритме поиска счастливых билетов, а конкретнее, переход от N к N + 1.
Очень достойный урок, просмотрел его дважды, прежде чем понял всю суть. Наглядно показано, как использование другого алгоритма в несколько раз повышает скорость работы программы.
2016-03-01 17:09 Комбинаторика Динамика. Поле дураков + 20 35 мин.
Познакомился с динамическим программированием.
Сложностей не было.
Понравился метод решения задачи, наглядно и понятно. Большой плюс в том, что для пояснения был использован Excel для пошаговой демонстрации алгоритма.
2016-02-23 17:59 Комбинаторика Комбинаторика. Математические операции + 22 2 час. 30 мин.
Повторил работу с рекурсией, неплохо закрепил полученные навыки во время создания класса калькулятора.
Реализовать свой класс калькулятора.
Калькулятор реализовал с использованием грамматики(на втором скриншоте слева): Expression отвечает за вычисление суммы/разности, Term - произведение, Number - составление числа из цифр, разделенных пробелами. Все операции левоассоциативны, приоритеты реализованы с помощью рекурсивных вызовов функций Term, Number.
2016-02-22 21:42 Комбинаторика Комбинаторика. Сложение букв + 20 1 час. 30 мин.
Повторил работу с рекурсией, с методами поиска/замены символов в строке.
В целом, сложностей не было, все хорошо объясняется, но поначалу разбирался с алгоритмом решения задачи.
Рекомендую всем, кто проходит данный курс, обратить внимание на предложенное в видеоуроке рекурсивное решение второй задачи, "пропустить через себя", разобраться от начала до конца, понять ход оптимизации. Емкий алгоритм, три массива неплохо закручены между собой, и каждая строчка кода несет много смысла.
2016-02-20 16:31 Комбинаторика Комбинаторика. Много ферзей. Демонстрация + 20 3 час. 20 мин.
Повторил работу с рекурсией, созданием графического интерфейса программы.
Написать программу демонстрации алгоритма.
По сути, в прошлом уроке уже был представлен алгоритм решения задачи для N ферзей, в этом уроке было повторение. И дополнительно было предложено написать программу демонстрации алгоритма в консольном режиме. Я решил, что в графическом режиме это будет нагляднее и написал Windows Forms приложение. Информацию выводил в динамическую матрицу pictureBox.
2016-02-17 23:20 Комбинаторика Комбинаторика. 4 x 4. Ладья x Ферзь + 21 1 час. 20 мин.
Поиск с отсечением - исключение избыточных комбинаций вызовов рекурсивной функции.
Расчет индексов диагоналей в булевых массивах.
Интересное решение - использовать проверку условий отсечений с помощью трех булевых массивов. Это достаточно явно отображает словесный алгоритм в программном коде.
2016-02-11 23:13 Комбинаторика Комбинаторика. Счастливые билеты N + 20 1 час. 15 мин.
1) Закрепил навыки работы с рекурсией;
2) Познакомился с интересным вариантом вызова рекурсивной функции в цикле;
3) Поработал с оптимизацией алгоритма, перенос локальных переменных в область определения класса хоть и не имеет логической полезности, но дает прирост в производительности.
Материал хорошо объясняется, сложностей не было.
Хороший урок, мне понравился, понятны плюсы и минусы рекурсии. Тест N=5 не прошел по тайм-ауту, поэтому, как и предложил Евгений Витольдович, посчитал в Visual Studio (второй скриншот) количество счастливых билетов при N=5 и указал в коде полученное значение.
2016-02-11 20:41 Комбинаторика Комбинаторика. Счастливые билеты 6 + 20 10 мин.
Оптимизация алгоритма путем замены цикла условием.
Понять оптимизацию алгоритма.
Идем дальше.
2016-02-08 19:56 Комбинаторика Рекурсия. Обратный отсчёт + 20 15 мин.
Алгоритм обратного отсчета с использованием рекурсии.
Сложностей не было.
Красиво, без массивов и циклов, рекурсия впечатляет.
2016-02-08 19:32 Комбинаторика Рекурсия. Общий делитель + 20 20 мин.
Повторил алгоритм расчета НОД двух чисел с помощью алгоритма Евклида.
Сложностей не было.
В условии было указано решить с помощью вычитания двух чисел, но один тест не проходил - причина была переполнение стека, проверил на Visual Studio. Переделал алгоритм, с использованием операции взятия остатка от деления - тест прошел.
2016-02-08 18:59 Комбинаторика Рекурсия. Числа Фибоначчи + 21 10 мин.
Алгоритм расчета числа Фибоначчи с использованием рекурсии.
Сложностей не было.
Идем дальше.
2016-02-08 18:47 Комбинаторика Рекурсия. Факториал + 20 10 мин.
Повторил алгоритм расчета факториала числа с использованием рекурсии.
Сложностей не было.
Короткий и понятный урок, идем дальше.
2016-02-06 23:27 Комбинаторика Рекурсия. Заливка области + 20 2 час. 15 мин.
Стал лучше понимать рекурсию, повторил работу с выводом информации на консоль.
Понять алгоритм рекурсивной заливки.
Евгений Витольдович, благодарю за этот прекрасный пример объяснения работы рекурсии, все наглядно и понятно.

Однако первоначально не все было очевидно. Логически-то понятно, например, сначала закрашиваем вверх, потом вниз, потом влево, потом вправо и если дошли до тупика (то есть, условие выхода из рекурсии - закрашенная клетка), то тогда рисуем звездочку и выходим из функции. И технически было понятно, что тут используется своего рода механизм "раскрутки" стека и поэтому мы всегда знаем куда вернемся, главное, чтобы было определено условие выхода из рекурсии.

Были проблемы другого рода: понять, как все это вместе работает, особенно когда вложенность вызовов становится большой :) Поэтому решил пошагово проверить работу алгоритма, вместо Thread.Sleep() написал Console.ReadKey() и медленно, но верно смотрел что выдает программа при каждом вызове функции. Здесь еще хорошо подошло то, что показывается направление следующего хода, очень наглядно. В итоге, доволен результатом, спасибо :)
2016-02-06 00:59 Комбинаторика Рекурсия. Главный секрет + 20 55 мин.
Узнал 2 секрета рекурсии: 1) определить условие ее завершения, простейший вариант решения; 2) определить переход от N к N + 1.
Нарисовать кривую Гильберта.
Интересное начало, насыщенный по темам курс.
2016-02-05 21:19 Комбинаторика Рекурсия. Вступление + 20 10 мин.
Посмотрел интересные картинки по теме рекурсия :)
Выбрать две картинки.
Рекурсия в программировании - это вызов функции из тела этой же самой функции.
2016-01-28 19:36 Сокобан ФИНАЛЬНЫЙ урок. Видео-обзор проекта Сокобан + 21 40 мин.
Повторил создание видео обзоров.
Кратко рассказать про пройденный курс)
Данный курс я начал проходить во время новогоднего марафона программиста, где была хорошая поддержка Евгения Витольдовича и марафонцев. В целом, очень достойный курс, хорошие дополнения, такие как автоходы, игра на двоих, по сети. Спасибо, Евгений Витольдович!)
2016-01-28 16:25 Сокобан Сокобан - Завершение + 20 2 час. 20 мин.
Закрепил полученные знания по прошлым урокам.
Сложностей не было.
Поначалу хотел переписать весь код, сделать его более абстрактным, расширяемым. Потом понял, что в итоге у меня получится ситуация, аналогичная консольным программам в этом курсе: да, будет абстракция, да, все по полочкам и слабо зависит друг от друга, но толку от этого? Акцент в тех программах был на алгоритмах, а не на жонглировании кодом, поэтому в этот раз решил принять предложенный финальный вариант. В дальнейшем буду уделять внимание алгоритмам, функционалу, возможностям программ, а в коде стремится к простоте, как было отмечено во время марафона. Для решения проблемы с архитектурными излишествами и терзаниями уже пора бы "нормально" прочесть старые-добрые книжки Коплиена, GoF, GRASP и поставить наконец-то эту жирную точку)
2016-01-26 19:57 Сокобан Сокобан - Игра - На двоих по сети + 20 1 час. 50 мин.
Создал сетевую версию игры "Сокобан".
Сложностей не было.
Интересный урок, в котором наглядно показано использование "абстрактного" (имеется ввиду не привязанного к конкретной предметной области или приложению) класса Phone для расширения возможностей уже существующей игры.
2016-01-15 18:03 Сокобан Сокобан - Телефон - TCP/IP протокол + 20 1 час. 10 мин.
Повторил работу с нитями (Thread), с передачей данных между клиент-серверными приложениями.
Сложностей не было.
Данный урок ранее выполнял в качестве VIP-урока по курсу Игры со спрайтами. Решил пройти еще раз, для закрепления. Материал был знакомый, в этот раз оценил удобство использования делегата для асинхронного вывода информации о получении данных.
2016-01-14 23:44 Сокобан Сокобан - Игра - На двоих + 20 30 мин.
Обработке нажатия цифровых клавиш NumPad.
Сложностей не было.
Здесь хорошо подошла идея использовать два массива map и top. Несколько изменений в коде и в результате новая игра, здорово)
2016-01-14 22:56 Сокобан Сокобан - Редактор - На двоих + 20 2 час. 40 мин.
Проверка на существование файла File.Exists(), в случае отсутствия создание пустого файла.
Сложностей не было.
Понравилось то, что создание редактора для новой игры потребовало небольших изменений. От себя добавил 10 уровней, разной сложности, на скриншотах показаны первые два. Интересная задумка, игра на двоих: здесь можно реализовать как соревнование, так и кооперацию)
2016-01-13 22:22 Сокобан Сокобан - Игра - Автоходы + 20 1 час. 20 мин.
Самостоятельно изучил индексаторы в C#.
Работа с индексами двумерных массивов. Эта проблема идет с самого начала проекта Сокобан, после того, как я решил использовать в качестве первого индекса двумерных массивов - номер строки, а второй индекс обозначает номер столбца. В дальнейшем, ситуация стала критической - в программе обработка данных ведется как пара (x, y), а обращение к элементам массива как (y, x). Во время выполнения этого урока несколько раз ошибочно путал местами x, y. Меня это утомило, настало время навести в этом порядок и выполнить унификацию доступа. В предыдущих уроках я создал класс Level, для хранения информации о загруженном уровне. Для унификации доступа было необходимо добавить некий промежуточный слой между пользователями Level и хранящейся в нем  матрицей уровня. Этот промежуточный слой должен выполнять преобразование координат из (x, y) в (y, x). Для удобного доступа к данным и прозрачного преобразования координат искал нечто подобное перегрузке оператора []. В C# для этого используются индексаторы. Почитал материал, попробовал на двумерном массиве и все получилось. Теперь везде доступ по x, y. Вздохнул свободно)
Интересное дополнение, автоходы значительно экономят время, спасибо)
2016-01-12 17:03 Сокобан Сокобан - Решалка - Оптимизация + 20 35 мин.
Оптимизировать алгоритм поиска траектории движения для игры Сокобан.
Сложностей не было.
Да, результат впечатляет, хорошая оптимизация поиска. На первом скриншоте представлен результат работы алгоритма с использованием List<>. На втором скриншоте - результат работы оптимизированного алгоритма, с использованием четырехмерного массива. В первом случае время решения 69 мс, во втором - 4 мс.
2016-01-10 02:18 Сокобан Сокобан - Решалка - Яблоко + 20 2 час. 10 мин.
Повторил работу с двумерными массивами.
Сложностей не было.
Несколько раз натыкался на небольшие неточности в использовании своего кода. Все-таки, сначала нужно хорошенько составить публичный интерфейс класса, его корректное использование, чтобы в дальнейшем при обращении к этому объекту не задумываться о каких-то хитрых связях внутри объекта. Для этого, нужно при создании класса изолироваться от остального мира классов, рассматривать все локально, накинуть юнит-тесты и только потом собирать все воедино. В моем случае получилось несколько стихийно, что затормозило разработку.
2016-01-09 01:27 Сокобан Сокобан - Решалка - Мышка + 20 4 час. 15 мин.
Повторил алгоритм поиска в ширину, увидел его реализацию с использованием очереди.
Был момент, когда мое решение не работало. Искал причину, ошибка была в том, что у нас в этой программе используется один массив для статических и динамических объектов. Поэтому когда игрок достигал целевой точки, то вставал на ее место и она исчезала из карты. Решил с помощью дополнительных переменных, но решение с двумя массивами лучше.
На этот раз решил поэкспериментировать, разделить код по классам. Полученным решением более-менее доволен, уже можно расширять и создавать новые программки из этих маленьких кирпичиков.
Немного расширил функционал программы, добавил меню, возможность установки позиций игрока и целевой точки, расчет по этим точкам траектории движения и пошаговый режим к целевой точке.
2016-01-08 02:27 Сокобан Сокобан - Решалка - Тестер + 20 2 час. 15 мин.
Поработал с консольным выводом, научился изменять положение курсора, цвет выводимого текста.
Сложностей не было.
По-другому организовал код: написал класс SokobanTester, создал его экземпляр в статичном методе Main.
Придумал тестовый уровень, написал для него решение. Поработал с выводом информации на консоль. Для удобства проверки решения, символ следующего шага выделен желтым цветом.
Урок понравился, теперь знаю некоторые способы удобного и красивого вывода информации в консоль, спасибо)
2016-01-07 04:12 Сокобан Сокобан - Игра - Управление + 21 2 час. 40 мин.
Идея использовать два массива: статичных и динамичных объектов.
Насколько знаю, в C# операция присваивания для объектов означает просто копирование ссылки. Я привык (привет, C++ где бОльший контроль над объектами), что если адекватный автор неполиморфного класса разрешил и перегрузил конструктор копирования и оператор присваивания по lvalue reference, то при копировании выполняется deep copy содержимого. Напоролся на разницу в семантике двух языков, в своем написанном коде минут 15 думал, почему же данные затираются. Все работает, а данные кривые. Опять-таки, помог отладчик. Наверняка в C# есть встроенные возможности по копированию, deep или shallow, пока что не сталкивался и не изучал, двоечник)
Мне понравилась идея использовать два массива, один для неподвижных объектов, другой для подвижных. Написал все по уроку, понравился класс Game, все аккуратно. Уже в конце урока пошли дополнения, разные варианты, с чата предлагали решение проверки на доступность уровней. Код проверки, на мой взгляд, оказался не в том месте, этим должен заниматься класс Game, поэтому переделывал по себя. Попутно взялся за свой класс загрузчика уровня, наконец, довел его до состояния, с которым мне удобнее работать. Позже изменю метод save, он у меня не ахти - длинный, некрасивый и дублирует код. Все-таки здорово, когда уже есть функционал, которым можно крутить как угодно. Писать с нуля сложнее, надо много думать об интерфейсе клиента и прочее.
Интерфейс игры пока что не менял, есть где вести доработки, например фон Белки, когда она стоит на плитке-кладовке. Данила предложил подумать над плитками. Ждем разбора полетов на следующем вебинаре)
Игра понравилась, здорово, спасибо Евгений Витольдович, база отличная, теперь идем дальше, к улучшениям и триксам)
2016-01-06 20:57 Сокобан Сокобан - Игра - Интерфейс + 20 1 час. 20 мин.
Поработал с компонентом LinkLabel.
Сложностей не было.
Вместо кнопки использовал LinkLabel, установил прозрачный фон, убрал подчеркивание, думаю так смотрится лучше) Будет интересно посмотреть на класс Game и использование делегатов. Думаю реализация будет аналогичной как в игре "Домино" из курса "Игры со спрайтами".
2016-01-06 17:37 Сокобан Сокобан - Создаём свои уровни + 20 1 час. 40 мин.
Повторил работу с редактированием уровней, улучшил интерфейс программы.
Придумать два уровня игры Сокобан.
От себя добавил два уровня, которые представлены на скриншотах, в интернете нашел 12 уровней, все сохранил в файл levels.txt.
Во время создания уровней обнаружил некоторые недочеты в своем оформлении, коде. Например, у меня в программе из предыдущего отчета при смене уровня не обновлялись счетчики установленных орехов и кладовок, это критично. Изменив это, обнаружил новый недочет. Так как в разных уровнях установлены разные количества орехов и кладовок, то метки с описание счетчиков автоматически расширялись и сужались в зависимости от текста, например, 1x и 10x имеют разную ширину вывода. Это приводило к тому, что панель инструментов "бегала вправо-влево" и когда быстро щелкал на правую стрелку, чтобы перейти к последним уровням, то "по ошибке" попадал на стрелку влево. Поэтому установил у меток-счетчиков орехов и кладовок свойство AutoSize на False и подобрал достаточное абсолютное значение ширины. Далее, установил минимальные значения ширины и высоты формы, чтобы не сворачивалась верхняя панель инструментов.
2016-01-06 02:17 Сокобан Сокобан - Редактор - Улучшение + 20 2 час. 10 мин.
Повторил работу с toolStrip, toolStripComboBox.
Понять, как сделать значения из списка toolStripComboBox доступными только для чтения.
Понравился способ добавления сразу нескольких элементов на поле игры.
Внес небольшие изменения, поставил перед собой цель - ограничить выбор и установку значения ширины и высоты уровня в допустимых пределах, то есть, разрешить ввод только числовых значений и организовать проверку случая выхода за границы интервала минимального и максимального размера уровня. Сначала хотел добиться этого путем создания дополнительного кода: просто брать данные из textBox и парсить, но хотелось другого решения, с помощью средств компонентов Windows Forms. Решение оказалось простым - компонент toolStripComboBox. Для того, чтобы игрок не мог ввести буквы и число вне диапазона, установил значение свойства DropDownStyle = DropDownList, и благодаря этому данные из toolStripComboBox оказались доступными только для чтения и возможный выбор размера ограничен моим заранее созданным списком значений. Осталось дело за малым, корректно заполнить список элементов списка и в дальнейшем обрабатывать выбранное значение.
2016-01-04 19:30 Сокобан Сокобан - Редактор - Сохранение + 20 1 час. 50 мин.
Повторил работу с загрузкой/сохранением данных в файл.
Ошибка при сохранении файла - выход за границы массива, когда обращался к старому массиву строк по индексам нового, расширенного массива. Просто посмотрев код не понял причину, помог отладчик)
Я выбрал немного другой способ сохранения игровых уровней в файл, написал код с нуля, использовал второй массив new_lines, который заполнял в трех циклах: первый цикл - это копирование уровней из lines до строки сохраняемого уровня, второй цикл - это копирование содержимого cell, то есть сохраняемого уровня, третий цикл - это копирование оставшихся уровней. По сути то же самое, что по уроку, но мне мой вариант проще понимается, хотя с индексами второго массива немного засиделся.
Здорово, у меня теперь есть полноценный редактор уровней игры Сокобан!)
2016-01-04 01:01 Сокобан Сокобан - Редактор - Редактирование + 20 1 час. 50 мин.
Повторил работу с ToolStrip, сохранение данных в Tag картинки и ее дальнейшее использование, в этом уроке сохраняли информацию типа Point.
Сложностей не было, немного меняю код, появляются небольшие несостыковки, эксперименты.
Интересный урок, хорошо видна связь между тем, что крутится в программе и тем, что показывается на экране формы. От себя немного изменил код, константы размеров поля перенес в свой класс, переименовал методы и переменные. Как временное решение перенес двумерный массив cell в класс и сделал его открытым для чтения и модификаций. Проверку на размерность поля вынес в конструктор класса Game_area, если инвариант проваливается, то вылетаем с эксепшеном и на другом конце провода ловим его в специальном методе create_game_area, который показывает MessageBox с ошибкой и возвращает прежние параметры поля.
2016-01-03 22:09 Сокобан Сокобан - Редактор - Интерфейс + 20 2 час. 10 мин.
Познакомился с компонентом ToolStrip.
После редактирования кода искал ошибку форматирования, как оказалось, проблема была в том, что в файле сначала идет число столбцов, потом число строк, в программе же я считывал наоборот.
По предложению Евгения Витольдовича хотел добавить 4 картинки для игрока, но потом решил, что это будет отвлекать. Поэтому выбрал другой путь, нашел другую картинку Белки, где она смотрит прямо. Немного подкорректировал картинки, чтобы орехи и Белка были на фоне снега. Написал по видео уроку программу, запустил, результат понравился) Правда, как Илья говорил, все мелко, если это окажется критичным, то переделаю.
Код немного переделал, добавил несколько служебных pod-классов, переименовал переменные, методы.
2016-01-03 02:19 Сокобан Сокобан - Редактор - Загрузка + 20 50 мин.
Повторил работу с двумерными массивами в C#, построчное считывание данных из файла.
Сложностей не было.
Не так давно выполнял видеоурок по составлению расписания, узнал, что компонент DataGridView индексирует данные вертикально, что было для меня неудобным. Здесь вновь столкнулся с этим) Для меня непривычно, когда матрицы заполняются вертикально (т.е. первый индекс это столбец, а второй строка), приходится напрягаться, чтобы лучше ориентироваться что и где находится.  Я привык, что многомерные массивы - это массивы вложенных массивов, а в случае двумерного массива или матрицы - это массив одномерных массивов, где первый индекс - это номер строки (то есть, номер вложенного массива), а второй индекс - это номер столбца (то есть, индекс во вложенном массиве) и заполнение идет горизонтально.
2016-01-02 23:10 Сокобан Сокобан - Подготовка - Картинки и лабиринт + 21 1 час. 20 мин.
Скачал Paint.net, научился накладывать несколько рисунков друг на друга, создавать прозрачный фон у изображения.
Найти 6 подходящих картинок, тематика - Белка из Ледникового периода)
Достаточно долгое время выбирал картинки, подгонял их под размеры. До этого не сталкивался с такими задачами, как прозрачное выделение и накладывания картинок друг на друга, а в этом уроке потребовалось научиться. Погуглил, ссылки вывели на использование программы Paint.net, скачал ее, сделал по инструкции для чайников, заработало)
2016-01-02 21:15 Сокобан Сокобан - Вступление + 20 2 час. 40 мин.
Научился играть в Сокобан.
Выполнить задание - пройти 10 уровней.
На первом скриншоте представлен последний шаг для завершения 10 уровня, на втором - список пройденных уровней.
Великолепная игра, вроде бы ничего сложного, толкаешь ящики по всей карте, но есть свои особенности, ограничения, которые придают изюминку. По ходу прохождения уровней представление об игре изменилось: здесь можно надолго засесть, продумывая различные ходы и комбинации. Достаточно сложно и интересно, затягивает, теперь появился интерес самому создать такую игру)
2015-12-27 00:43 Игры со словами Бот для игры БАЛДА + 20 2 час. 30 мин.
1) Коллекция Dictionary.
2) Применение рекурсии при поиске слов, оптимизация поиска.
Рекурсивная функция search.
Интересная получилась программа. Провел ее испытания по примеру Евгения Витольдовича, для этой цели завел себе почту на mail.ru, нашел ту игру и выиграл)
Спасибо)
2015-12-24 19:25 Игры со словами Игры со словами + 20 1 час. 50 мин.
1) Метод File.ReadAllLines, который возвращает содержимое файла в виде массива строк.
2) Познакомился с классом StringBuilder, невооруженным глазом видна разница в производительности по сравнению с string при обработке больших строк.
3) Использование Linq.
Подробный урок, проблем не было.
Хороший урок, емкий, много различных примеров игр со словами. От себя добавил простую игру – погуглил в интернете и выбрал игру "Слова-шифровки", где задается начальное слово и выполняется поиск по словам, которые начинаются из букв начального слова. Например, МИР => М - Мы, И - Ирина, Р - Ракета. Немного усложнил поиск слов, добавил рандомайзер и при каждом нажатии на кнопку формируются новый список слов. В коде решил поэкспериментировать, создать решение в функциональном стиле, чтобы яснее выразить мысли, без циклов и прочего. В С++ для этого есть алгоритмы, функторы(или для краткости и локальности лямбды). Искал что-то похожее в C#. Почитал msdn, нашел решении в нечто с названием Array.FindAll(array, predicate), где array это массив, predicate это условие. В общем, работает. Библиотека C# впечатляет, много возможностей, мне нравится.

Спасибо за урок)
2015-12-22 18:40 Новые технологии Модульное тестирование + 20 2 час. 35 мин.
Использование модульного тестирования в C#.
Реализация своего класса знаковых чисел MyInteger с управляемым диапазоном значений.
Сначала сделал все как на уроке, опробовал работу всех тестов, включая последний, с исключением деления на ноль. Понравилось. Решил добавить что-то от себя. Так как в данном уроке мы пишем калькулятор и в чате упомянули о случае, если мы выйдем за границы диапазона long, то решил создать свой велосипед. Разработал класс MyInteger, который представляет знаковое целое число с управляемым ограниченным диапазоном значений. Ограничение указывается во втором параметре конструктора - это количество битов в разрядной сетке числа. Первый параметр - само число. Например, new MyInteger(5, 4) означает, что мы имеем дело с числом, значение которого 15 и число битов 4, поэтому максимальное положительное число - 2^3 - 1 = 7, соответственно отрицательное -2^3 = -8. Оба параметра имеют значения по умолчанию, то есть MyInteger(value = 0, bits = 64) и можно написать new MyInteger(5), и получим обычное число в типе long. Данное решение мне не очень нравится, в C++ я бы для этого применил шаблоны, где выход за границы проверяется на этапе компиляции и код получается безопаснее. Здесь же в C# я пока что слабо владею языком, поэтому выбрал такое решение, где ограничение на диапазон не привязано к типу на этапе компиляции и поэтому проверяется во время выполнения.

Создал свои три типа исключений InvalidBitCount (bits < 1 || bits > 64), BitCountMismatch (в операциях сложения и т.д. могут участвовать только числа с количеством бит в разрядной сетке. Если не одинаково - ловим эксепшн), ValueOverflow (если вышли за пределы значений числа, например, при операции умножения получили слишком большое число). Кроме того, для удобства и на примере C++ добавил перегрузку операторов +, *. /, чтобы писать конструкции c = a + b. Удобно.

Добавил 16 тестов, где рассматриваются разные варианты возникновения исключений. Названия старался выбирать говорящие, так что думаю понятно, что делает тот или иной тест. Например это тесты на проверку валидности создаваемого числа, переполнения в положительном/отрицательном диапазонах, несовместимостях двух чисел по разрядным сеткам(например пытаться сложить тип int с типом short).
В общем, на этом все, опять получилась большая стена текста, спасибо что дочитали)

Спасибо, Евгений Витольдович, хороший урок)
2015-12-18 16:07 Демо софт Двенадцать месяцев + 20 1 час. 20 мин.
Познакомился с компонентом MonthCalendar, научился загружать картинку из файла с помощью вызова метода Image.FromFile().
Подобрать картинки)
Не получается изменить шрифт, размеры календаря. Возможно есть какой-нибудь способ или как вариант для этих целей стоит использовать стороннюю библиотеку.
Спасибо за урок)
2015-12-17 19:03 Нанософт Твоё портфолио + 20 2 час. 40 мин.
1) Повторил использование Process.Start для запуска приложений.
2) TabControl.
3) Самостоятельно изучал различные способы вывода информации на форму.
Определиться с интерфейсом портфолио.
Сначала сделал все как в уроке, кроме момента, когда подключались классы из других проектов. Мне данный подход не понравился, потому что надо помнить обо всех связях, ресурсах и прочих мелочах тех проектов, которые я разрабатывал несколько месяцев назад. Вручную добавлять исходники по одному не комильфо. Поэтому я целиком импортировал свои проекты в "solution", добавил reference на них. В итоге, нет проблем с namespace, все локально и работает как надо.

Далее я вернулся к первому варианту, где мы просто запускаем исполняемый файл из папки "Exec". Это решение на мой взгляд лучше подходит для портфолио. Здесь это решение можно расширить, используя вместо исполняемого файла инсталятор данного приложения или перенаправить пользователя на нужную страницу в интернете для скачивания программы.

Достаточно долгое время думал над интерфейсом формы. Причина была в том, что Евгений Витольдович предложил добавлять новые приложения в портфолио. Я задумался, как это можно сделать удобнее. В итоге, перебрав разные варианты, остановился на использовании компонента ListBox для динамического вывода списка приложений. Предложенный в уроке табличный вариант я убрал, так как было неудобно вручную добавлять картинки и описание игр за границы формы. Вместо этого у меня один PictureBox, выводящий картинку той игры, которая выбрана в списке по событию SelectedIndexChanged. Описание выделил в единичный TextBox, текст которого так же зависит от выбранного элемента в списке игр. Все данные хранятся в коллекции List<>, которые по-хорошему надо бы загружать из файла конфигурации, а потом из конкретных файлов описания игр, но это я остановил на будущее. Пока что вся текстовая информация содержится в константах кода программы.

Спасибо за урок)
2015-12-14 23:18 Карточки памяти Отображение карточек + 20 1 час. 50 мин.
Использование массива bool для фиксации установки/неустановки значений параллельного массива
Все поэтапно, хорошо объясняется, проблем не было.
Поначалу хотел переписать код под себя, расширить, сформировать взаимодействие через классы. Потом передумал, предложенный на уроке процедурный подход вполне достаточен для задачи, другими способами будет избыточно и менее понятно.

Игра получилась интересная, чем-то затягивает. Спасибо)
2015-12-14 16:42 Графические циклы Спираль Архимеда + 20 25 мин.
Применение тригонометрических функций для формирования закономерностей в элементах последовательностей.
Сложностей не было.
Курс понравился, особенно последний VIP урок, в тот момент, когда во внешнем цикле использовали изменение приращение шага угла поворота внутреннего цикла. Небольшое изменение и получаются интересные результаты. Изменив шаг, мы можем формировать вывод вложенных треугольников, квадратов - красиво смотрится, я впечатлен)
2015-12-13 14:45 Графические циклы ФИНАЛЬНЫЙ УРОК + 1 10 мин.
Использование циклов для создания красивых рисунков на плоскости, повторил проверку граничных условий цикла, использование четырехмерных циклов.
Уроки короткие, материал хорошо объясняется, преподносится в формате удобном для восприятия и понимания, так что проблем не было)
Ответы на вопросы:

1. Понравились ли тебе задачи?
Да, понравились, наглядно демонстрируются возможности применения итераций, вложенных итераций для формирования элементов (например массива) с определенными закономерностями.

2. Какие навыки ты приобрёл?
Стал лучше понимать использование вложенных циклов. С трехмерными циклами сталкивался лишь однажды, когда от лени сделать "нормально и понятно" сохранял данные в трехмерный массив, где первый индекс - это был номер матрицы, второй и третий были строками и столбцами матрицы. С четырехмерными не сталкивался, но увидев предложенный в уроке способ применения внутренних условий расширил свое понимание этих вложенных конструкций.

3. Ставил ли ты свои эксперименты над циклами, какие?
Да, ставил, предложенные в видео уроках, на изменение условий цикла и шага итерации.
2015-12-13 14:27 Графические циклы Трёхмерные циклы + 20 25 мин.
Использовать трехмерные и четырехмерные циклы.
Все хорошо объясняется, проблем не было.
Здорово, мне понравилось, спасибо за урок)
2015-12-13 00:15 Графические циклы Внутренние условия + 20 30 мин.
Придумывать условия для выхода через break или continue из текущей итерации цикла, на примере рисования графических элементов. Наглядно, спасибо)
Сложностей не было.
Немного запутался в булевых условиях 15 функции, в результате кроме центральных у меня не прорисовывались некоторые другие лишние квадратики. Поэтому слегка почистил код, дал названия всем условиям, сохранил их в булевых переменных и читаемость повысилась. Это позволило с легкостью объединить две проверки в одну, тем самым убрав строку с continue. Но, подумав еще раз, я решил, что это усложняет чтение кода(негативная логика хуже чем положительная) поэтому вернул строчку с continue (см. скриншот 1 - вывод с помощью 15 функции).

Кроме того, реализовал прорисовку аналогичного рисунка в 16 функции, просто добавив условие проверки на координаты центральных элементов (см. скриншот 2 - вывод с помощью 16 функции).
2015-12-12 23:03 Графические циклы Вложенные циклы + 20 30 мин.
Повторил использование DrawRectangle для рисования прямоугольников.
Сложностей не было.
Немного изменил форму - сгруппировал кнопки в groupBox по названиям уроков - стало понятнее назначение кнопок.

В уроке хорошо объясняется и показывается переход от использования нескольких циклов к одному вложенному. Мне понравилось, наглядно)
2015-12-12 00:49 Графические циклы Пучок лучей + 20 25 мин.
Экспериментам с координатами линий.
Все хорошо объясняется, сложностей не было.
Красивые рисунки, понравились эксперименты с координатами линий)
2015-12-11 23:36 Графические циклы Диагональные линии + 20 25 мин.
Повторил проверку граничных условий цикла.
Сложностей не было.
По поводу оптимизации и прочего. В данном случае нет разницы используется один цикл с внутренней дополнительной проверкой условия или два цикла без внутренней проверки условия. Ведь если рассматривать случай с двумя циклами, то проверка счетчика во втором цикла не дается бесплатно. Но это все на словах и надуманно, для оценки реальной производительности надо всегда замерять и если по результатам получится, что именно в этих циклах наблюдается эффект бутылочного горлышка и это критично для программы, то да, стоит что-то изменить, причем не просто добавив или убрав if, а пересмотрев алгоритм.
2015-12-11 22:19 Графические циклы Горизонтали и вертикали + 20 25 мин.
Проверка работы цикла в граничных условиях, в начальной и конечной итерациях.
Сложностей не было.
Классная идея, использовать Thread.Sleep(100) для наглядной проверки работы циклов. По дополнительному заданию добавил прорисовку диагональных линий, в одном и двух циклах.
2015-12-11 01:24 Графические циклы Подготовка графики + 20 25 мин.
Повторил работу с Bitmap, Graphics, Pen, PictureBox.Refresh()
Посчитать количество столбиков и строк в таблице дополнительного задания)
Решил без псевдокода, сразу написать код, который рисует таблицу из дополнительного задания. Рисовал с помощью двух циклов: один рисует горизонтальные линии, другой - вертикальные. Получилось так, что граничные правая и нижняя линии не отображаются в pictureBox, так как индексация координат в pictureBox начинается с 0. Но, по заданию, у Евгения Витольдовича были отображены все граничные линии, поэтому дорисовал их вручную, вне циклов.
2015-12-10 23:44 Карточки памяти Подготовка формы + 20 40 мин.
Повторил работу с компонентами MenuStrip, TableLayoutPanel.
Подобрать 9 картинок.
Интересная задумка, идем дальше)
2015-12-09 15:15 Нано-игры ФИНАЛЬНЫЙ УРОК + 21 30 мин.
Повторил создание видео обзора.
Говорить)
Курс понравился, особенно последняя программа "Анимированный кубик". Сама по себе программа небольшая, но требует понимания, рекомендую)
2015-12-09 12:33 Морской Бой VIP. Анимированный кубик + 20 2 час. 50 мин.
Повторил работу с двумерными массивами в C#.
Организовать работу программы с использованием классов.
Интересная тема, анимация завораживает. Понравилась идея представления значения числа на игральном кубике в виде двумерного массива. По началу, меня это не устраивало, реализовал в виде одномерного массива, но получилось так, что решение Евгения Витольдовича лучше отражает идею, по коду легче понять замысел. Однако синтаксис этих вложенных конструкций меня не устраивал. Поэтому добавил дополнительные переменные для выделения значений из массивов.

Добавил классы NumberArena (абстракция числа на кубике), Drawer(рисовальщик) и GameLogic(внешний класс, который всем управляет и вызывается из формы). По ходу разработки было много сомнений. Конечно, синтаксически добавить класс не составляет никаких проблем, даже есть такой способ в рефакторинге "выделение класса" и прочие мелкие махинации с кодом. Проблемы были в моменте связи классов. И тут-то мне не нравилось, что классы знают много друг о друге и выполняют чужую работу. Не буду подробно описывать все эти моменты, в итоге удалил класс Drawer и передал его обязанности GameLogic.

Своим полученным решением не доволен, но доволен тем, что появились идеи для дальнейших решений, которыми займусь в ближайшем будущем. Спасибо, Евгений Витольдович)
2015-12-08 20:46 Морской Бой VIP. Анимированный кружок + 21 40 мин.
Повторил работу с графикой: классы Graphics, Pen, Bitmap.
Сложностей не было.
Интересная задумка, идем дальше)
2015-12-08 00:31 Нано-игры Бот для Цифр + 20 25 мин.
1) Повторил способ эмуляции клика мышки.
2) Свойства Multiline, ReadOnly, Lines у компонента TextBox.
Сложностей не было.
Интересный урок, понравился способ клика мышкой по заданным координатам) Возможное применение программы - автоклики по ссылкам, по заранее определенным маршрутам. Можно кроме обычно клика еще добавить возможность прокрутки экрана, если ссылки находятся ниже на странице сайта.
2015-12-07 22:47 Нано-игры Игра Цифры + 1 40 мин.
1) Познакомился с компонентом MenuStrip.
2) Raw String Literals в языке C# - строки с форматированием as-is (как написано в коде, так и сохранится в строке), без необходимости экранирования символов. Для этого необходимо перед строковым литералом добавить символ @.
Все хорошо объясняется; проблем не было.
Евгений Витольдович предложил поздравить игрока при успешном завершении игры - фейерверком. Вот он, на втором скриншоте. Для ясности, написал на картинке небольшой текст поздравления)
2015-12-06 15:16 Демо игры VIP. Устный счёт + 20 3 час. 15 мин.
То что высота компонента TextBox зависит только от размера выводимого шрифта.
Проблем как таковых по уроку не было, я их сам себе создал, когда решил добавить абстракцию выбранной операции(сложение, вычитание и т.д.) Достаточно долгое время работал над интерфейсом программы.
В уроке понравился способ генерации чисел для операции деления, где a = random.Next(1, 10); b = random.Next(1, 10); first_arg = a * b; second_arg = b; В итоге получаем, что результат деления всегда получается целый.

От себя добавил, хм, много чего. Изменил интерфейс, освежил в памяти свои давние знания по GroupBox, RadioButton. Добавил операцию "остаток от деления". Заменил текстовое поле диапазона генерируемых чисел на три RadioButton (уровни сложности). Добавил таймер обратного отсчета, дифференцировал результат сдачи теста по оценкам (учитывая затраченное время на прохождение). Кроме того, при запуске теста "наглым образом" уменьшаю высоту окна, чтобы скрыть настройки и добавить сверху информационные поля (см. на скриншотах). Добавил кнопку отмены теста, поработал с выводом MessageBox при различных результатах работы программы: тест успешно пройден на оценки 5, 4, 3, тест не пройден (по ошибке), тест не пройден (время истекло). В целом, чудненько, работа с интерфейсом затягивает, хочется добавить что-нибудь эдакое)

По коду. В принципе, модификаций не очень много. Решил поиграться, выделить операцию в отдельную абстракцию - BinaryFunction. Сделал ее в виде абстрактного класса, от которого наследовал классы Plus, Minus, Mult, Div, Modulo.  Для управления всем этим добром, и с учетом необходимости постоянной генерации случайных аргументов функции, добавил "драйвер" - класс BinaryCalculation. Этот класс создает нужный экземпляр класса BinaryFunction в момент нажатия на кнопку "Начать тест" и затем каждый раз обращается за результатом работы функции в момент нажатия пользователем кнопки Enter на поле ввода ответа.

Хотел абстрагироваться еще дальше, добавить класс UnaryFunction (например для вычисления факториала), потом TernaryFunction, а потом вообще замахнулся на вычисление сложных, вложенных выражений. Задумался, а зачем? Программа создается с целью проверки устного счета, поэтому остановился на одном классе BinaryFunction.

В целом, здорово позанимался, я доволен. Спасибо, Евгений Витольдович)
2015-12-05 01:31 Нано-игры Скорость реакции. Алгоритм и рекорд + 20 50 мин.
Познакомился с компонентами ProgressBar, Stopwatch - хороший инструмент для замеров времени.
Сложностей не было, кроме попыток побить рекорд.
Так и не смог побить рекорд Евгения Витольдовича)
2015-12-04 23:23 Нано-игры Скорость реакции. Три картинки по таймеру + 20 25 мин.
"Мерцание" картинок, повторил способ установки видимости нужной картинки.
Сложностей не было.
Интересный способ мигания картинок)
2015-12-04 21:47 Нано-игры Скорость реакции. Блок-схема + 20 45 мин.
Создавать блок-схемы на сайте draw.io
Нарисовать стрелки в блок-схеме.
Если не ошибаюсь, в комментариях к отчетам других ребят, Оля советовала использовать сайт draw.io для создания диаграмм. Попробовал - понравилось. Правда вначале было неудобно работать со стрелками; позже приноровился)
2015-12-04 01:39 Нано-игры Арканоид - Шарик и кирпичики + 20 2 час. 45 мин.
Вспомнил как на курсе "Игры со спрайтами" мы динамически добавляли метки на форму, применил решение в этой задаче.
Алгоритм пересечения двух прямоугольников, не учел все условия.
В качестве дополнений, добавил на форму таймер обратного отсчета, количество попыток и прогресс выполнения задачи. Кроме того, Евгений Витольдович в уроке предложил случайно, динамически изменять параметры границ игровой арены перед стартом игры. Было сделано.
После этого, от себя решил добавить случайное размещение кирпичиков на площадке, причем так, чтобы они не пересекались и не накладывались друг на друга. Возникла небольшая проблема, как было написано выше, иногда прямоугольники все же пересекались. В проблеме помог разобраться Paint. Напоследок, добавил создание случайного количества кирпичиков и их случайной закраски.
2015-12-02 20:54 Нано-игры Арканоид - Уровень и ракетка + 20 1 час. 30 мин.
События KeyPress, KeyDown. Обработка нажатий на клавиши Left, Right.
Сложностей не было.
Понравился способ установки точного, предельного значения координаты "икс" ракетки в случае выхода за границы допустимых значений.
2015-12-01 20:24 Демо игры Камень ножницы бумага + 20 2 час. 10 мин.
Повторил работу с панелями, pictureBox, загрузкой ресурсов. Понравился способ установки видимости необходимой картинки через проверку условия. Например, picture_rock.Visible = choice == Choice.rock;
Все хорошо поясняется, проблем не было.
Сначала я написал версию по видео уроку, поиграл, оценил. Здорово, но это скорее игра на реакцию, а не привычная "камень-ножницы-бумага". Так как игрок может видеть примерный выбор компьютера, то он имеет возможность нечестно победить. Поэтому я решил слегка изменить начальную версию программы: убрал таймер и организовал принятие решения компьютера в момент клика по одной из трех картинок.

Во время модификации программы я утомился работать со строковыми представлениями картинок и режимов игры, добавил отдельный класс GameLogic. В тот момент задумался, как можно усложнить игру? Ответ пришел быстро - разные варианты генерации решений компьютером. Например, компьютер будет учитывать предыдущие ходы игрока, сохранять их в коллекцию и далее по-хитрому медитируя пытаться угадать следующий шаг.

Чтобы создать задел для разных версий генераторов, использовал полиформизм, добавил интерфейс IChoiceGenerable и реализовал его в классе RandomChoiceGenerator, который (как в видео уроке) рандомно принимает решение в полуоткрытом интервале [1, 4). Версию с AI пока что делать не стал, оставил на будущее)
2015-11-30 19:02 Нанософт Расписание уроков + 21 1 час. 20 мин.
Чтение и запись данных в файл, используя StreamReader и StreamWriter.
Длинный и подробный урок, все хорошо объясняется, проблем не было.
В конце урока решил изменить цвет фона таблицы, параллельно с этим нашел большое количество настроек отображения для строк и столбцов таблицы.
2015-11-26 15:39 Демо игры Бот для Быстрощёлка + 20 45 мин.
1) Работе с компонентом TabelLayoutPanel;
2) Вызывать функции WinAPI из кода программы C#
track_count_Scroll(null, null) и track_time_Scroll(null, null). Понимаю, что в этих функциях мы не обрабатываем аргументы, но передавать null было неловко)
Интересный урок, познакомился с компонентом TabelLayoutPanel, вызовом функции WinAPI из кода программы. Результат впечатляет, у меня есть свой бот)
2015-11-07 01:23 Игры со Спрайтами VIP урок. Телефон по TCP/IP протоколу + 20 1 час. 20 мин.
1) Познакомился с нитями в C#, метод Thread.sleep().
2) Познакомился с организацией передачи данных между клиентом и сервером.
Были небольшие ошибки из-за невнимательности, функцию Connect вызывал вне бесконечного цикла, что приводило к тому, что связь не возобновлялась после обрыва. Разбирался в коде, изучал связь конструкторов, функции Start, Connect, делегата.
Интересный и полезный урок, формирует базу для клиент-серверных приложений.
2015-11-05 23:43 Теория ООП Интерфейс. ФИНАЛЬНЫЙ УРОК. + 20 45 мин.
Метод Contains у класса List<>, удобная штука.
Не было, все понятно, хорошо показано, как изменить правила в игре.
Перед началом второй части курса теории ООП я ожидал, что мы продолжим работать со снеговиками, научим их каким-нибудь действиями (помню Оля писала мне в комментариях, что "они у нас еще потанцуют, а мы отлично потренируемся").
Кроме того, в шапке курса было указано, "При создании программы мы будем использовать некоторые шаблоны проектирования, такие как "Одиночка", "Фабрика", "Строитель", "Наблюдатель" и другие. Когда я это увидел, еще до того, как пройти первую часть курса, то загорелся желанием пройти курс ООП. В первой части курса паттернов не было, поэтому ожидал их увидеть во второй части. Но и во второй части их не было. Да, были моменты с методами Arena.NewCircle(), но упор в курсе был сделан не на паттерны, а на интерфейсы.

Однако это ни в коей мере не говорит о том, что курс мне не подошел. Я присутствовал на вебинаре, на котором производилась запись курса, это восхитительная атмосфера, всем советую ходить на вебинары!) Тематика второй части курса меня сразу захватила, Евгений Витольдович придумал интересный пример для объяснения этой важной концепции в объектно-ориентированном программировании. При этом, в первых уроках упор был сделан на абстракцию, логику программу, а отображением результатов на форме мы занимались во второй половине курса, и, что примечательно, программа сразу со старта заработала корректно, это достойно уважения!)
Кроме того, практически после каждого урока были дополнительные вопросы на проработку материала. Нам было необходимо написать словесные алгоритмы или попробовать самим реализовать действия из следующих уроков. Это сильно мотивирует и проверяет на сколько качественно усваивается материал. В целом, я считаю, что неплохо прокачался за эти два курса ООП.

Кому стоит рекомендовать данный курс? В своем полуфинальном отчете я писал, что курс теория ООП хорошо подойдет для программистов, которые достаточно уверенно знают C#, но не уверенно понимают понятия ООП. Мои коллеги по проекту не разделяют этого мнения (я читал их отзывы с полуфинального урока) и считают, что курс мастхев для новичков. На вкус и цвет конечно, но я своего мнения не меняю. Лучше сначала хорошо проработать задачи из консоли, бесплатные курсы, понять, что ты не боишься языка программирования и можешь написать программу любой разумной сложности, и потом понять для себя, чего не хватает и к чему лежит интерес)

Получился достаточно длинный отчет, спасибо тем, кто прочитал его до конца) Спасибо Евгений Витольдович, мне было приятно пройти курс теория ООП, появились новые идеи, открылись пробелы по некоторым вопросам, будем изучать дальше!)
2015-11-05 22:12 Теория ООП Интерфейс. Создаём новую игру. + 21 20 мин.
Закрепил навыки из прошлых уроков, добавил новый класс GameVirused для реализации новой игры.
Сложностей не было.
У нас имеется два массива, gamers и virused. gamers хранит всех текущих игроков, virused - тех игроков, которые заражены.
В SetNewVirus(Игрок) нам необходимо добавить игрока в список virused и сказать ему - Ты Голя.
В FindNewVirus несколько сложнее, у нас два массива данных, как такового отдельного лидера уже нет, лидер растворен среди зараженных игроков, поэтому необходимо пройтись в двух циклах по gamers и virused и проверить Поймал ли тот, кто заражен того, кто не заражен. Если поймал, то вызвать функцию SetNewVirus. Если остался всего один не зараженный игрок, то сделать его зараженным, остальных в цикле не зараженными.
2015-11-05 21:59 Теория ООП Интерфейс. Изменяем правила игры. + 21 45 мин.
Понял значимость класса GameCatch, благодаря которому легко меняются правила игры. Увидел реализацию задержки нового Голи, понравилось то, что код обработки этой ситуации локален внутри GameCatch, хотя и зависит от внешнего таймера.
Сложностей не было, интересный урок, попробовал версию игры, где новый Голя стоит на месте в течение 10 итераций. Получается менее динамично, но есть ощущение уже несколько другой игры.
Суть новой игры. В начале игры все игроки имеют статус Голя, им дается команда Беги. Когда Голя ловит другого Голю, то оба становятся Не Голями и замирают на месте (Не получают команду Беги). Если после этого какой-нибудь другой Голя поймает Не Голю, то Не Голя оживает, становиться Голей и снова начинает двигаться. Если в игре не останется Голь, то игра сбрасывается и все становятся Голями и так по кругу. Записал видео, для этой версии игры.
2015-11-04 23:47 Теория ООП Интерфейс. Кружочки гоняются друг за другом. + 20 25 мин.
Метод Equals() у объекта.
Продумать как исправить недочеты с переголением.
Как исправить недочет с переголением?
1) Можно определить время в течение которого новый Голя не может Голить игроков.
2) Как и в первом случае, указать время, но в течение этого времени новый Голя не может двигаться.
3) Сделать какую-нибудь форму иммунитета игроков на действия нового Голи.
Из всех способов, думаю первый самый простой и подходящий.
2015-11-04 21:06 Теория ООП Интерфейс. Кружок готов к игре! + 20 45 мин.
Поэкспериментировал с выводом класса Circle на экран. Попробовал FillEllipse, различные Brush. Оставил вывод через DrawEllipse, мне показались более симпатичными. От себя добавил, что если Circle Голя, то у него толщина окружности в три раза больше, чем у остальных, это помогло в наглядности тестирования.
В 4 пункте было указано, что нужно описать словами что нужно сделать. Я малость не удержался, и реализовал в коде, правда достаточно долгое время, около 10 минут не понимал, почему у меня круги двигаются, но не Голятся. Оказалось, что в функции SetNewLeader() мы выходили из функции, если Лидер был НЕ null. Исправил как надо - заработало) Ошибка была глупой:D Надо быть внимательнее.
Решил записать видео демонстрацию, без звука. В конце видео выделил мышкой добавленный код, а в самом конце - проблемный участок, надо которым сидел 10 минут)
2015-11-04 17:54 Теория ООП Интерфейс. Кружок хочет играть. + 20 20 мин.
Закрепил навыки.
Описать словами содержимое методов Беги(), Поймал().
Метод Беги(). Наш круг описывается координатами центра center (Point) и радиусом(int). В конце урока была дана подсказка, две целочисленные переменные sx, sy. Эти переменные могут означать смещение координат центра. Могут означать изменение радиуса. Но мы должны реализовать не метод Расширься(), а метод Беги(), то есть изменение координат самого круга, а это определяется координатами центра.
Так что, думаю что надо в методе Беги() изменить координаты центра:
center = new Point(center.x + sx, center.y + sy);

В методе Поймал(object obj) нам надо проверить поймал ли текущий кружок this  того, что мы получили в аргументах. Физическая реализация этого представляется проверкой на столкновение или, точнее, пересечение двух окружностей (Так как у нас объекты круги). Пересечение двух окружностей это не rocket science, решение известно - это определение дистанции между центрами окружностей и сравнение этого значения с суммой радиусов. Если дистанция меньше суммы, то ... кружок поймал другой кружок.
public bool Catch(object obj)
{
    Circle second_circle = (Circle)obj;
   
    int distance = Convert.ToInt16(Math.Sqrt(
          (center.X - second_circle.center.X) * (center.X - second_circle.center.X) +
          (center.Y - second_circle.center.Y) * (center.Y - second_circle.center.Y)));

    return distance < radius + second_circle.radius;
}
2015-11-04 13:55 Игры со Спрайтами ФИНАЛЬНЫЙ урок + 20 25 мин.
Еще раз потренировался в создании видео обзоров.
Говорить)
Я дважды ошибся (в начале и конце видео), когда сказал, что необходимо найти две плашки с суммой 6 вместо правильных 12)
2015-11-03 23:43 Игры со Спрайтами Домино. Финальный аккорд + 20 50 мин.
Закрепил навыки, исправил свои мелкие ошибки с прошлого урока.
Разложить пасьянс, на этот раз получилось достаточно долго, 20 минут добивался успеха.
Мне понравился сам ход разработки, сначала с логики игры, продумали класс Домино. Затем реализовали вывод на экран, тестировали с помощью меток. В итоге показали, что логика работает верно и можно изменить интерфейс игры, сделать его более эффектным, зрелищным. Далее создали спрайты, за это отдельное спасибо, клево своими же руками в своей же программе создавать элементы игры) Добавили анимацию. И, наконец, объединили все вместе, получился прекрасный результат. Спасибо, Евгений Витольдович!)
2015-11-03 22:05 Игры со Спрайтами Домино. Наведение порядка + 20 1 час. 20 мин.
Закрепил навыки, подробнее изучил классы в проекте для реализации анимации выбора и дропа домино.
Реализовать 4 пункт, выбор плашки и ее дроп.
Интересный урок, вспомнил, что в курсе Наноигры, в игре лабиринт использовали функцию PointToScreen(), думал, что с ее помощью можно найти координаты щелчка мышки и далее определить, попали по домино или нет. Оказалось, что копал немного не в ту сторону, координаты e.X, e.Y для pictureBox пришли уже в относительных значениях. В итоге, домино можно выбирать, дропать и в общем-то, получается играть. Добавил, что перевернутые нельзя выбирать. Интересно посмотреть, как на следующем уроке мы закончим данную программу)
2015-11-03 19:55 Игры со Спрайтами Домино. Rolling Stones + 20 1 час. 10 мин.
Так как работа анимации привязана к таймеру и не зависит от основного потока управления программы, то научился определять момент завершения анимации, с помощью проверки статуса stopped.
Придумать свой вариант анимации, в моем случае четные строки появляются слева, нечетные справа.
В начале урока был разговор об альтернативных вариантах дизайна классов анимаций. На мой взгляд, анимация это некий процесс, действие, которое не привязано к домино. Текущий дизайн не позволяет мне использовать эту иерархию классов для того же самого Аполлона, так как в базовом классе Animate мы явно указали зависимость от SpriteDomino.

В качестве возможного решения, можно разделить данные от алгоритмов. Данные - это спрайты. Алгоритмы - это анимации. Данные реализовать в виде иерархии классов Sprite. В классе Sprite добавить поле Animate, которое будет означать текущую анимацию, которую можно потом гибко менять по ситуации.

struct Point {
    int x;
    int y;
}

interface Animate {
    void play();
    Point position();
}

class AnimateStatic : Animate{}
class AnimateMove : Animate{}
class AnimateTurn : Animate{}

class Sprite {
    Animate animation;
    int x, y;

    public void set_animation(Animate a)
    {
        animation = a;
    }

    public virtual void Draw()
    {
        animation.play();
        Point location = animation.position();
        x = location.x;
        y = location.y;
    }
}

class SpriteDomino : Sprite {}
class SpriteFlower : Sprite {}

void test()
{
    Sprite domino = new SpriteDomino();

    domino.set_animation(new AnimateMove());
    domino.Draw();

    domino.set_animation(new AnimateTurn());
    domino.Draw();

    Sprite flower = new SpriteFlower();
    flower.set_animation(new AnimateMove());
    flower.Draw();
}
2015-11-01 01:29 Игры со Спрайтами Домино. Пирамида из анимашек + 20 20 мин.
Выделение памяти под двумерный массив, null инициализация всех элементов.
Сложностей не было.
Все красиво и понятно, спасибо!)
2015-11-01 00:55 Игры со Спрайтами Домино. Три наследника Аниматора + 20 45 мин.
Закрепил навыки создания анимаций перемещения, выбора, переворота плашек.
Не запутаться в переменных базового класса анимаций.
Здорово, переместили логику анимаций в отдельные классы.
2015-10-31 02:12 Игры со Спрайтами Домино. Базовый класс Анимаций + 20 35 мин.
Повторил алгоритм расчета координат плашек.
Сложностей не было, понравился выделенный класс для Анимации.
Забавно смотреть, как методы Draw в классе Graph по очереди вызывают друг друга)
2015-10-31 00:38 Игры со Спрайтами Домино. Подъём переворотом + 20 40 мин.
1) Обращаться к const константам класса через имя класса (через объекты не доступно).
2) Использовать математические функции для задания траектории движения спрайта.
Понять алгоритм анимации выбора и переворота спрайта.
Получилось красиво,  мне понравились новые анимации, спасибо!)
2015-10-30 23:14 Игры со Спрайтами Домино. Анимация спрайта + 20 25 мин.
Закрепил знания по анимации передвижения спрайтов, примерно похожее было в игре Аполлон.
Не запутаться в "лабораторных" переменных)
По просьбе Ильи исправил вывод спрайтов на экран, теперь все корректно. Проблема была в значении переменной domino_full, то есть оригинального размера спрайта. На видео это значение было 400, я слепо скопировал и получился такой эффект. В моем случае, исходный размер спрайта был в пределах 420, исправил, заработало)
2015-10-30 00:23 Игры со Спрайтами Домино. Двойной спрайт + 20 40 мин.
Рефакторить, выделять метод из нескольких строк кода.
Сложностей не было.
Было непонятно, почему в функциях Open(), Hide() присваивались "странные" значения для булевой переменной open. Подумал, что тут вероятно какая-нибудь хитрая магия Евгения Витольдовича и поэтому не трогал код. Оказалось что не зря ломал голову, первоначальные значения на видео были неверные, и в результате, в Open() надо указать open = true, а в Hide() open = false.
2015-10-29 22:14 Игры со Спрайтами Домино. Отображение плашки + 20 50 мин.
Конвертировать массив байт в строку utf8.
Нарисовать на экране плашку домино.
В моем случае, я сохранял спрайты в файлы с расширением *.xml и предложенный вариант в видео по чтению данных из массива байт не сработал.

Передо мной стоял выбор:
1) сохранить все спрайты без расширения (как на видео).
2) разобраться с системой загрузки ресурсов.
3) изменить код программы, чтобы она могла загружать данные из а) файла б) строки string в) массива байт.

Мне по душе третий вариант, на нем и остановился. Для верности, проверил работу программы, подав ей на вход бинарный файл, все сработало)
2015-10-29 01:02 Игры со Спрайтами Спрайт. Рисуем плашки + 20 1 час. 30 мин.
Корректировать вручную xml-файл. Это было необходимо для того, чтобы не перерисовывать правые стороны плашек, а скопировать данные из левых плашек и подкорректировать боковые линии.
Нарисовать плашки, достаточно долго обводил круги)
В paint создал два шаблона для срисовки, один с точками, как на уроке, другой с окружностями, для простоты и наглядности)
2015-10-28 00:32 Теория ООП Интерфейс. Запускаем кружки на площадку! + 20 20 мин.
Рисовать круги на форме в рандомных местах, с рандомным радиусом, это красиво)
Три функции Refresh(), Clear(), Arena.NewCircle(). Они взаимосвязаны и их нужно вызывать в правильном порядке. Сначала не понимал, как так получается, что мы создали объект в куче, вызвали для него Show(), потом потеряли ссылку, значит объект уничтожился, а на форме он все так же рисуется. Вся магия в том, что на pictureBox остается не сам объект, а его бледная тень, словно рисуешь карандашом на бумаге. И если случайно вызвать Clear(), то все тени исчезнут, словно стирающей резинкой все очистил) И конечно нужно вовремя вызывать Refresh(), чтобы показать результат изменения после итерации.
Это был долгий путь в несколько уроков, прежде чем мы нарисовали заветные круги, причем в рандомных местах, с рандомным радиусом) Результат понравился, спасибо!)
2015-10-27 23:48 Теория ООП Интерфейс. Кружок на площадке. + 20 14 мин.
PictureBox.Refresh() удобная штука)
Сложностей не было.
Свое творчество с прошлого урока удалил) Идем дальше)
2015-10-27 23:20 Теория ООП Интерфейс. Площадка для игры. + 20 20 мин.
Кириллу респект, хорошо подметил, что в конструкторе переменная picture ссылается на аргумент, а не на член класса Arena. Код и так и сяк будет работать, согласен с Евгением Витольдовичем, но менять косвенно состояние this.picture через аргумент на мой взгляд это словно зайти в дом через черный вход, мало ли, что тебя там ожидает. Возможно в C# есть какой-нибудь механизм, защищающий от этого, аналогичный const ссылкам и указателям C++ на аргументы функций.
Нарисовать окольными путями кружок на форме, для этого добавил pictuteBox на форму, добавил Arena.Show(), создал объект Arena в коде инициализации формы.
Класс Арена нужен для того, чтобы инкапсулировать отображение наших игроков Circle на форме, чтобы, например, не вручную в коде форме вызывать функции DrawEllipse, а создать какой-нибудь удобный интерфейс Arena.Show(object). Вообще говоря, класс Арена малек перегружен по смыслу, он кроме того, умеет создавать новые Circle и статический Range меня немного смущает, но соглашусь с Евгением Витольдовичем, не стоит усложнять код)
2015-10-27 22:10 Теория ООП Интерфейс. Создаём кружок. + 20 15 мин.
Закрепил полученные знания из предыдущих уроков.
Сложностей не было.
Дальше необходимо каким-нибудь образом связать Circle с интерфейсом Игрок. Как было сказано в конце урока, что если Circle стал Голей, то меняет цвет на красный, если не Голя, то обратно синий.
2015-10-26 18:12 Теория ООП Интерфейс. Алгоритм игры. + 20 15 мин.
Узнал, что если в списке не будет элементов, то foreach корректно обработает эту ситуацию.
Сложностей не было.
Чтобы начать играть, нам необходимо продумать "интерфейс" игры, как и что рисовать на форме, панели или pictureBox, реализовать интерфейс Игрок в виде конкретного класса, добавить несколько объектов этого класса в список gamers в классе GameCatch и как-нибудь по-хитрому все это запустить)
2015-10-26 17:54 Теория ООП Интерфейс. Правила игры. + 21 17 мин.
Автоматическая генерация заглушки stub для методов.
Продумать словесный алгоритм.
Алгоритм FindNewLeader():
Начало

Игрок := Первый игрок в списке игроков
Цикл:
Пока Игрок != Последний игрок в списке
Если Лидер Поймал Игрока ТО
Блок
Лидер := Игрок
Выход из цикла
Конец Блока
Конец Цикла

Конец

//---------------------------------

Алгоритм SetNewLeader(Игрок игрок):
Начало

Лидер установить Не Голя
Лидер := игрок
Лидер установить Голя

Конец
2015-10-26 17:17 Теория ООП Интерфейс. Зачем он нужен. + 20 20 мин.
Познакомился с интерфейсами в C#.
Понять, связать действия в интерфейсе Player (Игрок) с правилами в игре "Голя", выразить вкратце мысли про интерфейс.
На мой взгляд, интерфейс это некий контракт, правила, которые должны выполнены (реализованы в коде), прежде чем мы можем создавать различные реализации конкретных классов. Эти классы будут представляться от имени интерфейса, как допущенные к использованию (подчиняющиеся правилам контракта) и могут быть вызываться любой функцией, которая работает с данным интерфейсом.

На примере данной игры "Голя", интерфейс это требования к человеку, которые должны быть соблюдены, прежде чем он сможет принимать участие в игре. То есть, надо уметь бегать, становиться Голей, становиться не Голей и ловить других игроков. В коде это означает, что любой класс, который хочет принимать участие в игре, должен реализовать все 4 функции интерфейса Игрок. Если он это сделал, система довольна и разрешает доступ к тем классам, функциям, которые работают с интерфейсом Игрок.
2015-10-22 00:41 Игры со Спрайтами Домино. Ура! Победа! + 20 40 мин.
Закрепил навыки с прошлых уроков, изучил алгоритм определения поражения в игре с использованием массивов сумм плашек.
Разложить пасьянс.
Повезло с пасьянсом, разложил его с первого раза)
2015-10-21 23:43 Игры со Спрайтами Домино. Выбираем и убираем + 20 40 мин.
1) Уточнил правила игры, условия для открытия и удаления плашек.
2) Повторил Tag, Split().
Сложностей не было.
Хорошо, когда с помощью paint или других средств наглядно показывается алгоритм будущей программы)
2015-10-21 21:17 Игры со Спрайтами Домино. Делегаты отображения + 20 35 мин.
Познакомился с делегатами в C#, по сути, это обычные указатели на функции в старом Си (даже не C++), но в удобной упаковке, плюс с перегрузкой +=, возможно что-то еще есть.
Сложностей не было, попозже почитаю подробнее про делегаты, их причуды и использование.
Понравились делегаты, возможность назначить цепочку действий. Емкий и полезный урок, спасибо)
2015-10-18 00:40 Игры со Спрайтами Домино. Динамическая пирамида + 20 40 мин.
Динамически создавать объекты на форме, в данном уроке, объекты Label.
Сложностей не было, интересная тема.
Красиво сделано, весь код зависит от значения переменной maxPoints, корректно создает label's и добавляет на форму, магия)
2015-10-17 23:39 Игры со Спрайтами Домино. Правила игры + 20 30 мин.
1. Познакомился с правилами игры Пасьянс Домино (Пирамида).
2. Двумерные массивы в C# [,]
Найти/купить домино.
Вместо найти/купить домино, я нашел/скачал приложение из Windows Store на свой смартфон. Хотя игра в демо-режиме, количество раскладок ограничено, суть игры уловил и проверил на практике.
2015-10-17 23:21 Игры со Спрайтами Домино. Перемешиваем плашки + 20 35 мин.
Вспомнил как использовать генератор случайных чисел System.Random
Сложностей не было.
Не понятно, почему используется модификатор доступа protected для целого набора функций в классе Domino. В дальнейшем, класс Domino будет базовым? Тогда и virtual неплохо бы прикрутить к ним или к public функциям. В общем, я заинтересован, посмотрим, как будет развиваться данная программа)
2015-10-14 16:32 Игры со Спрайтами Полуфинальный урок + 20 30 мин.
Создавать видео обзор своего приложения.
Записать свой первый в жизни видео обзор)
На момент записи у меня слегка простывший голос) Спасибо, Евгений Витольдович, видео обзоры помогают лучше понять то, что ты делаешь, о чем говоришь и вообще это полезно не только в программировании, но и в жизни в целом)
2015-10-14 16:31 Игры со Спрайтами Аполлон. Финальное прилунение + 20 1 час. 00 мин.
Масштабировать спрайты и размещать их в необходимых координатах экрана.
Подогнать размеры спрайтов, редактировать xml-файлы для корректного отображения спрайтов.
Простая, интересная игрушка; хороший итог разработки с нуля. Спасибо, Евгений Витольдович)
2015-10-14 00:17 Игры со Спрайтами Аполлон. Graph и Sprite на Луне + 20 30 мин.
Добавлять в проект разработанные ранее классы.
Сложностей не было.
Интересно посмотреть, как мы будем масштабировать и размещать спрайты на pictureBox)
2015-10-13 23:36 Игры со Спрайтами Спрайт. Рисуем Аполлона + 20 50 мин.
Transparent color
Нарисовать Землю)
Срисовывал со своего же рисунка, посмотрим как будет выглядеть посадка ракеты)
2015-10-13 02:53 Игры со Спрайтами Аполлон. Плавное прилунение + 20 1 час. 15 мин.
Закрепил знания по событиям MouseDown, MouseUp, Click, попрактиковался с enum, ToString() с параметром строкой для форматирования вывода.
Сложностей не было.
Всего 200 строк кода в двух файлах, простые элементы пользовательского интерфейса, и в итоге получилась такая интересная и затягивающая программа, здорово)
2015-10-12 23:10 Игры со Спрайтами Аполлон. Законы физики + 20 30 мин.
1) Вспомнил физику)
2) Модификаторы const, readonly.
Сложностей не было.
Клево, когда в программе реализуются какие-либо модели реального мира)
2015-10-12 20:40 Игры со Спрайтами Аполлон. Главные герои + 21 30 мин.
1) Почитал про Аполлон-11, интересно)
2) Рисовать планету Земля из космоса.
Нарисовать.
Погуглил перед тем как рисовать корабль, обнаружил, что посадочный модуль Аполлон-11 не похож на ракету, скорее он смахивает на некую капсулу:D Но задание требует ракету, вот она, вроде как похожа)
2015-10-11 15:52 Игры со Спрайтами Спрайт. Сериализация объекта + 20 25 мин.
1) How to serialize and deserialize objects, в данном уроке в файл формата xml.
2) Познакомился компонентами SaveFileDialog, OpenFileDialog.
Сложностей не было.
Интересная тема)
2015-10-11 14:23 Игры со Спрайтами Спрайт. Панель инструментов + 20 30 мин.
1) Свойство Tag у объектов на форме.
2) Удалять элемент из списка List<> по указанному индексу.
Придумать рисунок)
Красота, у меня теперь есть свой Paint)
2015-10-11 00:49 Игры со Спрайтами Спрайт. Рисуем линии мышкой + 21 32 мин.
Познакомился с событиями MouseDown, MouseMove, MouseUp
Нарисовать что-нибудь "красивое".
Увлекся творчеством, 10 минут работал с мышкой)
2015-10-10 23:16 Игры со Спрайтами Спрайт. Класс для Спрайта + 20 20 мин.
Закрепил знания из прошлых уроков: Свойства, List<>.
Сложностей не было.
Идем дальше, необходимо научиться загружать данные в коллекцию из xml-файла.
2015-10-10 22:50 Игры со Спрайтами Спрайт. Класс для графики + 20 18 мин.
Познакомился со свойствами в C#. В данном случае, с автоматически реализуемыми свойствами.
Сложностей не было, некоторое время заняло чтение msdn по свойствам.
Удобная фича, автоматически реализуемые свойства, в одной строчке коде можно указать доступ только для чтения или записи.
2015-10-10 22:06 Игры со Спрайтами Спрайт. Структура для линии + 20 15 мин.
Научился инициализации массива с помощью явного списка инициализации в языке C#.
Сложностей не было.
Все хорошо, идем дальше)
2015-10-10 21:32 Игры со Спрайтами Спрайт. Первая форма + 20 16 мин.
Закрепил материал, полученный в курсах ООП и Наноигры для создания формы, добавления иконок, использования Graphics, Bitmap.
Найти иконку.
Все подробно поясняется, начиная от этапа создания приложения, установки иконки и прочее; хороший урок для начала курса.
2015-10-09 19:57 Теория ООП Перемещение Снеговиков + 21 15 мин.
Перемещать снеговиков, закрепил навыки предыдущих уроков.
Сложностей не было, все ок.
Перемещать спрайты научились, теперь необходимо их поворачивать и масштабировать)
2015-10-09 18:41 Теория ООП Перемещение других фигур + 20 20 мин.
Закрепил материал с прошлого урока, координаты position и внутренние координаты для Circle, Box, Line.
Придумать фигуру из трех фигур)
Если использовать данную структуру классов, то для реализации перемещения спрайта необходимо объявить функцию Move с ключевым словом virtual в классе Shape, затем перегрузить функцию Move для класса Sprite, которая пробежится по коллекции shapes и для каждого объекта вызовет функцию Move:

public override void Move(Pixel position)
{
        base.Move(position);
        foreach(Shape shape in shapes)
                shapes.Move(position);
}
2015-10-09 17:56 Теория ООП Перемещение круга + 20 15 мин.
Отличать координаты position от координат расположения круга.
Сложностей не было.
На мой взгляд, Move(int offset_x, int offset_y) это функция, которая принимает смещения относительно текущих координат; для абсолютного размещения лучше подойдет функция MoveTo(int x, int y) или SetPosition(int x, int y).
2015-10-09 17:28 Теория ООП Спрайт для Снеговика + 20 20 мин.
Познакомился с коллекцией List в C#; удобно, мощно.
Сложностей не было.
Спасибо за урок, приятно познакомиться с коллекциями в C#)
2015-10-08 16:43 Теория ООП Мощь полиморфизма + 20 15 мин.
1) Ключевые слова abstract, virtual, override их смысл и применение.
2) Реализация полиморфизма в C#.
Сложностей не было, все по аналогии с C++, правда с другим синтаксисом.
Да, дождались, полиморфизм, ура!)
2015-10-08 15:11 Теория ООП Переезд graph в базовый класс + 20 20 мин.
Использовать функционал базовых классов.
Сложностей не было.
Наша программа постепенно становится более удобной: там закинули в массив, тут прошлись в цикле, дальше унифицировали обращение к функции Draw - красота)
2015-10-08 13:45 Теория ООП Переезд метода Draw + 20 15 мин.
1) Приведению типа Shape к типу Circle.
2) Новому способу прохода через breakpoint, на видео(10:58). Отличие этого способа, от двух других (F10, F11) в том, что после нажатия на F5 программа продолжает свое обычное выполнение (пока не встретит новый breakpoint). Это удобно в определенных случаях, когда нет необходимости пошагово проходить через выражения; экономит время.
Сложностей не было.
Все понятно, идем дальше)
2015-10-06 17:11 Теория ООП Приведение с мотором + 20 15 мин.
Закрепил знания, полученные на предыдущем уроке (функция GetType())
Сложностей не было.
Переменная Shape.position необходима для удобства, простоты расчетов, "независимости от контекста", то есть, это единственная переменная, которая хранит в себе абсолютные координаты снеговика в целом, как фигуры. Остальные координаты зависят от Shape.position, что удобно для расчетов поворота, масштабирования и прочее.
2015-10-06 16:27 Теория ООП Фигуральный базовый класс + 20 30 мин.
1) Создавать массив объектов и использовать цикл для итерации в указанном диапазоне.
2) Свойство или поле Length у массива.
3) Динамическая идентификация типа в C#.
Реализовать функцию Draw(Shape).
Общая идея такова, что среда выполнения C# как бы должна знать динамический тип объекта. Как раз на видео было показано, что хоть у массива статический тип это Shape, но динамический тип может быть другим(Circle, Box и т.д.).

Для реализации Draw(Shape) обратился к гуглу, почитал в википедии про динамическую идентификацию типа в C#, обнаружил, что для этого есть несколько способов реализации (GetType, typeof, is, as), подробнее почитал в msdn, поигрался с is, GetType(), выбрал GetType.

Получился эдакий брутальный способ вызова соответствующей перегруженной функции Draw).
2015-10-06 15:12 Теория ООП Богатое наследство + 20 20 мин.
1) Познакомился с наследованием в C#.
2) Вызов конструктора базового класса в конструкторе производного класса с помощью ключевого слова base в С#.
Сложностей не было, все по аналогии с C++, правда до сих пор слегка неловко, когда вижу в коде голые 'new', явные 'this'.
На этот раз кратко опишу, как это отражается в коде. Наследование - это способ создания новых типов на базе существующих, путем повторного использования их интерфейса (и реализации), и с добавлением каких-либо новых свойств, поведений, которые явно отличают производный тип от базового.
2015-10-06 13:18 Теория ООП Второй Снеговик + 20 15 мин.
Добавил второго снеговика, путем смещения координат 'x' базовых точек первого снеговика.
Сложностей не было.
Для начала, для удобства, можно создать класс SnowMan, где, в качестве полей определены:
x, y - координаты верхнего-левого угла снеговика;
angle_x, angle_y - текущие углы поворота снеговика относительно осей x, y;
scale_x, scale_y - коэффициенты масштабирования относительно осей x, y.

1) для перемещения можно добавить функцию move(int dx, int dy) {x += dx; y += dy;}
2) для поворота можно добавить функцию rotate(int rx, int ry) { angle_x += rx; angle_y += ry; }
3) для изменения размеров можно добавить функцию scale(int sx, int sy) {scale_x *= sx; scale_y *= sy;}

Кроме того, можно добавить функции set_position(int x, int y), set_rotation(int rx, int ry), set_scale(int sx, int sy), которые устанавливают абсолютные значения необходимых полей.
2015-10-05 22:27 Теория ООП Рисуем Снеговика + 20 44 мин.
Рисовать снеговика в paint:D
Определить координаты центров окружностей, углов прямоугольников и концов отрезков.
Абстракция прекрасна: используя заранее определенные необходимые типы данных (Line, Circle, Box) удобно создавать интересные фигуры, не задумываясь о деталях)
2015-10-05 18:49 Теория ООП Цветные карандаши + 20 25 мин.
Осознал неудобство ручного (copy/paste) создания новых классов со схожими свойствами на базе уже существующих .
Все понятно, сложностей нет.
Хороший подход, постепенное улучшение структуры программы как было сказано в начале видео)
2015-10-05 17:39 Теория ООП Расстояние между пикселями + 20 15 мин.
Более сложной инициализации аргументов для делегирующего конструктора (в данном случае, с помощью функции distance())
Сложностей не было.
Красота, идем дальше)
2015-10-04 03:06 Теория ООП Структура vs Класс + 21 40 мин.
1) Более подробно изучил понятие "структура" в языке C#;
2) Понял отличие структуры от класса в C#;
3) Передача параметров в функцию с помощью квалификаторов ref, out.
Сложностей не было.
Все понятно, спасибо за урок)
2015-10-04 00:30 Теория ООП Пиксели для классов + 20 20 мин.
Вызывать один конструктор через другой в C#.
Сложностей не было.
Полезная фича, делегирующие конструкторы, спасибо)
2015-10-03 21:36 Теория ООП Структура пикселя + 21 15 мин.
Познакомился с понятием "структура" в языке C#.
Сложностей не было.
Все понятно объясняется, идем дальше)
2015-09-29 00:57 Новые технологии Построение графиков + 20 2 час. 10 мин.
Познакомился с библиотекой ZedGraph
Сложность была в том, что я первоначально скачал "странно" работающую версию библиотеки ZedGraph. При запуске программы отсутствовала возможность масштабировать график, некоторые объекты и функции имели другие названия или отсутствовали вовсе. К концу видео урока я уже было готовился к веселым пляскам с бубном, но вдруг увидел ссылку, которую приложил Евгений Витольдович http://www.youtube.com/watch?v=fcxmZndJUyI посмотрел видео, попробовал использовать версию 5.1.5 и все сразу заработало)
Воистину, удобная библиотека для построения графиков, спасибо)
2015-09-28 19:49 Новые технологии Печать таблицы + экспорт в Excel + 20 1 час. 34 мин.
Познакомился с компонентами DataGridView, WebBrowser. Научился применять их для формирования html и csv документов.
1) Содержимое таблицы экспортировалось в csv файл некорректно (в один столбец). Ошибка была в том, что забыл исправить в теле цикла AppendLine на Append.
2) Удивило то, что в DataGridView первый индекс обозначает номер столбца, а второй номер строки.
Классный урок, хитрый способ распечатки отчетов, используя html)
2015-09-27 02:11 Теория ООП Круглый класс + 20 12 мин.
Узнал, что для рисования эллипса необходимо задать координаты верхнего левого угла и ширину/высоту воображаемого прямоугольника вокруг эллипса.
Сложностей не было.
Интересное название урока "Круглый класс")
2015-09-27 01:39 Теория ООП Второй класс + 20 14 мин.
Для объекта класса Box рассчитывать значение ширины и высоты внутри класса.
Прикрепить к левой части экрана дерево классов во время исполнения программы.
"Линия это не прямоугольник", "Любой студент это человек" - понравились примеры)
2015-09-27 01:11 Теория ООП Первый класс + 20 12 мин.
Описывать класс и его конструктор, создавать объект.
Сложностей не было.
Все отлично)
2015-09-27 00:46 Теория ООП Урок рисования + 20 9 мин.
Свойство Dock у объектов на форме.
Сложностей не было.
Все отлично)
2015-09-27 00:03 Теория ООП Инкапсуляция мечты + 20 35 мин.
Выражать свои мысли про интерфейс)
Подобрать пример для описания различий между интерфейсом/реализацией.
Инкапсуляция - это разделение структуры некоторого процесса, явления на две части: интерфейс и реализацию.  Необходимость интерфейса обуславливается тем, что для пользователя не имеет значения то, как реализован некий процесс. Например, я как пользователь мобильного телефона не заинтересован в том, каким образом реализуется функция набора номера. Более того, в разных моделях эта функция реализована по разному. Мне эти детали не нужны. Мне нужно лишь знать общую последовательность действий, чтобы позвонить необходимому человеку. Т.е., я ожидаю получить удобный интерфейс, который позволит мне быстро и удобно набрать номер друга, а не изучать схемотехнику и замыкать нужные провода на схеме телефона. В итоге, интерфейс необходим для того, чтобы оградить пользователя от деталей реализации, от сложных процессов в начинке, от ошибочных действий с системой.
Кроме того, интерфейс подбирается с учетом требований пользователя; возможно создание нескольких интерфейсов. Например, интерфейс для новичков, с ограниченными возможностями для управления процессом, где большинство параметров устанавливается по умолчанию. Интерфейс для опытных пользователей, для более тонкой "настройки под себя".

Инкапсуляция в программировании выражается в правильной модульности исходного кода, разделении интерфейса и реализации. Например, в языке C++ для создания интерфейса используются заголовочные файлы, например MyLib.h, где пользователю доступны интерфейсы, а детали реализации расположены в файлах .cpp. На более низком структурном уровне инкапсуляция выражается в виде namespace, и далее в виде классов, где для разделения интерфейса и реализации используются секции кода public:, private:.

На скриншоте показана кабина самолета Ил-96 (интерфейс) и общий вид самолета (его реализация)
2015-09-26 20:18 Демо игры Игра Быстрощёлк + 20 40 мин.
1) Замерять время;
2) Познакомился с событием MouseDown.
Побить ваш рекорд 14 кликов в секунду:D На скриншоте показан результат "щелканья" двумя руками.
Все отлично)
2015-09-26 02:33 Демо игры Лабиринт 2D - игра + 20 2 час. 10 мин.
1) Cursor.Position;
2) Вызов форм, DialogResult;
3) Событие MouseEnter.



Во время создания третьего уровня, когда добавлял/удалял "ключи", "двери" и "стены" появлялись висячие указатели на несуществующие функции-обработчики.
Понравилась идея использовать label для препятствий)
2015-09-25 23:00 Демо игры Лабиринт 2D - меню + 20 1 час. 10 мин.
1)Создавать свой класс
2)Воспроизводить звуковые файлы
3)Закрывать форму с помощью Close()
Подобрать 4 звуковых файла из папки Media)
Статические классы, C# удивляет)
2015-09-25 20:28 Демо игры Картинка с секретом + 20 1 час. 35 мин.
Свойствам Anchor,  BackGroundImageLayout у объектов на форме, создавать иконку приложения.
Подобрать 5 картинок и подвести их к общему размеру.
Все отлично)
2015-09-22 19:54 Комбинаторика Рекурсия. Фракталы. Треугольник Серпинского + 20 31 мин.
Нарисовал на бумаге треугольник Серпинского, рассмотрел два варианта решения. Для экспериментальной части переписал алгоритм расчета трех точек, в результате, на втором скриншоте вариант с пропорцией 3/7 между смежными вершинами.
Переписать алгоритм расчета трех вершин, спасибо ручке и листку бумаги)
Рекурсия божественна
2015-09-22 17:48 Комбинаторика Рекурсия. Фракталы. Спираль + 1 45 мин.
Познакомился с понятием "фрактал".
Сложностей не было, кроме следствия небольшого эксперимента: при задании отрицательного шага возникло переполнение стека и visual studio зависла, пришлось перезапустить приложение. Все данные сохранились)
Понравился результат работы программы, несколько иначе посмотрел на технику применения рекурсивных вызовов функций.
2015-09-21 22:54 Демо софт Вступительное слово + 20 42 мин.
Мигрировать проект с 2013 на 2015 студию.
Сложностей не было. Ожидал, что будут проблемы с миграцией последней программы, но все прошло успешно)
Небольшая игра в жанре runner, для windows phone 8.1 на C++/DirectX11.
Ожидание от видеокурсов - познакомиться с C#, получить/отточить навыки программирования.

Начинаем практику по языку C#





Если вы пришли без приглашения -
введите тысяча двадцать четыре (цифрами).
Чтобы стать хорошим программистом — нужно писать программы. На нашем сайте очень много практических упражнений.

После заполнения формы ты будешь подписан на рассылку «C# Вебинары и Видеоуроки», у тебя появится доступ к видеоурокам и консольным задачам.

Несколько раз в неделю тебе будут приходить письма — приглашения на вебинары, информация об акциях и скидках, полезная информация по C#.

Ты в любой момент сможешь отписаться от рассылки.


Научился: Для объекта класса Box рассчитывать значение ширины и высоты внутри класса.
Трудности: Прикрепить к левой части экрана дерево классов во время исполнения программы.
"Линия это не прямоугольник", "Любой студент это человек" - понравились примеры)


Научился: Повторил работу с панелями, pictureBox, загрузкой ресурсов. Понравился способ установки видимости необходимой картинки через проверку условия. Например, picture_rock.Visible = choice == Choice.rock;
Трудности: Все хорошо поясняется, проблем не было.
Сначала я написал версию по видео уроку, поиграл, оценил. Здорово, но это скорее игра на реакцию, а не привычная "камень-ножницы-бумага". Так как игрок может видеть примерный выбор компьютера, то он имеет возможность нечестно победить. Поэтому я решил слегка изменить начальную версию программы: убрал таймер и организовал принятие решения компьютера в момент клика по одной из трех картинок. Во время модификации программы я утомился работать со строковыми представлениями картинок и режимов игры, добавил отдельный класс GameLogic. В тот момент задумался, как можно усложнить игру? Ответ пришел быстро - разные варианты генерации решений компьютером. Например, компьютер будет учитывать предыдущие ходы игрока, сохранять их в коллекцию и далее по-хитрому медитируя пытаться угадать следующий шаг. Чтобы создать задел для разных версий генераторов, использовал полиформизм, добавил интерфейс IChoiceGenerable и реализовал его в классе RandomChoiceGenerator, который (как в видео уроке) рандомно принимает решение в полуоткрытом интервале [1, 4). Версию с AI пока что делать не стал, оставил на будущее)