Обучение C#

Формула программиста
основатель — Волосатов Евгений Витольдович

Про игру Сокобан

 

Здравствуйте, дорогие друзья!

С вами – Волосатов Евгений Витольдович. Мы начинаем Сокобан. Сегодня произойдет открытие этого видеокурса, и каждый, кто прорешал начальные уроки или просто интересуется этим уроком, может записаться на этот курс.

Сначала расскажу немножко истории – откуда вообще взялся этот урок Сокобан и как он создавался лично у меня.

image articles/504/504.01.jpg

Я первый раз увидел эту игру в журнале, посвященном программированию. Это было в 1994 году, код этой программы был просто напечатан прямо в журнале, набирай и запускай!

Я переписал программу, запустил … и, о чудо! оно заработало. Самое сложное для меня было – перемещение ящиков. Как это все организовать? Программа была написана на языке BASIC, и для меня это было просто какое-то озарение – это же надо! Вот так просто, оказывается, можно всё сделать!

Потом я оптимизировал её, чтобы она быстрее работала, потом нашел, что можно там добавлять какие-нибудь чудища, которые бегают, кроме толкания ящика, добавил болтики, которые надо собирать, магниты, которые могут притягивать, и получилась такая игра, как Роббо. Если кто-нибудь помнит, на Atari была такая игра.

То есть это игра такая знаковая в моей личной истории, и я очень полюбил эти лабиринтные игры и несколько раз ее переписывал – на Спектруме, на IBM, вот только что еще под айфон не сделал! Но, всему свое время!

image articles/504/504.02.jpg

Вот так познакомился с этой игрой.

Теперь ваш черёд – кто сколько уровней прошёл? Пожалуйста, напишите.

Я видел, что некоторые проходили классической уровни игры Сокобан – там уровни более большие, более сложные, и времени на прохождение требуется больше. А некоторые находили какие-то поделки – ну, не скажу подделки, но поделки сокобановские, то есть по этим правилам совершенно другие уровни, очень маленькие, простенькие, чтобы было легче проходить.

Ну, сейчас такая тенденция – сделать все намного проще и быстрее… Например, вот эта задача, на экране – очень простая.

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

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

image articles/504/504.03.jpg

После вступления нас ждёт подготовка картинки лабиринта. На этом уровне мы рисуем пиктограмму. Чтобы сделать игру красивую, необходимо подготовить иконку и картинки персонажей.

image articles/504/504.04.jpg

Моя цель – мотивировать вас к тому, чтобы вы сами эти картинки нарисовали. Пускай криво, косо, но все-таки сами, потому что в этом случае к игре вы будете немножко по-другому относится, как к своему детищу, как к поделке собственными руками.

Если же вы возьмете готовые картинки, все-таки отношение будет немножко другое – она будет не совсем ваша.

Смотрите, Сергей Сергеевич тему Винни Пуха выбрал – тоже классная идея, и вот у него там бочки с медом, мишка ходит, тоже прикольно придумано. Классно Сергей придумал, Винни-Сокобан, Виннибан. Вот такая идея.

image articles/504/504.05.jpg

После этого необходимо было придумать уровень, нарисовать всего-навсего 1 уровень. То есть вот такой вот, в текстовом файле – описание уровней необходимо где-то хранить. Вот мы будем их хранить в текстовом файле.

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

Они загружаются в массив, и вот тут Олин вариант, как это все загрузилось.

image articles/504/504.06.jpg

Дальше мы делаем интерфейс, редактор. Вот так вот примерно он выглядит у Елены. Здесь панель инструментов, где есть кнопочки для составления каждой части нашего лабиринта: ящик, ящик, который поставлен на место, место, куда нужно ставить ящик.

Позже я покажу вам готовую эту программу.

image articles/504/504.07.jpg

Дальше, после отображения уровня, мы будем делать редактирование уровня.

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

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

Вот все эти проверки. Но кроме этих проверок – конечно, сохранение в текстовый файл и загрузка.

