# | Название видеоурока | Видео / Тесты | Решило | Рейтинг | Доступ |
---|---|---|---|---|---|
1 |
![]() |
4 теста |
|||
Я приглашаю вас на видеокурс по созданию полноценной игровой программы СОКОБАН. Я проведу вас за руку по всем этапам создания законченной интеллектуальной игры: 1. Создание редактора уровней. 2. Придумывание этих самых уровней. 3. Создание собственно игры. 4. Решение олимпиадной задачки для добавления ИИ. 5. Переделка игры в режим "на двоих". 6. Написание класса Phone для связи двух программ по сети. 7. Создание сетевой версии игры Sokoban. Будет интересно! В конце видео - первое задание: Научиться играть! :) Ссылка на игру Сокобан Отчёт отправил: 7276. Ильшат Выполнено за 2 час. 40 мин. [Показать отчёт] Научился: Научился играть в Сокобан. Сложности: Выполнить задание - пройти 10 уровней. Комментарии: На первом скриншоте представлен последний шаг для завершения 10 уровня, на втором - список пройденных уровней. Великолепная игра, вроде бы ничего сложного, толкаешь ящики по всей карте, но есть свои особенности, ограничения, которые придают изюминку. По ходу прохождения уровней представление об игре изменилось: здесь можно надолго засесть, продумывая различные ходы и комбинации. Достаточно сложно и интересно, затягивает, теперь появился интерес самому создать такую игру) |
|||||
2 |
![]() |
1 тест |
|||
На этом уроке мы подготовим 6 пиктограмм и две картинки для игры, а также придумаем свой собственный уровень, который запишем в текстовый файл. Отчёт отправил: 7276. Ильшат Выполнено за 1 час. 20 мин. [Показать отчёт] Научился: Скачал Paint.net, научился накладывать несколько рисунков друг на друга, создавать прозрачный фон у изображения. Сложности: Найти 6 подходящих картинок, тематика - Белка из Ледникового периода) Комментарии: Достаточно долгое время выбирал картинки, подгонял их под размеры. До этого не сталкивался с такими задачами, как прозрачное выделение и накладывания картинок друг на друга, а в этом уроке потребовалось научиться. Погуглил, ссылки вывели на использование программы Paint.net, скачал ее, сделал по инструкции для чайников, заработало) |
|||||
3 | Сокобан - Редактор - Загрузка |
|
|||
Мы начинаем создавать редактор уровней для известной логической игры Sokoban. Редактор будет создан за четыре урока. На первом уроке мы создадим класс для загрузки уровня с текстового файла и протестируем его работу. Отчёт отправил: 7276. Ильшат Выполнено за 50 мин. [Показать отчёт] Научился: Повторил работу с двумерными массивами в C#, построчное считывание данных из файла. Сложности: Сложностей не было. Комментарии: Не так давно выполнял видеоурок по составлению расписания, узнал, что компонент DataGridView индексирует данные вертикально, что было для меня неудобным. Здесь вновь столкнулся с этим) Для меня непривычно, когда матрицы заполняются вертикально (т.е. первый индекс это столбец, а второй строка), приходится напрягаться, чтобы лучше ориентироваться что и где находится. Я привык, что многомерные массивы - это массивы вложенных массивов, а в случае двумерного массива или матрицы - это массив одномерных массивов, где первый индекс - это номер строки (то есть, номер вложенного массива), а второй индекс - это номер столбца (то есть, индекс во вложенном массиве) и заполнение идет горизонтально. |
|||||
4 | Сокобан - Редактор - Интерфейс |
|
|||
На этом уроке мы создадим интерфейс программы и сделаем отображение загруженного уровня на экране. Отчёт отправил: 7276. Ильшат Выполнено за 2 час. 10 мин. [Показать отчёт] Научился: Познакомился с компонентом ToolStrip. Сложности: После редактирования кода искал ошибку форматирования, как оказалось, проблема была в том, что в файле сначала идет число столбцов, потом число строк, в программе же я считывал наоборот. Комментарии: По предложению Евгения Витольдовича хотел добавить 4 картинки для игрока, но потом решил, что это будет отвлекать. Поэтому выбрал другой путь, нашел другую картинку Белки, где она смотрит прямо. Немного подкорректировал картинки, чтобы орехи и Белка были на фоне снега. Написал по видео уроку программу, запустил, результат понравился) Правда, как Илья говорил, все мелко, если это окажется критичным, то переделаю. Код немного переделал, добавил несколько служебных pod-классов, переименовал переменные, методы. |
|||||
5 | Сокобан - Редактор - Редактирование |
|
|||
На третьем уроке мы сделаем наконец-таки редактирование поля. Также реализуем возможность изменения размера лабиринта. В конце напишем функцию для проверки корректности составленного уровня. Отчёт отправил: 7276. Ильшат Выполнено за 1 час. 50 мин. [Показать отчёт] Научился: Повторил работу с ToolStrip, сохранение данных в Tag картинки и ее дальнейшее использование, в этом уроке сохраняли информацию типа Point. Сложности: Сложностей не было, немного меняю код, появляются небольшие несостыковки, эксперименты. Комментарии: Интересный урок, хорошо видна связь между тем, что крутится в программе и тем, что показывается на экране формы. От себя немного изменил код, константы размеров поля перенес в свой класс, переименовал методы и переменные. Как временное решение перенес двумерный массив cell в класс и сделал его открытым для чтения и модификаций. Проверку на размерность поля вынес в конструктор класса Game_area, если инвариант проваливается, то вылетаем с эксепшеном и на другом конце провода ловим его в специальном методе create_game_area, который показывает MessageBox с ошибкой и возвращает прежние параметры поля. |
|||||
6 | Сокобан - Редактор - Сохранение |
|
|||
На четвёртом уроке мы закончим создание редактора уровней. Напишем самую главную функцию для сохранения сделанных изменений в файл. Затем добавим кнопки перехода к следующему и предыдущему уровню. Останется только немного облагородить интерфейс программы. Отчёт отправил: 7276. Ильшат Выполнено за 1 час. 50 мин. [Показать отчёт] Научился: Повторил работу с загрузкой/сохранением данных в файл. Сложности: Ошибка при сохранении файла - выход за границы массива, когда обращался к старому массиву строк по индексам нового, расширенного массива. Просто посмотрев код не понял причину, помог отладчик) Комментарии: Я выбрал немного другой способ сохранения игровых уровней в файл, написал код с нуля, использовал второй массив new_lines, который заполнял в трех циклах: первый цикл - это копирование уровней из lines до строки сохраняемого уровня, второй цикл - это копирование содержимого cell, то есть сохраняемого уровня, третий цикл - это копирование оставшихся уровней. По сути то же самое, что по уроку, но мне мой вариант проще понимается, хотя с индексами второго массива немного засиделся. Здорово, у меня теперь есть полноценный редактор уровней игры Сокобан!) |
|||||
7 | Сокобан - Редактор - Улучшение |
|
|||
Допиливаем и дорабатываем редактор до товарного вида. Реализуем ещё несколько фишек. Отчёт отправил: 7276. Ильшат Выполнено за 2 час. 10 мин. [Показать отчёт] Научился: Повторил работу с toolStrip, toolStripComboBox. Сложности: Понять, как сделать значения из списка toolStripComboBox доступными только для чтения. Комментарии: Понравился способ добавления сразу нескольких элементов на поле игры. Внес небольшие изменения, поставил перед собой цель - ограничить выбор и установку значения ширины и высоты уровня в допустимых пределах, то есть, разрешить ввод только числовых значений и организовать проверку случая выхода за границы интервала минимального и максимального размера уровня. Сначала хотел добиться этого путем создания дополнительного кода: просто брать данные из textBox и парсить, но хотелось другого решения, с помощью средств компонентов Windows Forms. Решение оказалось простым - компонент toolStripComboBox. Для того, чтобы игрок не мог ввести буквы и число вне диапазона, установил значение свойства DropDownStyle = DropDownList, и благодаря этому данные из toolStripComboBox оказались доступными только для чтения и возможный выбор размера ограничен моим заранее созданным списком значений. Осталось дело за малым, корректно заполнить список элементов списка и в дальнейшем обрабатывать выбранное значение. |
|||||
8 | Сокобан - Редактор - Классика уровней |
1 тест |
|||
На этом уроке вам нужно выбрать любых два классических уровня и создать их в нашей программе-редакторе. Ссылка на классические уровни: https://logic-games.spb.ru/sokoban/ Редактор можно скачать здесь: https://www.videosharp.info/data/soft/SokobanEditor.zip |
|||||
9 | Сокобан - Создаём свои уровни |
1 тест |
|||
Твоя задача - подготовить базу уровней для игры Сокобан.
Отчёт отправил: 7276. Ильшат Выполнено за 1 час. 40 мин. [Показать отчёт] Научился: Повторил работу с редактированием уровней, улучшил интерфейс программы. Сложности: Придумать два уровня игры Сокобан. Комментарии: От себя добавил два уровня, которые представлены на скриншотах, в интернете нашел 12 уровней, все сохранил в файл levels.txt. Во время создания уровней обнаружил некоторые недочеты в своем оформлении, коде. Например, у меня в программе из предыдущего отчета при смене уровня не обновлялись счетчики установленных орехов и кладовок, это критично. Изменив это, обнаружил новый недочет. Так как в разных уровнях установлены разные количества орехов и кладовок, то метки с описание счетчиков автоматически расширялись и сужались в зависимости от текста, например, 1x и 10x имеют разную ширину вывода. Это приводило к тому, что панель инструментов "бегала вправо-влево" и когда быстро щелкал на правую стрелку, чтобы перейти к последним уровням, то "по ошибке" попадал на стрелку влево. Поэтому установил у меток-счетчиков орехов и кладовок свойство AutoSize на False и подобрал достаточное абсолютное значение ширины. Далее, установил минимальные значения ширины и высоты формы, чтобы не сворачивалась верхняя панель инструментов. |
|||||
10 | Сокобан - Игра - Интерфейс |
1 тест |
|||
Мы начинаем создание интеллектуальной игры СОКОБАН. У нас уже есть все необходимые классы и уровни для создания полноценной игры. На этом уроке мы создадим форму и настроим интерфейс окна лабиринта. Отчёт отправил: 7276. Ильшат Выполнено за 1 час. 20 мин. [Показать отчёт] Научился: Поработал с компонентом LinkLabel. Сложности: Сложностей не было. Комментарии: Вместо кнопки использовал LinkLabel, установил прозрачный фон, убрал подчеркивание, думаю так смотрится лучше) Будет интересно посмотреть на класс Game и использование делегатов. Думаю реализация будет аналогичной как в игре "Домино" из курса "Игры со спрайтами". |
|||||
11 | Сокобан - Игра - Управление |
3 теста |
|||
Теперь мы создадим класс логики игры Game, используя который, мы реализуем управление человечком курсорными клавишами клавиатуры. А также сделаем переход на следующий уровень. Отчёт отправил: 7276. Ильшат Выполнено за 2 час. 40 мин. [Показать отчёт] Научился: Идея использовать два массива: статичных и динамичных объектов. Сложности: Насколько знаю, в C# операция присваивания для объектов означает просто копирование ссылки. Я привык (привет, C++ где бОльший контроль над объектами), что если адекватный автор неполиморфного класса разрешил и перегрузил конструктор копирования и оператор присваивания по lvalue reference, то при копировании выполняется deep copy содержимого. Напоролся на разницу в семантике двух языков, в своем написанном коде минут 15 думал, почему же данные затираются. Все работает, а данные кривые. Опять-таки, помог отладчик. Наверняка в C# есть встроенные возможности по копированию, deep или shallow, пока что не сталкивался и не изучал, двоечник) Комментарии: Мне понравилась идея использовать два массива, один для неподвижных объектов, другой для подвижных. Написал все по уроку, понравился класс Game, все аккуратно. Уже в конце урока пошли дополнения, разные варианты, с чата предлагали решение проверки на доступность уровней. Код проверки, на мой взгляд, оказался не в том месте, этим должен заниматься класс Game, поэтому переделывал по себя. Попутно взялся за свой класс загрузчика уровня, наконец, довел его до состояния, с которым мне удобнее работать. Позже изменю метод save, он у меня не ахти - длинный, некрасивый и дублирует код. Все-таки здорово, когда уже есть функционал, которым можно крутить как угодно. Писать с нуля сложнее, надо много думать об интерфейсе клиента и прочее. Интерфейс игры пока что не менял, есть где вести доработки, например фон Белки, когда она стоит на плитке-кладовке. Данила предложил подумать над плитками. Ждем разбора полетов на следующем вебинаре) Игра понравилась, здорово, спасибо Евгений Витольдович, база отличная, теперь идем дальше, к улучшениям и триксам) |
|||||
12 | Сокобан - Решалка - Тестер |
1 тест |
|||
На этом уроке мы напишем программу, которая будет проверять правильность алгоритма поиска решения лабиринта. http://www.videosharp.info/console/task/level=1178 Отчёт отправил: 7276. Ильшат Выполнено за 2 час. 15 мин. [Показать отчёт] Научился: Поработал с консольным выводом, научился изменять положение курсора, цвет выводимого текста. Сложности: Сложностей не было. Комментарии: По-другому организовал код: написал класс SokobanTester, создал его экземпляр в статичном методе Main. Придумал тестовый уровень, написал для него решение. Поработал с выводом информации на консоль. Для удобства проверки решения, символ следующего шага выделен желтым цветом. Урок понравился, теперь знаю некоторые способы удобного и красивого вывода информации в консоль, спасибо) |
|||||
13 | Сокобан - Решалка - Мышка |
1 тест |
|||
Мы начинаем решать задачу по решению игры Сокобан с одним ящиком. Эта задача олимпиадного уровня на применение алгоритма поиска вширь. Главный герой - мышка Альфа, которая желает затолкать яблочко к себе в норку. Программу мы напишем за два урока. На первом уроке мы создадим вспомогательную функцию MoveAlfa(), которая подскажет мышке как попасть из одной клетки лабиринта в другую кратчайшим путём. Отчёт отправил: 7276. Ильшат Выполнено за 4 час. 15 мин. [Показать отчёт] Научился: Повторил алгоритм поиска в ширину, увидел его реализацию с использованием очереди. Сложности: Был момент, когда мое решение не работало. Искал причину, ошибка была в том, что у нас в этой программе используется один массив для статических и динамических объектов. Поэтому когда игрок достигал целевой точки, то вставал на ее место и она исчезала из карты. Решил с помощью дополнительных переменных, но решение с двумя массивами лучше. Комментарии: На этот раз решил поэкспериментировать, разделить код по классам. Полученным решением более-менее доволен, уже можно расширять и создавать новые программки из этих маленьких кирпичиков. Немного расширил функционал программы, добавил меню, возможность установки позиций игрока и целевой точки, расчет по этим точкам траектории движения и пошаговый режим к целевой точке. |
|||||
14 | Сокобан - Решалка - Яблоко |
2 теста |
|||
На втором уроке мы переделываем написанный алгоритм поиска маршрута мышки. Теперь мы разрешаем мышке толкать яблоко, и записываем все изменения их расположений. Отчёт отправил: 7276. Ильшат Выполнено за 2 час. 10 мин. [Показать отчёт] Научился: Повторил работу с двумерными массивами. Сложности: Сложностей не было. Комментарии: Несколько раз натыкался на небольшие неточности в использовании своего кода. Все-таки, сначала нужно хорошенько составить публичный интерфейс класса, его корректное использование, чтобы в дальнейшем при обращении к этому объекту не задумываться о каких-то хитрых связях внутри объекта. Для этого, нужно при создании класса изолироваться от остального мира классов, рассматривать все локально, накинуть юнит-тесты и только потом собирать все воедино. В моем случае получилось несколько стихийно, что затормозило разработку. |
|||||
15 | Сокобан - Решалка - Оптимизация |
1 тест |
|||
На этом коротком уроке мы рассмотрим два способа оптимизации нашей программы, в результате которых работать она станет просто молниеносно!!!
Отчёт отправил: 7276. Ильшат Выполнено за 35 мин. [Показать отчёт] Научился: Оптимизировать алгоритм поиска траектории движения для игры Сокобан. Сложности: Сложностей не было. Комментарии: Да, результат впечатляет, хорошая оптимизация поиска. На первом скриншоте представлен результат работы алгоритма с использованием List<>. На втором скриншоте - результат работы оптимизированного алгоритма, с использованием четырехмерного массива. В первом случае время решения 69 мс, во втором - 4 мс. |
|||||
16 | Сокобан - Игра - Автоходы |
1 тест |
|||
Поздравляю, программа уже создана: можно играть, можно ею хвастаться. На этом уроке мы добавим в игру автоходы, чтобы можно было управлять нашим человечком с помощью мышки - указать, куда идти, и даже указать, какой ящик куда нужно поставить. Для этого нам потребуются два класса по решению лабиринта. Отчёт отправил: 7276. Ильшат Выполнено за 1 час. 20 мин. [Показать отчёт] Научился: Самостоятельно изучил индексаторы в C#. Сложности: Работа с индексами двумерных массивов. Эта проблема идет с самого начала проекта Сокобан, после того, как я решил использовать в качестве первого индекса двумерных массивов - номер строки, а второй индекс обозначает номер столбца. В дальнейшем, ситуация стала критической - в программе обработка данных ведется как пара (x, y), а обращение к элементам массива как (y, x). Во время выполнения этого урока несколько раз ошибочно путал местами x, y. Меня это утомило, настало время навести в этом порядок и выполнить унификацию доступа. В предыдущих уроках я создал класс Level, для хранения информации о загруженном уровне. Для унификации доступа было необходимо добавить некий промежуточный слой между пользователями Level и хранящейся в нем матрицей уровня. Этот промежуточный слой должен выполнять преобразование координат из (x, y) в (y, x). Для удобного доступа к данным и прозрачного преобразования координат искал нечто подобное перегрузке оператора []. В C# для этого используются индексаторы. Почитал материал, попробовал на двумерном массиве и все получилось. Теперь везде доступ по x, y. Вздохнул свободно) Комментарии: Интересное дополнение, автоходы значительно экономят время, спасибо) |
|||||
17 | Сокобан - Редактор - На двоих |
1 тест |
|||
Переделываем редактор уровней, чтобы можно было создавать лабиринты для двоих игроков. Создаём базу из 10 новых уровней игры в Сокобан для двоих. Отчёт отправил: 7276. Ильшат Выполнено за 2 час. 40 мин. [Показать отчёт] Научился: Проверка на существование файла File.Exists(), в случае отсутствия создание пустого файла. Сложности: Сложностей не было. Комментарии: Понравилось то, что создание редактора для новой игры потребовало небольших изменений. От себя добавил 10 уровней, разной сложности, на скриншотах показаны первые два. Интересная задумка, игра на двоих: здесь можно реализовать как соревнование, так и кооперацию) |
|||||
18 | Сокобан - Игра - На двоих |
|
|||
Переделать игру, чтобы в неё можно было играть вдвоём на одной клавиатуре.
Отчёт отправил: 7276. Ильшат Выполнено за 30 мин. [Показать отчёт] Научился: Обработке нажатия цифровых клавиш NumPad. Сложности: Сложностей не было. Комментарии: Здесь хорошо подошла идея использовать два массива map и top. Несколько изменений в коде и в результате новая игра, здорово) |
|||||
19 | Сокобан - Телефон - TCP/IP протокол |
1 тест |
|||
На этом видеоуроке мы создадим три класса, которые удобно использовать для передачи данных между двумя компьютерами. Отчёт отправил: 7276. Ильшат Выполнено за 1 час. 10 мин. [Показать отчёт] Научился: Повторил работу с нитями (Thread), с передачей данных между клиент-серверными приложениями. Сложности: Сложностей не было. Комментарии: Данный урок ранее выполнял в качестве VIP-урока по курсу Игры со спрайтами. Решил пройти еще раз, для закрепления. Материал был знакомый, в этот раз оценил удобство использования делегата для асинхронного вывода информации о получении данных. |
|||||
20 | Сокобан - Игра - На двоих по сети |
1 тест |
|||
На этом уроке мы наконец-таки сделаем сетевую версию программы Sokoban для двоих. Мы будем использовать телефонный класс Phone с прошлого урока. Отчёт отправил: 7276. Ильшат Выполнено за 1 час. 50 мин. [Показать отчёт] Научился: Создал сетевую версию игры "Сокобан". Сложности: Сложностей не было. Комментарии: Интересный урок, в котором наглядно показано использование "абстрактного" (имеется ввиду не привязанного к конкретной предметной области или приложению) класса Phone для расширения возможностей уже существующей игры. |
|||||
21 | Сокобан - Завершение |
|
|||
Игра уже написана, но всегда можно сделать чуть-чуть лучше. На этом уроке мы объединим оба варианта игры в одну программу и загрузим файл с уровнями в ресурсы программы. Теперь в одном ехешнике будет сразу всё! Это финиш!!! Отчёт отправил: 7276. Ильшат Выполнено за 2 час. 20 мин. [Показать отчёт] Научился: Закрепил полученные знания по прошлым урокам. Сложности: Сложностей не было. Комментарии: Поначалу хотел переписать весь код, сделать его более абстрактным, расширяемым. Потом понял, что в итоге у меня получится ситуация, аналогичная консольным программам в этом курсе: да, будет абстракция, да, все по полочкам и слабо зависит друг от друга, но толку от этого? Акцент в тех программах был на алгоритмах, а не на жонглировании кодом, поэтому в этот раз решил принять предложенный финальный вариант. В дальнейшем буду уделять внимание алгоритмам, функционалу, возможностям программ, а в коде стремится к простоте, как было отмечено во время марафона. Для решения проблемы с архитектурными излишествами и терзаниями уже пора бы "нормально" прочесть старые-добрые книжки Коплиена, GoF, GRASP и поставить наконец-то эту жирную точку) |
|||||
22 | ФИНАЛЬНЫЙ урок. Видео-обзор проекта Сокобан |
|
|||
Задание: Записать видеообзор игры СОКОБАН. Отчёт отправил: 7276. Ильшат Выполнено за 40 мин. [Показать отчёт] Научился: Повторил создание видео обзоров. Сложности: Кратко рассказать про пройденный курс) Комментарии: Данный курс я начал проходить во время новогоднего марафона программиста, где была хорошая поддержка Евгения Витольдовича и марафонцев. В целом, очень достойный курс, хорошие дополнения, такие как автоходы, игра на двоих, по сети. Спасибо, Евгений Витольдович!) Видеообзор: https://youtu.be/J7pDmAqdUFU |
|||||
23 | VIP. Бот для игры БАЛДА |
|
|||
Используя текстовый файл из 27400 слов создаём рекурсивный алгоритм подбора слов для популярной игры Балда. Отчёт отправил: 7276. Ильшат Выполнено за 4 час. 20 мин. [Показать отчёт] Научился: Повторил работу с рекурсией, множествами, динамическими массивами. Сложности: Рекурсивная функция поиска search. Комментарии: Данный урок ранее выполнял в предновогоднюю чашку кофе, тогда сроки выполнения задания были сжаты и поэтому мало времени уделил разбору алгоритма. В этот раз времени много, пишу самостоятельно и хотя использовал алгоритм из урока: двойной цикл по матрице, в нем цикл по алфавиту, далее двойной цикл по матрице с подставленной буквой и запуском рекурсии, но часто возникали мелкие недочеты, ручка с тетрадкой хорошо помогли:). Понравилась работа рекурсивной функции и как она "заметает" за собой следы. Оптимизация поиска так же хорошо подошла для этой задачи. |
|||||
Итого: 23 видеоурока |
13 час. 51 мин. 20 тестов |
12 чел. | |||
Финалисты: LINKI, Новопашин Владимир, Tekashnik, Алексей В., zhikharevav, Evgenii Kudriavtcev, chokayes, Дмитрий, Максим Лапшинов, no name, Max, MaxB . |