# | Название видеоурока | Видео / Тесты | Решило | Рейтинг | Доступ |
---|---|---|---|---|---|
1 |
![]() |
4 теста |
|||
Я приглашаю вас на видеокурс по созданию полноценной игровой программы СОКОБАН. Я проведу вас за руку по всем этапам создания законченной интеллектуальной игры: 1. Создание редактора уровней. 2. Придумывание этих самых уровней. 3. Создание собственно игры. 4. Решение олимпиадной задачки для добавления ИИ. 5. Переделка игры в режим "на двоих". 6. Написание класса Phone для связи двух программ по сети. 7. Создание сетевой версии игры Sokoban. Будет интересно! В конце видео - первое задание: Научиться играть! :) Ссылка на игру Сокобан Отчёт отправил: 11589. Yefim Выполнено за 2 час. 12 мин. [Показать отчёт] Научился: Играть в Сокобан Сложности: Скрыть от начальства, что в рабочее время занимаюсь игрушкой. Комментарии: Прошел 22 кровня на своем Андроиде. Я обратил внимание, что сложность уровней не всегда зависит от номера уровня. Существует ли объективный критерий оценки сложности уровня уровня? |
|||||
2 |
![]() |
1 тест |
|||
На этом уроке мы подготовим 6 пиктограмм и две картинки для игры, а также придумаем свой собственный уровень, который запишем в текстовый файл. Отчёт отправил: 11589. Yefim Выполнено за 10 мин. [Показать отчёт] Научился: Строить стены Сложности: Начать Комментарии: Нет замечаний |
|||||
3 | Сокобан - Редактор - Загрузка |
|
|||
Мы начинаем создавать редактор уровней для известной логической игры Sokoban. Редактор будет создан за четыре урока. На первом уроке мы создадим класс для загрузки уровня с текстового файла и протестируем его работу. Отчёт отправил: 11589. Yefim Выполнено за 3 час. 10 мин. [Показать отчёт] Научился: Узнал о функциях CS для работы с файлами Сложности: Не столько сложным сколько трудоемким Комментарии: Хочу поделиться полезным приемом при написании кода. Не многие знают, что копировать или переносить можно не только строки целиком, но прямоугольные блоки. В частности в этом уроке, когда была написана функция CharToCell(char x) и возникла необходимость в написании функции CellToChar(Cell x), то очень удобно выделить и перенести прямоугольные блоки (см. скриншот) Это делается с помощью мышки и нажатой клавиши Alt |
|||||
4 | Сокобан - Редактор - Интерфейс |
|
|||
На этом уроке мы создадим интерфейс программы и сделаем отображение загруженного уровня на экране. Отчёт отправил: 11589. Yefim Выполнено за 3 час. 40 мин. [Показать отчёт] Научился: Ознакомился с основами работы с файлом ресурсов Сложности: Непонятно, почему иконка на форме выглядит не так как предполагалось. Комментарии: Небольшое замечание относительно применения метода SokobanEditor_Resize. Как было отмечено в видео уроке этот метод требует немалых затрат ресурсов компа. Для мощных компов это не так критично, а вот для слабеньких это существенно заметно. Предлгаю в этих случаях использовать метод SokobanEditor_ResizeEnd. Метот сработает один раз, когда кнопка мышки освободится окончательный эффект будет тот же. |
|||||
5 | Сокобан - Редактор - Редактирование |
|
|||
На третьем уроке мы сделаем наконец-таки редактирование поля. Также реализуем возможность изменения размера лабиринта. В конце напишем функцию для проверки корректности составленного уровня. Отчёт отправил: 11589. Yefim Выполнено за 5 час. 17 мин. [Показать отчёт] Научился: Убирать "мусор" Сложности: Выполняя это задание, решил не просто копировать код, а, по возможности, предложить свою реализацию. В основном получилось, но кое-где были проблемы. Например, я заметил, что при выборе элемнта для редактирования, сам элемент выделяется "неубедительно". В статическом режиме мне это удалось, а в динамическом почему-то нет. Я пытался это сделать при написании функции SetCurrentCell() (см. скрин) Если кто знает, в чем моя ошибка подскажите. Комментарии: Честно говоря, я не понял почему в функции IsGoodLevel() для вычесления числа мест для ящиков используется элемент Cell.done, а не Cell.here? И почему число мест для ящиков не может быть больше числа самих ящиков? Хотя это вопрос определения правил, но ведь эта игра - модель жизненой ситуации. При редактровании уровня до того, как юзер выберет, какой Селл будет активным нужно определиться: либо установить что-то по умолчанию, либо механизм редактирования должен быть заблокирован. На данный момент Cell.none является активным в начале, хотя объект toolNone никак не выделен. |
|||||
6 | Сокобан - Редактор - Сохранение |
|
|||
На четвёртом уроке мы закончим создание редактора уровней. Напишем самую главную функцию для сохранения сделанных изменений в файл. Затем добавим кнопки перехода к следующему и предыдущему уровню. Останется только немного облагородить интерфейс программы. Отчёт отправил: 11589. Yefim Выполнено за 4 час. 13 мин. [Показать отчёт] Научился: Изменять и сохранять уровни Сложности: Самое трудное было понять (может быть в будущем это прояснится) зачем все уровни мы записываем в один файл? Хотя с точки зрения приобретения навыков программирования сложных алгоритмов это оправдано. Комментарии: Не проще ли каждому уровню выделить отдельный файл с именем LevelNNN.txt? где NNN = 001 для первого, 002 для -2го т.д. Тогда многое при кодировании упростится. |
|||||
7 | Сокобан - Редактор - Улучшение |
|
|||
Допиливаем и дорабатываем редактор до товарного вида. Реализуем ещё несколько фишек. Отчёт отправил: 11589. Yefim Выполнено за 2 час. 05 мин. [Показать отчёт] Научился: Дeлать измeнение рaзмеpов лaбиpинта чeрез текстовое поле. Дeлать пpямоугольнoе зaполнeниe лабиpинта выбранным объектом. Дeлать cчётчик ящиков и паркoвочныx меcт для ниx. Дeлать Тултипы для контролов Сложности: Возникли вопросы: при использовании текстового поля со свойством BorderStyle = Fixed3D, я надеялся увидеть "объёмный вариант", а на самом деле оно выглядит как Label. Хотелось бы подробнее узнать как программно перехватывать ошибки с помощью try - catch. Комментарии: Возникли вопросы: при использовании текстового поля со свойством BorderStyle = Fixed3D, я надеялся увидеть "объёмный вариант", а на самом деле оно выглядит как Label. Хотелось бы подробнее узнать как программно перехватывать ошибки с помощью try - catch. Замечаний, практически, нет. Особенно понравилась реализация пpямоугольнoго зaполнeния лабиpинта выбранным объектом. Хочу предложить более простой способ использования функции Split(x) с разделителем, отличным от пробела: char dl = 'x'; string[] wh = toolStripTextBoxLabirintSize.Text.Split(dl); |
|||||
8 | Сокобан - Редактор - Классика уровней |
1 тест |
|||
На этом уроке вам нужно выбрать любых два классических уровня и создать их в нашей программе-редакторе. Ссылка на классические уровни: https://logic-games.spb.ru/sokoban/ Редактор можно скачать здесь: https://www.videosharp.info/data/soft/SokobanEditor.zip |
|||||
9 | Сокобан - Создаём свои уровни |
1 тест |
|||
Твоя задача - подготовить базу уровней для игры Сокобан.
Отчёт отправил: 11589. Yefim Выполнено за 1 час. 03 мин. [Показать отчёт] Научился: Создавать и редактировать уровни Сложности: Оценить сложность уровня Комментарии: Иногда при сохранении уровня возникают проблемы. Еще не разобрался в закономерности. О деталях сообщу дополнительно |
|||||
10 | Сокобан - Игра - Интерфейс |
1 тест |
|||
Мы начинаем создание интеллектуальной игры СОКОБАН. У нас уже есть все необходимые классы и уровни для создания полноценной игры. На этом уроке мы создадим форму и настроим интерфейс окна лабиринта. Отчёт отправил: 11589. Yefim Выполнено за 1 час. 02 мин. [Показать отчёт] Научился: Познакомился с применением делегатов Сложности: Не было сложностей Комментарии: Нет замечаний |
|||||
11 | Сокобан - Игра - Управление |
3 теста |
|||
Теперь мы создадим класс логики игры Game, используя который, мы реализуем управление человечком курсорными клавишами клавиатуры. А также сделаем переход на следующий уровень. Отчёт отправил: 11589. Yefim Выполнено за 3 час. 33 мин. [Показать отчёт] Научился: Технологии монипулирования двумя матрицами. Гениальная идея!!! Сложности: Не было сложностей Комментарии: Не перестаю восхищаться технологией монипулирования двумя матрицами. Браво, Евгений Витольдович!!! |
|||||
12 | Сокобан - Решалка - Тестер |
1 тест |
|||
На этом уроке мы напишем программу, которая будет проверять правильность алгоритма поиска решения лабиринта. http://www.videosharp.info/console/task/level=1178 Отчёт отправил: 11589. Yefim Выполнено за 2 час. 54 мин. [Показать отчёт] Научился: Как избавится от static Сложности: По мере написания программы код в некоторых местах менялся, и это естественно. И порой трудно было отследить, что осталось в окончательном варианте. Комментарии: У меня есть предложение на будущее: в завершении видео показывать окнчательный вариант кода от начала до конца. Переменным следовало бы давать более осмысленые значения. |
|||||
13 | Сокобан - Решалка - Мышка |
1 тест |
|||
Мы начинаем решать задачу по решению игры Сокобан с одним ящиком. Эта задача олимпиадного уровня на применение алгоритма поиска вширь. Главный герой - мышка Альфа, которая желает затолкать яблочко к себе в норку. Программу мы напишем за два урока. На первом уроке мы создадим вспомогательную функцию MoveAlfa(), которая подскажет мышке как попасть из одной клетки лабиринта в другую кратчайшим путём. Отчёт отправил: 11589. Yefim Выполнено за 2 час. 02 мин. [Показать отчёт] Научился: Познакомился с "Очередями и Списками". Сложности: Не было сложностей Комментарии: Нет замечаний |
|||||
14 | Сокобан - Решалка - Яблоко |
2 теста |
|||
На втором уроке мы переделываем написанный алгоритм поиска маршрута мышки. Теперь мы разрешаем мышке толкать яблоко, и записываем все изменения их расположений. Отчёт отправил: 11589. Yefim Выполнено за 1 час. 05 мин. [Показать отчёт] Научился: Вынeсить фyнкцию в в отдельный клаcс Сложности: Не было сложностей Комментарии: Вопрос: Правильно ли я понимаю ? В функции MoveApple(...) записаны 3 строки: brain.mouse = mouse; brain.apple = start; brain.path = ""; Можно ли вместо них использовать конструктор? Brain brain = new Brain(mouse, start, ""); |
|||||
15 | Сокобан - Решалка - Оптимизация |
1 тест |
|||
На этом коротком уроке мы рассмотрим два способа оптимизации нашей программы, в результате которых работать она станет просто молниеносно!!!
Отчёт отправил: 11589. Yefim Выполнено за 2 час. 02 мин. [Показать отчёт] Научился: Научился пользоваться некоторыми элементами класса Stopwatch. Научился пользоваться директивами препроцессора. Научился оптимизиpовaть свой алгoритм. Научился рaдоваться pезyльтатy. Сложности: В видео уроке проблемное место в коде, где возникает торможение, преподносится в готовом виде. Мне интересно было найти это место самому. Проблемы не возникло, но это заняло время. Комментарии: Попутно научился пользоваться директивами препроцессора. Это позволило не убирать старый код, а меняя только одно место в программе, легко показывать любой вариант оптимизации. |
|||||
16 | Сокобан - Игра - Автоходы |
1 тест |
|||
Поздравляю, программа уже создана: можно играть, можно ею хвастаться. На этом уроке мы добавим в игру автоходы, чтобы можно было управлять нашим человечком с помощью мышки - указать, куда идти, и даже указать, какой ящик куда нужно поставить. Для этого нам потребуются два класса по решению лабиринта. Отчёт отправил: 11589. Yefim Выполнено за 2 час. 05 мин. [Показать отчёт] Научился: Автоходам Сложности: Не было сложностей Комментарии: Классно получилось!!! |
|||||
17 | Сокобан - Редактор - На двоих |
1 тест |
|||
Переделываем редактор уровней, чтобы можно было создавать лабиринты для двоих игроков. Создаём базу из 10 новых уровней игры в Сокобан для двоих. Отчёт отправил: 11589. Yefim Выполнено за 1 час. 11 мин. [Показать отчёт] Научился: Всему тому, что было в видео уроке Сложности: Не было сложностей Комментарии: В функции private void ShowCell(int x, int y, Cell C) имеется фрагмент: if (C == Cell.user1) RemoveItem(Cell.user1); if (C == Cell.user2) RemoveItem(Cell.user2); в свою очередь внутри функции RemoveItem(...) есть обращение к ShowCell(int x, int y, Cell C); т. е. рекурсия. Насколько это оправдано? |
|||||
18 | Сокобан - Игра - На двоих |
|
|||
Переделать игру, чтобы в неё можно было играть вдвоём на одной клавиатуре.
Отчёт отправил: 11589. Yefim Выполнено за 1 час. 25 мин. [Показать отчёт] Научился: Корректировать код с помощью компилятора. Сложности: см. пункт 4 Комментарии: Попытался создать программу без полного просмотра видео урока. Остановил видео, после того как Евгений Витольдович сформулировал задачу урока. При изменении поля user на user1 в структуре enum Cell запустил программу в расчете на то, компилятор как раз и укажет на те места кода, которые требуют корректировки. В основном все изменения 80% проделал сам и они совпали оригиналом. Не додумался заменить переменную mouse на mouse[] и создать функцию CellUser(... ). |
|||||
19 | Сокобан - Телефон - TCP/IP протокол |
1 тест |
|||
На этом видеоуроке мы создадим три класса, которые удобно использовать для передачи данных между двумя компьютерами. Отчёт отправил: 11589. Yefim Выполнено за 2 час. 20 мин. [Показать отчёт] Научился: Великолепный урок!!! Научился создавать Сервер и Клиент Сложности: Еще не разобался с механизмом работы делегатов. Где об этом можно почитать? Долго искал ошибку из-за того, что по невнимательности записал "127,0,0,1" вместо "127.0.0.1" Комментарии: Для того, чтобы различать кто, что посылает/ получает добавил в класс Phone поле name. |
|||||
20 | Сокобан - Игра - На двоих по сети |
1 тест |
|||
На этом уроке мы наконец-таки сделаем сетевую версию программы Sokoban для двоих. Мы будем использовать телефонный класс Phone с прошлого урока. Отчёт отправил: 11589. Yefim Выполнено за 2 час. 55 мин. [Показать отчёт] Научился: Углубил знания по работе в сети Сложности: Не было сложностей Комментарии: Запуск экзэшника в качестве одного из режимов (Сервер или Клиент) не позволяет просматривать переменные во время отладки. Мне удалось запустить два экземпляра VS и видеть переменные Севера и Клиента. |
|||||
21 | Сокобан - Завершение |
|
|||
Игра уже написана, но всегда можно сделать чуть-чуть лучше. На этом уроке мы объединим оба варианта игры в одну программу и загрузим файл с уровнями в ресурсы программы. Теперь в одном ехешнике будет сразу всё! Это финиш!!! Отчёт отправил: 11589. Yefim Выполнено за 1 час. 20 мин. [Показать отчёт] Научился: Дoбавлять в pесуpсы фaйлы и читать из них информацию. Объединять разные режимы игры в единный игровой комплекс. Сложности: Не было сложностей. Комментарии: Внёс небольшое, но полезное дополнение: в функцию buttonStart_Click для каждого режима после Labirint = new LabirintForm(...); обновляю Labirint.Text = radioХХХХХ.Text; if (radioSingle.Checked) { Labirint = new LabirintForm(); Labirint.Text = radioSingle.Text; } Дал режиму 2 более короткое, хотя и ироничное название:"Двойная игра" |
|||||
22 | ФИНАЛЬНЫЙ урок. Видео-обзор проекта Сокобан |
|
|||
Задание: Записать видеообзор игры СОКОБАН. Отчёт отправил: 11589. Yefim Выполнено за 1 час. 11 мин. [Показать отчёт] Научился: Презентовать свой програмный продукт Сложности: Из-за предновогодней суеты трудно было найти время для выполнения задания Комментарии: Работа по видео презентации в процессе. В ближайшие дни постараюсь ее завершить. |
|||||
23 | VIP. Бот для игры БАЛДА |
|
|||
Используя текстовый файл из 27400 слов создаём рекурсивный алгоритм подбора слов для популярной игры Балда. Отчёт отправил: 11589. Yefim Выполнено за 2 час. 22 мин. [Показать отчёт] Научился: Научился пользоваться некоторыми свойствами Словаря. Сложности: Не все ясно в работе со словарями Комментарии: Бот Балда получен как подарок за окончание курса СОКОБАН. Большое Спасибо! Очень хороший приз. Однако, по Сокобану за мной остался должок в виде Заключительного видео обзора. Его пришлось отложить из-за технических проблем. Звук записывался с большими шумами. На днях удалось записать звук отдельно с помощью мобильного телефона и затем пришлось накладывать звук на видео. Приятного просмотра. Видеообзор: 28v8p_kPiuk |
|||||
Итого: 23 видеоурока |
13 час. 51 мин. 20 тестов |
12 чел. | |||
Финалисты: LINKI, Новопашин Владимир, Tekashnik, Алексей В., zhikharevav, Evgenii Kudriavtcev, chokayes, Дмитрий, Максим Лапшинов, no name, Max, MaxB . |