поле для игры змейка
Своя змейка, или пишем первый проект. Часть 0
Предисловие
Привет Хабр! Меня зовут Евгений «Nage», и я начал заниматься программированием около года назад, в свободное от работы время. Просмотрев множество различных туториалов по программированию задаешься вопросом «а что же делать дальше?», ведь в основном все рассказывают про самые основы и дальше как правило не заходят. Вот после продолжительного времени за просмотром разных роликов про одно и тоже я решил что стоит двигаться дальше, и браться за первый проект. И так, сейчас мы разберем как можно написать игру «Змейка» в консоли со своими начальными знаниями.
Глава 1. Итак, с чего начнем?
Для начала нам ничего лишнего не понадобится, только блокнот (или ваш любимый редактор), и компилятор C#, он присутствует по умолчанию в Windows, находится он в С:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe. Можно использовать компилятор последней версии который поставляется с visual studio, он находится Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Roslyn\csc.exe.
«@echo off» отключает отображение команд в консоли. С помощью команды goto получаем бесконечный цикл. Задаем переменную name, а с модификатором /p в переменную записывается значение введенное пользователем в консоль. «echo.» просто оставляет пустую строчку в консоли. Далее вызываем компилятор и передаем ему файл нашего кода, который он скомпилирует.
Глава 2. Первые шаги
Подготовим поле нашей игры, начиная с точки входа в нашу программу. Задаем переменные X и Y, размер и буфер окна консоли, и скроем отображение курсора.
Для вывода на экран нашей «графики» создадим свой тип данных — точка. Он будет содержать координаты и символ, который будет выводится на экран. Также сделаем методы для вывода на экран точки и ее «стирания».
Это интересно!
Оператор => называется лямбда-оператор, он используется в качестве определения анонимных лямбда выражений, и в качестве тела, состоящего из одного выражения, синтаксический сахар, заменяющий оператор return. Приведенный выше метод переопределения оператора (про его назначение чуть ниже) можно переписать так:
Создадим класс стен, границы игрового поля. Напишем 2 метода на создание вертикальных и горизонтальных линий, и в конструкторе вызываем отрисовку всех 4х сторон заданным символом. Список всех точек в стенке нам пригодится позже.
Как вы могли заметить для инициализации типа данных Point используется форма Point p = (x, y, ch); как и у встроенных типов, это становится возможным при переопределении оператора implicit, в котором описывается как задаются переменные.
Вернемся к классу Game и объявим поле walls, а в методе Main инициализируем ее.
Все! Можно скомпилировать код и посмотреть, что наше поле построилось, и самая легкая часть позади.
Глава 3. А что сегодня на завтрак?
Добавим генерацию еды на нашем поле, для этого создадим класс FoodFactory, который и будет заниматься созданием еды внутри границ.
Добавляем инициализацию фабрики и создадим еду на поле
Глава 4. Время главного героя
Перейдем к созданию самой змеи, и для начала определим перечисление направления движения змейки.
Теперь можем создать класс змейки, где опишем как она будет ползать, поворачивать. Определим список точек змеи, наше перечисление, шаг на сколько будет перемещаться за ход, и ссылки на хвостовую и головную точки, и конструктор, в котором рисуем змею в заданных координатах и заданной длинны при старте игры.
В методе поворота, что бы избежать возможности повернуть сразу на 180 градусов, просто указываем, что в каждом направлении мы можем повернуть только в 2 стороны. А проблему поворота на 180 градусов двумя нажатиями — поставив «переключатель», отключаем возможность поворачивать после первого нажатия, и включаем после очередного хода.
Осталось вывести ее на экран.
Готово! теперь у нас есть все что нужно, поле огороженное стенами, рандомно появляющаяся еда, и змейка. Пришла пора заставить все это взаимодействовать друг с другом.
Глава 5. Л-логика
Заставим нашу змейку двигаться, напишем бесконечный цикл для считывания клавиш нажатых на клавиатуре, и передаем клавишу в метод поворота змеи
Теперь, перед тем как написать метод движения змейки, надо реализовать взаимодействие головы с едой, стенками и хвостом змеи. Для этого надо написать метод, позволяющий сравнивать две точки на совпадение координат. Переопределим оператор равенства и не равенства, их обязательно нужно переопределять в паре.
Теперь можно написать метод, который будет проверять совпадает ли интересующая нас точка с какой нибудь из массива стен.
И похожий метод проверяющий не совпадает ли точка с хвостом.
И методом проверки съела ли еду наша змейка, и сразу делаем ее длиннее.
теперь можно написать метод движения, со всеми нужными проверками.
Вот и все! Наша змейка в консоли закончена и можно поиграть.
Заключение
Мы посмотрели как можно реализовать первую простенькую игру с небольшим использованием ООП, научились перегружать операторы, посмотрели на кортежи и лямбда оператор, надеюсь это было полезно!
Это была пилотная статья, и если вам понравилось, я напишу про реализацию змейки на Unity.
Всем удачи!
Искусственный интеллект для змейки. Часть 1: Кратчайший/длиннейший путь, Гамильтонов цикл
В этой статье я хочу показать различные подходы к решению классической игры Змейка (Источник идеи статьи). Думаю, правила и цель игры всем известны.
1. Кратчайший путь. Поиск в ширину (Breadth-first search) Вики
Представим поле игры в виде графа. Каждая ячейка поля связана как минимум с 2-мя соседями. Таким образом, перебирая соседей можно найти ячейку с «едой». А после восстановить путь по которому мы до нее дошли.
Примерный алгоритм действий:
Алгоритм отлично работает до тех пор пока «хвост» змеи не начинает перекрывать кратчайший путь.
Серым цветом выделен рассчитанный путь.
2. Поиск в глубину (Depth-first search) Вики
Поиск в глубину отличается тем, что сначала рассматриваются максимально далекие подчиненные текущего узла.
Отличие алгоритма от поиска в ширину будет минимальным: на шаге 2 берем узел не с вершины, а со дна стека.
Если наша цель максимизировать количество очков, то можно удлинить путь к еде включая в него максимальное число соседних узлов.
Для этого получим кратчайший путь (поиском в ширину) и будем рассматривать каждые 2 узла пути. Если есть возможность, то включаем в путь 2 соседних.Повторяем упражнение пока расширение возможно.
Результат увеличился, тем не менее, хвост все еще продолжает мешать.
4. Гамильтонов цикл Вики
Если нас не волнует количество шагов, то можно посчитать длиннейший путь не к еде, а к хвосту. Т.к. длиннейший путь проходит по большинству ячеек поля, то еда будет съедена по пути, не зависимо от ее расположения.
В зависимости от расположения змеи могут образовываться недостижимые ячейки, поэтому, строго говоря, данный алгоритм не соответствует определению Гамильтонова цикла.
5. Гамильтонов цикл 2
Самый простой алгоритм из описанных, обладает 100% эффективностью и не требует никаких расчетов.
Подойдет для любого прямоугольного поля на котором нет препятствий.
Если нас действительно не волнует число шагов, то можно просто ходить по зацикленному пути:
Обработка протестирована на 8.3.12.1595, 8.3.12.1855
Как искусственный интеллект играет в «Змейку»
Рассказываем о нейросети, которая применяет глубокое обучение и обучение с подкреплением, чтобы играть в Змейку. Код на Github, разбор ошибок, демонстрации игры искусственного интеллекта и эксперименты над ним вы найдете под катом.
С тех пор, как я посмотрела документальный фильм Netflix об AlphaGo, я была очарована обучением с подкреплением. Такое обучение сравнимо с человеческим: вы видите что-то, делаете что-то и у ваших действий есть последствия. Хорошие или не очень. Вы учитесь на последствиях и корректируете действия. У обучения с подкреплением множество приложений: автономное вождение, робототехника, торговля, игры. Если обучение с подкреплением вам знакомо, пропустите следующие два раздела.
Обучение с подкреплением
Принцип простой. Агент учится через взаимодействие со средой. Он выбирает действие и получает отклик от среды в виде состояний (или наблюдений) и наград. Этот цикл продолжается постоянно или до состояния прерывания. Затем наступает новый эпизод. Схематично это выглядит так:
Цель агента — получить максимум наград за эпизод. Вначале обучения агент исследует среду: пробует разные действия в одном и том же состоянии. С течением обучения агент исследует всё меньше. Вместо этого он, основываясь на собственном опыте, выбирает действие, приносящее наибольшую награду.
Глубокое обучение с подкреплением
Глубокое обучение использует нейронные сети, чтобы из входных данных получать выходные. Всего один скрытый слой — и глубокое обучение может приближать любую функцию. Как это работает? Нейронная сеть — это слои с узлами. Первый слой — это слой входных данных. Скрытый второй слой преобразует данные с помощью весов и функции активации. Последний слой — это слой прогноза.
Как следует из названия, глубокое обучение с подкреплением — это комбинация глубокого обучения и обучения с подкреплением. Агент учится прогнозировать лучшее действие для данного состояния, используя состояния как входные данные, значения для действий как выходные данные и награды для настройки весов в правильном направлении. Давайте напишем Змейку с применением глубокого обучения с подкреплением.
Определяем действия, награды и состояния
Чтобы подготовить игру для агента, формализуем проблему. Определить действия просто. Агент может выбирать направление: вверх, вправо, вниз или влево. Награды и состояние пространства немного сложнее. Есть много решений и одно будет работать лучше, а другое хуже. Одно из них опишу ниже и давайте попробуем его.
Если Змейка подбирает яблоко, ее награда 10 баллов. Если Змейка умирает, отнимаем от награды 100 баллов. Чтобы помочь агенту, добавляем 1 балл, когда Змейка проходит близко к яблоку и отнимаем один балл, когда Змейка удаляется от яблока.
У состояния много вариантов. Можно взять координаты Змейки и яблока или направления к яблоку. Важно добавить расположение препятствий, то есть стен и тела Змейки, чтобы агент учился выживать. Ниже резюме действий, состояний и наград. Позже мы увидим, как корректировка состояния влияет на производительность.
Создаем среду и агента
Агент работает с сетью Deep Q, чтобы найти лучшие действия. Параметры модели ниже:
Если интересно посмотреть на код, вы найдёте его на GitHub.
Агент играет в Змейку
А теперь — ключевой вопрос! Научится ли агент играть? Понаблюдаем, как он взаимодействует со средой. Ниже первые игры. Агент ничего не понимает:
Первое яблоко! Но по-прежнему выглядит так, будто нейросеть не знает, что делает.
Находит первое яблоко… и чуть позже ударяется о стену. Начало четырнадцатой игры:
Агент учится: его путь к яблоку не самый короткий, но он находит яблоко. Ниже тридцатая игра:
После всего 30 игр Змейка избегает столкновений с самой собой и находит быстрый путь к яблоку.
Поиграем с пространством
Может быть, возможно изменить пространство состояний и достичь похожей или лучшей производительности. Ниже возможные варианты.
Ниже графики производительности разных состояний:
Найдем пространство, ускоряющее обучение. График показывает средние достижения последних 12 игр с разными состояниями.
Понятно, что когда пространство состояний имеет направления, агент учится быстро, достигая наилучших результатов. Но пространство с координатами лучше. Может быть, можно достичь лучших результатов, дольше тренируя сеть. Причиной медленного обучения может быть число возможных состояний: 20⁴*2⁴*4 = 1,024,000. Поле 20 на 20, 64 варианта для препятствий и 4 варианта текущего направления. Для исходного пространства вариантов 3²*2⁴*4 = 576. Это более чем в 1700 раз меньше, чем 1,024,000 и, конечно, влияет на обучение.
Поиграем с наградами
Есть ли лучшая внутренняя логика награждения? Напоминаю, Змейка награждается так:
Первая ошибка. Хождение по кругу
На одном временном отрезке агент получает один балл за выживание.
ИИ проходит по ближайшей стене, чтобы минимизировать потери.
Нужно только 30 игр. Секрет искусственного интеллекта — опыт предыдущих игр, который учитывается, чтобы нейросеть училась быстрее. На каждом обычном шаге выполняется ряд шагов переигрывания (параметр batch_size ). Это так хорошо работает потому, что для данной пары действия и состояния разница в награде и следующем состоянии небольшая.
Ошибка №3. Нет опыта
Опыт действительно так важен? Давайте уберём его. И возьмём награду за яблоко в 100 баллов. Ниже агент без опыта, сыгравший 2500 игр.
Хотя агент сыграл 2500 (!) игр, в змейку он не играет. Игра быстро заканчивается. Иначе 10 000 игр заняли бы дни. После 3000 игру у нас только 3 яблока. После 10 000 игр яблок по-прежнему 3. Это удача или результат обучения?
Действительно, опыт очень помогает. Хотя бы опыт, учитывающий награды и тип пространства. Как много нужно переигрываний на шаг? Ответ может удивить. Чтобы ответить на этот вопрос, поиграем с параметром batch_size. В исходном эксперименте он установлен в 500. Обзор результатов с разным опытом:
200 игр с разным опытом: 1 игра (опыта нет), 2 и 4. Среднее за 20 игр.
Внимательный читатель может сказать: максимум яблок в змейке — 399. Почему ИИ не выигрывает? Разница между 60 и 399, в сущности, небольшая. И это верно. И здесь есть проблема: Змейка не избегает столкновений при замыкании на себя.
Интересный способ решить проблему — использовать CNN для поля игры. Так ИИ может увидеть всю игру, а не только ближайшие препятствия. Он сможет распознавать места, которые нужно обойти, чтобы победить.
Получить востребованную профессию с нуля или Level Up по навыкам и зарплате, можно, пройдя онлайн-курсы SkillFactory:
Игры змейка онлайн
Приглашаем в неизведанный мир больших и малых, хитрых и опасных змей в игре Littlebigsnake. io. Это продолжение первой части, которая вышла с дополнениями и обновлениями. Теперь игровой процесс стал еще насыщенней и
«Slithercraft. Ио» — это многопользовательская онлайн игра, смесь Майнкрафта и классической змейки. Эта гремучая смесь гарантирует вам интересный геймплей. Перед тем, как начать игру вам нужно ввести ник и выбрать скин
Есть, чтобы расти – вот главный девиз этой игры и вы скоро поймете почему. Ваш персонаж маленький змей пестрого оттенка. Он оказывается в некой прострации, где вокруг одна темнота и лишь частички энергии пробивают свет.
Перед началом игры вам предлагается выбрать никнейм и вписать его в определенное окошечко. Далее, вы перенесетесь на игровую площадку, где и находится ваш персонаж. Ваша цель – это поглотить других участников, которые
Что может быть лучше, чем побороться в мультиплеерном режиме за неизведанные территории? В Суперхекс.ИО есть такая возможность, вы управляете персонажем, который при своём движении выделяет область, после того как
Милые прожорливые змеи принимают участие в беспощадной битве, чтобы стать величайшими из всех в игре Gulper. io. Собирайте цветные шары, чтобы увеличить свой размер и свой счет, и попытайтесь перехватить других
За счет своего красочного дизайна и необычной идеи, данная игра будет интересна не только среднестатистическому взрослому, но и маленьким детям. За счет простого пользования она стала лоступна для разного возрастного
Какую часть бумаги вы сможете захватить? В многопользовательской онлайн игре «Бумажки. ио» вы окажетесь в мире красочных фигур, где будете играть за захват территорий. Суть состоит в том, чтобы захватить как можно
Глядя на змеек в онлайн игре «Счастливые змейки» и не думаешь о том, что эти персонажи борются за выживание. Игра представляет собой жанр ио, а значит, да здравствует многопользовательский режим. Сразу несколько игроков
Помните классическую змейку, которую мы играли на телефонах? В новой онлайн игре Санта Змейки вам предстоит встретиться с новыми змейками, которые к тому же принарядились в новогодние костюмы. Теперь змейки готовы вновь
Вырастите самую большую змею в этой онлайн трёхмерной вариации знаменитой игры змейка. Основа игрового процесса не изменилась в данной игре спустя десятилетия. Вы играете за змею, и ваша задача состоит в поглощении еды.
«Птички Слизарио» — это фантастическая ио игра, в которой заложена концепция «Slither. io», она сочетается с симпатичными персонажами из культовой игры «Angry Birds». Перед тем, как начать, вам нужно ввести имя
Кому же не нравятся мифические драконы! Они такие большие, красивые и величественные! Хотите превратиться в одного из них и сразиться с другими драконами? Тогда, добро пожаловать в игру «SlitherDragon. io»! Чтобы начать
Проведите пальцем по экрану и манипулируйте бумажной лентой, чтобы побороться за территорию. Эта игра так похожа на snakes one, все, что вам нужно сделать, это собрать шары с цифрами, где змея может увеличить свой хвост
Лимакс.ИО одна из небольших сетевых игр, где одновременно на одной карте играют десятки а то и сотни игроков. Цель игры – вырастить своего персонажа пожирая разбросанные на карте предметы. И, конечно же, заработок
Помните, старую игру Змейку? Игра «Злые Змеи» отчасти аналогична с игрой детства, но все же имеет свои особенности. Здесь мы окажемся на ярком игровом поле, изначально управляя маленькой змейкой. На поле расположены
Наслаждайтесь качественной онлайн игрой «Рождественский поезд» и соревнуйтесь с другими игроками в ловкости. Это ио игра, в новогодней стилистике, которая по игровому процессу отчасти напоминает старую добрую Змейку. Под
В онлайн игре «Змейка, как на Нокиа 3310» вы сможете сыграть классическую аркаду детства, с оригинальным дизайном и геймплеем. Вы будете управлять черной змейкой, которую нужно накормить черными фигурками. Цель в данной
Эти змейки живут своей жизнью и в онлайн игре «Бумажные Змейки» вы познакомитесь с их образом жизни получше. Игра представляет собой жанр ио, в котором вы окажетесь в одном пространстве со своими соперниками. Здесь вы
В том, насколько жесток мир змей, вы можете убедиться лично, в онлайн игре «Змейка Атакует». Это увлекательная игра ио жанра, в которой вам предстоит сразиться с многочисленными противниками онлайн, за место лидера. В
Блочный змея является захватывающим бесконечная игра, в которой вы перемещаете змея вправо или влево. Старайтесь избегать препятствий, стоящих на вашем пути, разбивайте блоки, чтобы получить результат, собирает трупы,
Игра про змею, которая любит фрукты. Расти ваш змея, поедая фрукты и как он растет, используйте платформу, чтобы иметь возможность для достижения других высоко висящие плоды. Есть только одна загвоздка, змею действует
Холодный змей заполз змей игра в 3D заснеженный мир. Стать великим змея в игре, поедая других и растут дольше. Собрать силы UPS, чтобы расти быстрее. Удачи!
Мышь для меню, клавиши курсора / wasd для игры. Классическая змея!
Классическая игра Змейка имеет множество аналогов. Но сегодняшняя флеш игра «Логическая Змейка» отличается от остальных тем, что здесь вам предстоит быть в первую очередь находчивым и применить логику. Игровой процесс
Перемещения змеи вокруг доски, избегая коробки. Едят все золотые монеты, чтобы перейти на следующий уровень. Милый маленький змея хочет съесть золотых монет. Направлять змея, чтобы добраться до монет и жрать заставлю
Это змея, но быстрее. Это хороший клон змея, что это немного более сложным, и один, что вы можете сделать лучше, чем больше вы играете. Навык будет иметь значения из-за комбо множитель; не позволяйте таймер достигнет
От кого должна убегать змея? Ответ прост – от себя самого. Ведь после того, как она существенно прибавит в размерах и перестанет помещаться на игровом поле, придется изворачиваться и предпринимать действие, которые
Здесь вы можете играть, я люблю апельсиновый сок. Я люблю апельсиновый сок является одним из наших выбранных игр мастерства.
Базовая десять удовольствие помогает детям понять значение место, сложение и вычитание с помощью виртуальной игрушки. Дети могут выбрать режим игры в зависимости от желаемого уровня сложности, а также выбрать место
Игры змейка играть онлайн
Мало кто не знает о такой игре как змейка. Игра появилась в далекие 70-е годы и с тех пор ее смысл нисколько не изменился. Перед игроком стоит задача направлять это ползающее существо в нужном направлении. Когда змея съедает что-то – она растет, если врезается в стену или свой хвост – умирает. Играя в змейку онлайн, вы тренируете ловкость пальцев, внимательность и реакцию. С каждым съеденным кусочком играть становится все сложнее ведь игровая зона остается прежней.
На сегодняшний день Змейка получила свое продолжение в более современных играх, которые обладают красочной графикой, множеством уровней и режимов. Самыми новыми версиями игры являются:
Игра змейка – это хороший способ снять напряжение после рабочего дня или скоротать время, сидя в очереди. Игра хороша тем, что не требует сильных умственных нагрузок, она наоборот создана для того, чтобы расслабиться. Несмотря на то, что этой игре уже около 50 лет, она не теряет своей популярности, а даже наоборот, новые версии этой игры набирают популярность. Разнообразие такой простой игры просто впечатляет, сейчас можно поиграть в змейку, сделанную под страшилку или гоночки.
Если вы устали и хотите немного расслабиться, играя в простую, но интересную игру, то наш сайт именно для вас. Эта категория сайта посвящена бессмертной игре – «Змейка». Поиграть онлайн можно без всякого труда, для этого вам нужно просто выбрать любимую игру и она запустится прямо в вашем браузере.