Альтернатива if (), else if () в c ++ (это ИИ?) - PullRequest
9 голосов
/ 23 апреля 2011

Во-первых, я нуб. Я также уборщик, который никогда не делал ни копейки. Это просто то, что я люблю делать. Это для удовольствия :) При этом я написал эту консольную игру в крестики-нолики, в которой достаточно ai, чтобы не проиграть в каждой игре. (Я предполагаю, что ai это то, что он должен называться.) У него есть что-то вроде 70 if / else, если операторы для компьютеров поворачиваются. Я использовал 3 массива типа int так:

int L[2], M[2], R[2];

0 = пусто; 1 = Х; 2 = O;
Тогда доска «выглядит» как
L [0] | М [0] | R [0]
L [1] | М [1] | R [1]
L [2] | М [2] | R [2]

Таким образом, я в основном выписал каждый возможный сценарий, который мог бы придумать что-то вроде:

if(M[0]==1 & M[1]==1 & M[2]==0){M[2] = 2;}//here the computer prevents a win 
else if(L[0] ==2&M[1]==2&R[2]==0){R[2]=2;}//here the computer wins
//and so on....68 more times!

Я предполагаю, что мой (ые) вопрос (ы):
Есть ли лучший способ?
Есть ли способ достичь того же результата с меньшим количеством строк кода?
Считается ли это искусственным интеллектом? ?

Ответы [ 5 ]

5 голосов
/ 23 апреля 2011

Стандартный алгоритм для этого называется Минимакс .Он в основном строит дерево, где началом игры является корень, а потом дети представляют каждое возможное движение, которое Х может сделать в первый ход, а потом дети каждого из этих узлов - все ходы, которые О может сделать в ответ,и т. д. После того, как все дерево заполнено (что возможно для Крестики-нолики, но для игр, подобных шахматным компьютерам, по-прежнему не хватает памяти), вы возвращаетесь обратно, предполагая, что оба игрока достаточно умны, чтобы сделатьлучший ход, и получите оптимальный ход.Вот другое объяснение минимакса, специально использующего крестики-нолики в качестве примера.

2 голосов
/ 23 апреля 2011

На странице Википедии в Tic-Tac-Toe есть очень хороший набросок алгоритма для победы (или связывания) в каждой игре: http://en.wikipedia.org/wiki/Tic-tac-toe - это то, что я использовал для создания игры в крестики-нолики несколько лет назад.

После того, как вы поймете алгоритм, один из самых умных способов реализовать компьютерный плеер Tic-Tac-Toe - это магический квадрат. Метод обсуждается здесь . Что касается размера, я видел, что это реализовано примерно в 50 строках кода, я выложу код, если найду его:)

Это технически не искусственный интеллект, поскольку ИИ обычно относится к искусственным нейронам, слоям нейронов, градиентному спуску, машинам опорных векторов, решению сложных полиномов и тому подобному. Решение Tic-Tac-Toe

1 голос
/ 23 апреля 2011

Да, есть лучшие способы.

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

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

Также обратите внимание, что с объявлением int L[2] в массиве L есть только две записи,а именно L[0] и L[1].Ссылки на L[2], M[2] и т. Д. Являются ошибками, которые должны были быть обнаружены компилятором.Подумайте о повышении уровня предупреждения.Как это сделать, зависит от компилятора.Для gcc это -Wall.

Это считается формой искусственного интеллекта.Серия if утверждений - это накопленные знания: как распознать ситуацию и как лучше всего на нее реагировать.

0 голосов
/ 23 апреля 2011

Когда вам нужно кодировать систему, основанную на правилах (например, создаваемый вами ИИ), вы можете использовать механизм правил, например, CLIPS (инструмент, разработанный в НАСА для создания экспертных систем, написанных на C).

http://en.wikipedia.org/wiki/CLIPS

Возможно, это излишнее умение играть в Tic Tac Toe, но если у вас настроение изучать классные предметы ИИ, Expert Systems - очень интересная область, но отличающаяся (и, возможно, менее хитрая), чем Neural Networks.

Веселись!

0 голосов
/ 23 апреля 2011

Самым близким к настоящему ИИ для решения такой игры было бы создание искусственной сети и обучение ее всем комбинациям игры tictactoe.

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

Но кодирование нейронной сети - не тривиальная вещь:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...