image articles/504/504.08.jpg

Вот, Валера достаточно большой обзор составил. Мало того, у него еще своя идея появилась, которую он реализовал. Молодец!

image articles/504/504.09.jpg

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

Смотрите, Дмитрий Мерцалов долго ковырялся с сохранением файла. Там реально сложно. Вообще использовать текстовый файл для хранения уровней – не очень хорошая идея. Она простая только в самом начале, когда вы начинаете. Вроде, все просто, понятно, легко, но чем дальше в лес, тем больше дров.

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

image articles/504/504.10.jpg

Смотрим дальше – улучшение редактора. В редакторе есть несколько недочетов. Например, нельзя было масштаб менять. В этом уроке мы это пофиксим.

image articles/504/504.11.jpg

Но вот, Оля в этой картинке видно– ой, какая красота! – сделала возможность смены размера более удобную, не через выбор, меню, а просто вот ввести тот размер, который надо. Потом, вот еще улучшение – написано, сколько таких полей, сколько таких полей.

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

image articles/504/504.12.jpg

Вот человечек, мы нажимаем на человечка и можем поставить его, куда угодно. Человечек может быть только один, поэтому он удаляется со старого места и ставится на новое. Потом ящики – можно добавлять новые или удалять. Еще есть вот такая прикольная функция, что можно поставить сразу в прямоугольник ящик, тоже прикольно. Вот размер можно уменьшить или увеличить. Вот сделаем 8 на 9. И вот стену поставим.

Вот такой у вас будет редактор.

Еще тут есть такая возможность, что при изменении размеров, видите, он ресайзится. Это тоже классная возможность на весь экран раскрыть, масштаб автоматически меняется.

Продолжим дальше. Вот первых 7 уроков, и наконец у нас будет создана программа - конкретный редактор. И вот на 8 уроке мы создаем ещё несколько своих уровней.

image articles/504/504.13.jpg

И вот Кирилл – оригинальный товарищ – придумал вот такие уровни. Помню, очень много времени потратил, когда его проходил первый раз. Вот такие уровни он придумал и нарисовал. Уровни вы создаёте в своём редакторе! Это значительно удобнее. И задача ваша будет – создать хотя бы десяток своих собственных уровней.

image articles/504/504.14.jpg

Дальше, начинаем писать игру с интерфейса. На первом уроке мы сделаем 2 формы – на первой форме будет кнопка Старт, а на второй – загружаться уровень.

image articles/504/504.15.jpg

На следующем уроке – управление. Мы научимся двигать этого человечка, сделать так, чтобы он мог ходить.

На этом уроке можно будет управлять этим человечком, чтобы он ходил по всем сторонам. И конечно, не просто ходить, а ходить, во-первых, на пустую клетку, во-вторых – толкать ящики, в-третьих – там еще что-то делать. И вот такой у нас получается результат.

И я хочу показать вам, как это будет выглядеть. Вот тут мы сейчас загрузим проект, Solution -> Сокобан. Вот уже на этом уроке, вы видите, после того, как вы сделали редактор, уже настолько все становится просто и понятно, что за 2 урока мы полностью делаем вот эту вот игру.

Начать игру – и вот это человечек, который ходит. Можно управлять на клавиатуре, и вот с этими ящиками можно так играться. Я сделал так, чтобы переход на следующий уровень можно сразу переходить, чисто для того, чтобы во время тестирования это очень удобно.

И вот уже наконец-таки можно поиграть. То есть при каждом движении мы смотрим, что впереди находится, может ли он перемещаться или нет. В массиве меняются все вот эти координаты.

Вот сейчас мы пройдем один уровень до конца, и проверяется, что все ящики поставлены, и тогда пишется, что уровень пройден, и можно идти дальше. И опять же тут resize тоже присутствует.

image articles/504/504.17.jpg

Едем дальше. Следующий урок – решалка, тестер. Рассказать об этом? Или, может, не стоит? Интересно, что я рассказываю тут? Хорошо.

