Я пытаюсь создать программу, которая воспроизводит черновики/шашки. На данный момент я пытаюсь сделать эту функцию, что позволяет компьютеру делать и оценивать ходы. Моя идея состоит в том, чтобы компьютер выглядел на всех своих возможных шагах и для каждого из этих ходов, посмотрел на возможные движения противников, а затем на каждый из этих ходов снова взглянул на свои собственные возможные движения.Шаблон алгоритма: как уменьшить вложенные для циклов
С каждым слоем он будет оценивать, является ли движение хорошим или плохим для игрока и назначает очки, в конце он выбирает ходы с наивысшими точками.
До сих пор мне удалось получить версию этой работы, но она включает много вложенных циклов. Код является беспорядочным и не очень читаемым на данный момент, но это простая модель той же концепции. Вместо того, чтобы оценивать и создавать больше списков, он просто умножается на два для нового списка.
counter = 0
for x in list:
counter += 1
list_2 = [x * 2 for x in list]
print 'list_2', list_2, counter
for x in list_2:
counter += 1
list_3 = [x * 2 for x in list_2]
print 'list_3',list_3, counter
for x in list_3:
counter += 1
list_4 = [x * 2 for x in list_3]
print 'list_4', list_4, counter
Если я запускаю этот код, я получаю то, что я хочу, за исключением того, что я не могу легко контролировать глубину поиска без копирования в более для петель. Я думал, что рекурсия может быть способом сделать это, но я не могу понять, как остановить рекурсию после x уровней глубины поиска.
Есть ли лучший способ получить тот же вывод, что и код выше, избавляясь от всех циклов for? Если я смогу заставить это работать, я думаю, что могу сам сделать все остальное.
Возможно, вы можете изучить стек вместо рекурсии, если это будет проще. Кроме того, поиск и понимание дерева игры [Alpha-Beta] (http://gamedev.stackexchange.com/a/30033), вероятно, поможет в создании вашего алгоритма. – Kupiakos
Если вам нужно повторить несколько раз, сделайте это число аргументом для вашей рекурсивной функции. Если это 0, это ваш базовый случай. – JETM
Вы можете сделать это с помощью рекурсии. Взгляните на этот [ответ] (http://stackoverflow.com/a/36645766/4014959), чтобы узнать, как ограничить глубину рекурсии. Но вам также необходимо ограничить ширину рекурсии, или количество плат для оценки скоро станет огромным; это то, где альфа-бета-обрезка полезна. –