Автор оригинала: FreeCodeCamp Community Member.
Бен Карп
Как часть FreeCodecamp Учебный план, мне бросили вызов построить TIC-TAC-TOE веб-приложение. Это было настоящее удовольствие.
Приложение включает в себя Ultimate Player Player. Он может оптимизировать любую заданную ситуацию на доске Tic-Tac-Toe. Результат удивил меня.
Даже в такой простой игре компьютерный плеер научил меня некоторые новые шаги. Что касается кода, который я написал, это несколько уникально и интересно для изучения.
Проверьте это
Посетить эта ссылка и выберите, чтобы играть против компьютера. Я бросаю вызов вам выиграть Отказ Вы можете найти … что вы не можете.
Тем не менее, если у вас сложно в защиту, вы можете узнать, что компьютер не может выиграть. Я узнал по опыту, что Tic-Tac-Toe имеет простой не потерять Стратегия.
Это означает, что если вам удастся получить галстук, вы делаете правильный защитный выбор. Компьютер все еще оптимизирует его «движения». Итак, лучший результат может достичь против игрока, такого как вы можете быть только галстуком.
Основные шаги решения
1. Структура данных доски
_gameBoard: [["", "", ""],["", "", ""],["", "", ""]]
Массив доски содержит 3 массива, каждый из которых представляет строку. Каждый массив строки содержит 3 символа или элементы строки.
Эти элементы либо:
- ” «Как пустая строка, представляющая пустую клетку
- ” X “представляющий X игрока
- “O” Представление игрока O
2. Функция GetResult.
Начинается в строке 59
В любом данном состоянии Совет будет в одном и единственным из этих возможных государств:
- Неполный
- Игрок X победил
- Игрок о победил
- или галстук
getresult Функция получает массив доски, итерации по всем строкам, через все столбцы и по всему диагонали. Это проверяет преемственность символов. Тогда это позволяет нам знать текущее состояние этого совета.
3. Функция getbestmove.
Здесь становится сложнее. Когда доска пустое, очень сложно определить наилучший возможный ход. Посмотрите на эту доску.
Какой самый лучший возможный шаг?
Когда доска становится населенной, наилучшим возможным шагом выскакивается на наши глаза.
Давайте использовать эту населенную доску в качестве нашей отправной точкой. Давайте решим, что следующий ход – наше, и что наш символ – «X».
Давайте попробуем определить наилучшее возможное движение с инструментами, которые у нас уже есть. Существует 3 пустых ячеек, которые соответствуют 3 возможных движениях. Давайте проверим результат для каждого из этих вариантов.
Мы можем сделать это, итерацией по возможным ходам, а для каждого из них:
- Создать новую доску
- Добавьте наш символ к соответствующей пустой ячейке
- Отправить эту доску на
getresultфункция
С 3 досок на рисунке выше, когда мы отправляем вторую доску на getresult Функция, мы получим наш трофей.
Пожалуйста, сосредоточиться на следующих существенных шагах:
- Нам нужно оценить возможные шаги, чтобы мы могли сравнить их. Давайте решим, что если бы шаг дает победившую доску, мы будем оценивать его 1. Если это дает проигравшую доску, она получит оценку -1. Галстук получит оценку 0.
- Движение 2 получит класс 1. Когда мы находим шаг, оцененный с 1, мы можем игнорировать все остальные возможные движения. Нет другого лучшего возможного движения, чем определенная победа.
- Но ради понимания, как бы мы оценили перемещения 1 или 3 или любой другой ход с неполным результатом?
Давайте сосредоточимся на движении 3. Решение – отправить соответствующую доску рекурсивно для getbestmove функция.
Вы можете думать: «Но подожди! Наш противник играет следующий шаг. ” Верно. Давайте узнаем, какой сорт наш оппонент получает для своего лучшего будущего движения.
Наш противник имеет только два возможных движения:
Переместить 3-1 выиграть игру в пользу нашего противника. Так как мы используем точно так же getbestmove Функция, двигаться 3-1 получит класс 1.
Это может быть немного запутано как наша победа, и наша потеря получит оценки 1. Нам нужно помнить, что этот звонок в функции принадлежит нашему противнику, и его победа – наша потеря и наоборот.
Мы должны отрицать любой сорт, возвращенный в getbestmove Функция по getbestmove функция.
Переместить 3-1 получает 1 класс. getbestmove Функция возвращает класс 1, и мы можем сортировать движение 3 с A -1.
Таким образом, getbestmove Функция продолжает исследовать движения и последующие движения. Этот процесс будет продолжаться до:
- Он находит шаг, оцененный с 1, и в этом случае он немедленно вернет шаг
- Он будет продолжаться, пока каждый возможный ход не имеет оценки. Возможные движения (с классами 0 и -1) хранятся в массиве
- Массив будет тогда: [A] Рандомизированные [B] отсортирован от высокого до низкого [c] Первый элемент будет возвращен
Эти шаги гарантируют, что:
- Будет избегать проигрывателя, если это не единственный вариант
- Компьютерный плеер может сыграть в разных
Конечные заметки:
- Есть сильные законные опасения за Риски Искусственный интеллект (AI) приносит с ним. Давайте использовать AI на благо всех. Лучшим возможным программным обеспечением AI является то, что может помешать нам незвучить AI.
- Я консультировался Assaf Weinberg В процессе написания приложения
См. Мой код на Github.
Оригинал: “https://www.freecodecamp.org/news/building-an-ai-algorithm-for-the-tic-tac-toe-challenge-29d4d5adee07/”