Когда я проходил эту игру на своем телефоне, мне очень не нравилось, когда уровень уже почти пройден и нужно вот просто тупо ходить, то есть вот эти вот действия, которые надо выполнять – вот эти вот – мне уже все было ясно, что нужно сделать, а на клавиатуре телефона еще очень неудобно было все это нажимать, и мне очень хотелось, чтобы там была такая функция, чтобы человечка можно было отправить куда угодно – нажал вот сюда, и он побежал сюда, нажал сюда – и он побежал сюда. Вот такую функцию я очень хотел в свой телефон добавить.

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

И программа генерирует последовательность действий для решения этой задачи с одним ящиком. Вот видите? Этот ящик поставить сюда. Да, там и волновой – ну, в основном волновой алгоритм и используется. И вот, правда игра уже получилась немножко другой, но, тем не менее, играть в нее стало в некотором смысле интересней, понаблюдать, как он бегает.

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

image articles/504/504.18.jpg

Это консольная программа – вот есть у нас такой лабиринт в текстовом виде. Вот это А – это человечек, 0 – это ящик, и надо поставить сюда. И вот есть текстовое решение, которое необходимо сделать, то есть пойти вниз, вправо, вправо, нет, и вот эти действия выполняются.

Эта программа проверяет, решена правильно задача или неправильно.

После того, как получилась эта программа – для чего она нужна? – для того, чтобы тестировать. Мы начали создавать программу, которая решает. Я ее сейчас покажу, как она работает.

Вот тут у нас есть лабиринт. Вот – ящик, его надо поставить сюда. Это человечек. Мы написали программу, алгоритм, искусственный интеллект, если угодно, который находит решение этой задачи. Вот решение, то есть нужно сделать действие вот такое, вот такое, вот такое, но потом нужно узнать, работает оно или нет. И вот для того, чтобы работало, мы прошлый раз написали программу, я только что сказал – тест, и она отображает визуально, как это все происходит: вот 8 вверх, 6 вправо, 2 вниз, 6 вправо, 8 вверх. И вот так он выполняет все эти действия.

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

И вот после того, как мы это все проработали, то есть эта олимпиадная задача по решению такой задачи, но я все досконально, подробно рассказываю. Смотрите, 59 минут на создание тестера, 53 минуты на создание мышки, чтобы она двигалась, куда угодно. Еще 44 минуты, чтобы перемещать это яблоко. Потом еще 11 минут оптимизации, чтобы это работало молниеносно быстро, потому что по началу это очень медленно работало.

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

Скажите, интересно вам эта мысль? Хотелось бы вам создать такую же программу, которая…

Понимаете, конечно – это не самоцель для Сокобана вот такое сделать. Это отличнейшая возможность протестировать, прокачивать свои навыки программирования.

Этот ящик сюда, этот сюда, этот – сюда.

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

Вот так и получается.

image articles/504/504.19.jpg

На этом заканчивается первая часть игры Сокобан. Мы сделали редактор, мы сделали искусственный интеллект, мы сделали игру.

И начинается вторая часть, не менее интересная, даже более интересная – это Сокобан на двоих

- Поиск пути на питоне делал, поиск пути с ящиками…

Ну, конечно, круче! Просто поиск пути – это обычный волновой алгоритм, и он – не сложный. А вот когда еще с ящиком – тут уже посложнее, так сразу с пол пинка не сделаешь.

Но именно поэтому я записываю эти видеорешение, потому что по примеру это сделать значительно проще.

image articles/504/504.20.jpg

Дальше. Наша цель сделать игру на 2. И сначала мы делаем редактор на двоих. Я не видел в Интернете такой игры – Сокобан на двоих. Это я придумал сам. Ну, может она такая есть, но мне это было интересно, я вот такое создал.

Вот – Сокобан Editor-2, То есть мы не пишем ее заново – мы берем предыдущую программу, и ее чуть-чуть модифицируем. Смотрите, вот тут добавлен второй человечек, и вот второй человечек, где он будет находиться. В принципе, это единственное отличие, которое появилось, что можно задавать не только одного человечка, но и второго в любом месте.

