Содержание статьи
Пишем игру крестики-нолики на Python на двоих и против компьютера
Шаг 3. Основный игровой цикл
Ну вот мы и подошли к созданию основного игрового цикла. Нам предстоит крутиться в цикле до момента пока кто нибудь не выиграет. Игроки будут по очереди делать ходы, мы будем проверять каждый раз не победил ли кто и как только кто то побеждает — выходим из цикла и завершаем программу.
В турнире, который проходил в питтсбургском казино Rivers было сыграно 120 тысяч раздач в безлимитный техасский холдем один на один (Хедз-Ап), против Libratus играли Даниэль МакОлэй, Джимми Чу, Донг Ким и Джейсон Лес. В результате 20-дневного турнира программа победила людей, заработав более 1,7 миллиона долларов в фишках. Несмотря на это, разработчики не получат никаких денег, а призовой фонд в 200 тысяч долларов будет поделен между четырьмя живыми игроками в зависимости от занятого места.
В последнее время наработки в области машинного обучения позволили компьютерам значительно продвинуться вперед и обыграть людей в играх, в которых это традиционно считалось невозможным. Однако, вплоть до недавнего времени люди по-прежнему побеждали в играх с неполной информацией. В 2015 году программа Claudico (предшественник Libratus) играла с четырьмя профессиональными игроками и заняла предпоследнее место. На протяжении двух недель было сыграно 80000 раздач, и из четырех живых игроков только один набрал меньше фишек, чем компьютер.
В языке программирования Python наилучшим выбором будет список из 9 значений. Назовем его maps. Первоначально этот список будет заполнен цифрами от 1 до 9. Это сделано для удобства организации диалога с пользователем. Пользователю будет достаточно ввести символ от 1 до 9, что бы мы смогли понять куда он сделал ход. После того как ход сделан, цифру мы заменим на символ нолика или крестика. (Можно было заполнить цифрами от 0 до 8. В этом случает было бы удобнее работать — цифра и есть индекс элемента в списке, но первый нолик будет смущать игроков).
Если вы учитесь программировать, то программирование игр — это очень хороший способ освоить алгоритмы и структуры данных. В этом уроке мы разберем запрограммируем игру крестики нолики на Python. Полный код программы с искусственным интеллектом для игрока-компьютера занимает всего 140 строк. В варианте игры где человек играет против человека — раза в два меньше.
А вот теперь мы подобрались к самому интересному моменту в программировании. Нам нужно создать искусственный интеллект, который всегда будет выигрывать или сводить игру к ничьей. На самом деле в игре крестики-нолики такой алгоритм написать совсем не сложно.
Готовая программа для игры в крестики нолики против компьютера на Python
На данный момент точно не известно, как именно работает Libratus, авторы описали лишь общую структуру программы и планируют в ближайшем будущем опубликовать статью в рецензируемом журнале. По словам разработчиков, Libratus состоит из трех частей. Основное «ядро» Libratus было подготовлено заранее, вычисления заняли 15 миллионов ядро-часов, в то время как на Claudico ушло два-три миллиона. Вторая часть программы следила за возможными ошибками, которые могли допустить соперники, и учитывала в процессе игры эту информацию. Третья часть Libratus отслеживала собственные слабые стороны, которые могли использовать противники, и корректировала общую стратегию с учетом этих данных. Такой подход позволил программе как блефовать самостоятельно, так и распознавать дезинформацию со стороны соперников.
Немного перепишем и основной цикл игры. Теперь вместо человека 2 ход будет делать компьютер. Компьютер каждый раз будет говорить куда делает ход. Если компьютер не дает ответ, значит наметилась ничья — завершаем партию и объявляем ничью. Вот таким станет основной цикл игры, когда мы перепишем программу крестики-нолики под игру против компьютера:
Американские ученые разработали технологию пассивного теплового зрения HADAR, которая по инфракрасному изображению получает информацию о температуре, материалах и текстуре поверхности объектов, их излучательной способности, а также умеет измерять расстояние. Технология позволяет в ночных условиях получать изображение, сопоставимое по качеству со стереоскопическими изображениями, получаемыми обычными RGB камерами при дневном освещении. Статья опубликована в журнале Nature. Для автономной навигации и взаимодействия с людьми роботам и беспилотникам нужна информация об окружении, которую они получают с помощью камер, лидаров, сонаров или радаров. Однако обычные камеры зависят от условий освещенности и плохо работают в ночное время и при плохой погоде. Кроме этого информация, получаемая с камер не содержит физического контекста, что может приводить к некорректной работе нейросетевых алгоритмов автопилота, который, к примеру, не может отличить настоящего человека от манекена. Активные сенсоры, такие как лидары и радары, при резком росте их числа начинают взаимно влиять друг на друга. Выходом могло бы стать использование в условиях недостаточной видимости камер, работающих в инфракрасном диапазоне. Однако из-за так называемого «эффекта призрачности» получаемые тепловизором изображения обычно выглядят как пятна без четкой текстуры. Это связано с тем, что поверх отражающихся от объекта инфракрасных лучей, которые несут информацию об особенностях его рельефа, накладывается его собственное тепловое излучение, которое засвечивает эту полезную информацию. Группа ученых под руководством Зубин Джакоб (Zubin Jacob) из Университета Пердью смогла справиться с этой проблемой. Они разработали технологию под названием HADAR (акроним от слов heat-assisted detection and ranging), которая с помощью машинного обучения извлекает из изображений, полученных в инфракрасном диапазоне, информацию о температуре объектов, излучательной способности материалов, из которых они состоят, а также их физической текстуре. Кроме того, технология позволяет определять расстояние до объектов на изображении. Выделение информации о собственном излучении объектов позволяет избавиться от «эффекта призрачности» и получить информацию о текстуре. Для этого авторы используют данные из библиотеки материалов, которая содержит информацию об их излучательной способности. Инфракрасное изображение фиксируется с помощью гиперспектральной камеры, после чего данные поступают на вход нейросетевой модели, которая производит декомпозицию исходных данных, выделяя из них информацию о температуре, собственном излучении и текстуре. Для обучения алгоритма исследователи использовали как настоящие изображения, полученные с помощью камеры, так и множество сгенерированных трехмерных сцен. Возможности технологии демонстрирует одна из сцен, на которой при слабом освещении запечатлен автомобиль черного цвета и человек, рядом с которым установлен вырезанный из картона портрет Альберта Эйнштейна в натуральную величину. Изображения, полученные с помощью обычной камеры, лидара и HADAR затем использовали для определения объектов с помощью алгоритма распознавания изображений. На изображении, полученном с помощью обычной камеры, алгоритм ошибочно распознал двух людей, приняв картонную фигуру за человека. На данных, полученных лидаром, оказалось невозможно определить автомобиль. При этом HADAR смог выделить все составляющие сцены, а также определить, что одна из человеческих фигур имеет сигнатуру краски на поверхности, а вторая покрыта тканью. Созданная технология может значительно улучшить системы автономной навигации беспилотных транспортных средств и роботов, дополнив уже существующие системы или даже заменив их. HADAR позволяет определять объекты и измерять расстояние по данным, полученным в ночное время, так же хорошо, как это делают традиционные системы компьютерного зрения, которые используют данные с камер в условиях дневного освещения. По словам авторов работы, в дальнейшем им предстоит решить проблему высокой стоимости оборудования для гиперспектральной съемки и невысокой производительности алгоритма. Сейчас процесс получения изображений и их обработки занимает минуты, но для работы в режиме реального времени это время необходимо сократить. Ранее мы рассказывали, как физики создали лидар, способный распознать метровые детали с рекордного расстояния в 45 километров в условиях высокого шума и слабого сигнала.
У нас получилась довольно беспощадная программа. Ее искусственный интеллект победить не возможно. Человек либо проигрывает, либо играет в ничью. Подумайте как можно дать человеку иногда выигрывать? Возможно вы захотите создать несколько уровней. Например в первом искусственный интеллект очень слаб, дальше он умнет. Или у вас будет на выбор несколько режимов игры на выбор: слабый ИИ, средний и непобедимый.
Еще мы создадим второй список victories в котором будем хранить информацию обо всех выигрышных комбинациях. И нам будет нужно создать функцию print_maps, которая будет выводить содержимое нашего списка maps на экран.
Первая функция будет рисовать на поле крестик или нолик, в зависимости от того что в нее передали. Позицию в нее так же нужно будет передавать. Вставлять переданный элемент мы будем по индексу. Индекс определим функцией index (если бы мы пронумеровали от 0 до 8 элементы в maps, то переданное значение и было бы индексом. Можете попробовать — будет на одну строчку кода меньше.)
Вы можете прямо сейчас поиграть в крестики нолики против компьютера или друг против друга. Просто скопируйте текст программы на этой странице и вставьте его в поле программы в этом онлайн эмуляторе Python: https://replit.com/languages/python3 или тут https://www.onlinegdb.com/online_python_compiler
Кроме покера машины также победили людей в го, игру с полной информацией. В прошлом году программа AlphaGo выиграла у одного из сильнейших игроков в мире Ли Седоля четыре игры из пяти. В некоторых играх с неполной информацией человек до сих пор побеждает компьютер, в том числе в Starcraft.
Шаг 4. Добавление алгоритма для искусственного интеллекта в игре крестики-нолики
Для написания такого алгоритма нам понадобится вспомогательная функция, которая будет проверять все победные линии в игре и подсчитывать в них количество крестиков и ноликов. Если функция находит такую линию, то она возвращает позицию на этой линии куда нужно сделать ход. Например мы будем отслеживать линии где противник поставил два крестика и обязательно поставим нолик, что бы не дать ему выиграть. Вот эта функция:
По мнению авторов программы у систем, подобных Libratus, большое будущее в самых разных сферах, где приходится иметь дело с неполной информацией. В качестве возможных сфер применения программы исследователи называют информационную безопасность, военное дело, аукционы, переговоры и даже бережливое распределение медикаментов.
Игра крестики-нолики хороша тем, что ее правила знакомы всем с детства и понятны каждому. Это даст вам возможность сосредоточиться именно на процессе программирования, а не на анализе правил игры. В процессе работы над игрой крестики-нолики мы будем использовать только стандартные функции языка Python без подключения каких либо сторонних библиотек.
Имеется задача: Игра ним для двух игроков с двумя кучами и без ограничения на количество забираемых камней. Напишите программу с «искусственным интеллектом» (ИИ), которая играет против пользователя и выигрывает, если может. Исходное количество камней в кучах задаёт пользователь, программа всегда ходит первой. Выигрывает забравший последний камень, и при окончании игры нужно объявить победителя. Алгоритм игры выглядит следующим образом: Сначала пользователь вводит количества камней в кучах (натуральные числа, каждое на новой строке). Затем первый ход делает программа и выводит через пробел четыре числа: из какой кучи взяты камни; сколько камней взято; сколько камней осталось в кучах, сначала в первой, затем во второй. Затем ход делает пользователь: вводит на отдельных строках номер кучи и количество камней, которые он хочет взять. Если ход некорректный, например, пользователь пытается взять камней больше, чем есть в куче, программа должна вывести: Некорректный ход: <куча> и ожидать нового ввода пользователя. После каждого корректного хода игрока или ИИ нужно выводить четыре числа, как и после первого хода ИИ. Если выигрывает игрок, то надо вывести фразу: Вы выиграли!, а если ИИ – фразу: ИИ выиграл! Все сообщения программы должны строго соответствовать условию. Формат ввода Для старта игры вводятся два натуральных числа. Пример диалога игры: 10
10
2 1 10 9
1
15
Некорректный ход: 1 15
2
10
Некорректный ход: 2 10
2
7
2 7 10 2
1 8 2 2
2
1
2 1 2 1
1 1 1 1
1
1
1 1 0 1
2 1 0 0
ИИ выиграл! Примечания Данная задача дополнительно проверяется преподавателем. Обратите внимание, что ИИ в выводе не показывает получаемые данные от игрока. К ней есть код, который выполняет свою работу, игра работает, но с одним недостатком, если пользователь введет некорректную цифру, то программу «заклинит» и она на каждое действие будет писать — Неверный ход. Также в LMS выдается ошибка:куча>