Уровни, конечно, совсем другие. Вот, например, этот уровень одному нельзя пройти, а вдвоем – вполне возможно. То есть что мне нравится в такой игре – здесь – не соревнования, здесь кооперация, здесь игроки должны помогать друг другу. Но если еще вот в этом в первом уровне такое ощущение, как будто бы – кто быстрее – это шутка! Пока все не сделает, не пройдёт дальше, а вот дальше уже – вот этот уровень, или вот этот уровень – его одному не пройти! Нужно обязательно играть вдвоем. И появляется возможность сделать более сложный уровень.

image articles/504/504.21.jpg

Вот это я сам придумал такой уровень. Тетрис называется. Горжусь им! Вот так вот прикольно. Здесь, конечно, не обязательно одному играть, здесь можно вдвоем играть. Просто, чтобы быстрее вдвоем это все растаскать, потому что здесь очень много двигать нужно.

image articles/504/504.22.jpg

Вот это уровень "Лифт" – типа одна шахта лифта, другая шахта лифта, вот первый этаж, второй этаж. Тоже очень долго думал, как это все разместить, у меня вот такое получилось.

И я призываю вас самостоятельно подумать, придумать, как и что сделать … придумать уровни. И вот окончание – The end – тут тоже обязательно вдвоем надо.

Давайте отчеты посмотрим: решалку тестер Саша хорошую написал:

- Интересно, но понял только на третий раз.

Ну, да, она – просто повторить каждый сможет за мной по видео уроку, и будет работать. Вот Оля подтвердит. Она давно занимается, и она поначалу не очень понимала, что делает, но она все равно двигалась вперед и по всем урокам отчитывалась. Правильно я, Оля, говорю? Но со временем количество переходит в качество. И вот, пожалуйста, подтверждение моим словам – Саша с 3-го раза понял, как оно работает. А значит в следующий раз, когда он встретит что-то подобное, будет еще лучше и лучше это все отложится.

Дальше, как раз-таки, Оля решалку для Мышки тоже сделала и вот тут это все реализовала. Потом решалка с яблоком – это та же самая решалка, но… Да, Платон, это очень правильно. К старым урокам можно и нужно возвращаться потому, что уже делаешь их совсем по-другому, в несколько раз лучше, потому что уже больше осознания, что где происходит. Это очень правильно.

image articles/504/504.23.jpg

Так, вот – решалка оптимизации – Святослав очень хороший скриншот приложил, что в этом варианте у меня было время такое, время такое. Ну, правда, можно было бы, наверное, эффективность повыше найти, но ладно. Потому что я как смотрел – там оптимизация в миллионы раз. Ну, если не в миллион, то в несколько тысяч точно – Орандж подтвердит, если он еще тут у нас. Мы с ним вместе оптимизировали тогда еще, зимой.

Ага, и вот игра Сокобан, автоходы. Вот тут как раз, кстати, была реализована эта возможность. Но тут на картинке не видно – ходить с одной точки на другую.

image articles/504/504.24.jpg

И вот Оля сделала редактор на двоих, мало того, еще свой уровень придумала от слова Love, и вот такая красота получилась: вот один человечек, вот другой человечек. Замечательные человечки, все классно вышло.

Так, и следующий уровень – Сокобан телефон TCP/IP протокол. Значит, мы сделали игру на двоих, и теперь хотелось бы в нее поиграть вдвоем. Для этой цели у меня сначала реализовывается игра Сокобан-2, в которой можно поиграть вдвоем на одном компьютере. То есть стрелочки управляют одним человечком, цифры управляют вторым человечком. Можно вдвоем играть в эту игру на одной клавиатуре.

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

image articles/504/504.25.jpg

А потом у нас была цель – создать сервер Клиент. И вот тут вот создается специальный игрок телефон TCP/IP протокол, в котором мы реализуем эту программу. То есть у нас вот пишется такая программа телефон – один работает, как сервер, другой работает, как клиент. И вот смотрите, что у нас происходит. Они друг другу пересылают файлы.

То есть на этом уроке мы просто пишем класс, который позволяет соединить 2 компьютера, ровно 2 компьютера и посылать. Послал 15 – этот 15 получил, послал 19 – этот 19 получил. Вот так вот они общаются. И этот класс вы потом можете использовать в самых разных своих программах простеньких.

Он, конечно, не претендует там на универсальность, оптимальность, но общее понятие, как это делается, и запустить на выполнение какую-то программу несложную, вполне возможно.

image articles/504/504.26.jpg

И после того, как это все реализовано, можно реализовать игру Сокобан на двоих по сети. Как вот это тут сделано, я вам сейчас продемонстрирую, как это работает. Так, Сокобан-2, я вот его запускаю 2 раза. Вот на одном компьютере, вот на другом компьютере. Ну, пока у нас компьютер один. Здесь у нас будет сервер на 8000 порту работает, а здесь у нас будет клиент. Он подключается серверу по IP адресу 127.001 на этом же компьютере, и порт.

И вот, пожалуйста, у нас это второй игрок, это – первый игрок. И вот можно выполнять. Если какой-то игрок переходит на следующий уровень – а, так просто не перейдешь, надо решить! Ну, ладно, давайте решим. Ну, я тут один к сожалению. По сети, через Интернет не получается, потому что нужен компьютер с внешним IP адресом. И вот, пожалуйста – можно играть дальше! Переходить к следующему. Вот такой получится результат.

Напишите, нравится ли вам то, что я вам тут показал. У меня был смысл записать такой свой собственный обзор наиболее подробно со всеми вариантами, вариациями.

Ну, тут уже чуть попроще.

image articles/504/504.27.jpg

Так, ну и что у нас осталось? Игра на двоих по сети и завершение. В завершении мы еще кое-какие оптимизации делаем

- Да, - Кирилл написал – мы сделали это вместе! Единственно, что еще можно добавить, так это редактор, чтобы файл Levels каждый раз в ресурс не копировать.

Да, потом этот файл копируем в ресурс, чтобы с собой его не таскать везде. Ну, портфолио пока нет Сокобана еще, в будущем добавлю и в портфолио.

Вот, молодец, Кирилл, что закончил эту игру.

image articles/504/504.28.jpg

И я тоже вам предлагаю записаться. У вас уже есть хорошее начало. Напишите, пожалуйста, в чат – сколько задач вы выполнили – 1, 2, 3 или 4. У вас был доступ постепенно к первым 4 заданиям. Кто молодец – выполнил все 4, кто нет, сам себе добрый Буратино, у вас уже была возможность даже создать интерфейс.

Антон молодец!

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

То есть не только то, что я написал и заработало, а вот есть еще какая-то целостность, когда я не просто это прочитал и сделал, а много лет работал в этом направлении и реализовал – вот это все передается как-то более эффективно. Не знаю, кто-нибудь ощущает это по моим вебинарам или нет? Но я знаю, что это работает, когда сам хожу, записываюсь на другие вебинары. Сразу видно – преподаватель знает, что говорит или не знает.

Итак, у вас есть альтернатива – либо вы можете самостоятельно – я вам- сейчас все рассказал, если уверены в своих силах – пожалуйста, я буду за вас только рад! Можете самостоятельно попробовать сделать все то, что я вам сейчас рассказал. Либо можете вместе со мной пройти все эти этапы за руку, так сказать, выполнить все последовательно. И уже через месяц у вас будет готовая программа, и багаж знаний, который вы можете применить при создании любых других программ. И это поможет очень эффективно и очень сильно прокачать навыки программирования.




Автор: Волосатов Евгений Витольдович.

 
Написать комментарий:




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




Чтобы стать хорошим программистом — нужно писать программы. На нашем сайте очень много практических упражнений.

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

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

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