2013-03-22 5 views
-1

В настоящее время я работаю над проектом для одного из моих классов, где мне нужно реализовать противника AI для воспроизведения tic-tac-toe с использованием minmax и альфа-бета-алгоритмов minmax для определить ходы.Создайте список возможных ходов Python Tic-Tac-Toe

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

Мой код Проблема заключается в следующем

def genMoves(genBoard, turnNumber): 
    moveList = [] 

    print "inMovesList" 
    #Figure out if X or O go now 

    if turnNumber % 2 == 0: 
     moveChar = "O" 
    else: 
     moveChar = "X" 

    i = 0; 

    while i < 9: 
     tempBoard = genBoard 
     if tempBoard[i] == "*": 
      #set tempBoard[i] to X or O 
      tempBoard[i] = moveChar 
      #append move, new board 
      moveList.append((i, tempBoard)) 

     i+=1 

    print "MovesList: " 
    print moveList 
    return moveList 

Моя доска представлена ​​в виде списка из 9 строк инициализируется ["*", "*", "*", "*", "*", "*", "*", "*", "*"].

Моя цель состоит в том, чтобы иметь список перемещения, возвращающий список кортежей с первым элементом кортежа i (где вставлен X или O), а второй элемент является результирующей таблицей.

Проблема заключается в том, что я получу список с правильным количеством возможных ходов (например: если я вручную сыграю первые 4 хода для обеих сторон, это даст мне только 5 возможных ходов), однако он поместит то же движение в каждом месте, которое содержит *. (Таким образом, он заканчивает создание чего-то вроде X, O, O, O, O, O, O, O, O для возможных вторых ходов)

Это не первый раз, когда мне приходилось использовать minmax, но это первый раз мне приходилось делать это на питоне.

Любые предложения о том, как обойти эту проблему, были бы полезны!

Спасибо!

ответ

1

Эта линия является проблемой:

tempBoard = genBoard 

После этой линии, вы, кажется, думаете, что у вас есть два списки - оригинальный, по-прежнему ссылается на genBoard, и новый, теперь ссылки по tempBoard. Это не тот случай.

Эта строка не создайте копию списка. Вместо этого он связывает имя tempBoard со ссылкой на тот же объект, с которым связан genBoard.

Следовательно, последующие ссылки на tempBoard[i] также влияют на genBoard[i].

Попробуйте один из них вместо:

tempBoard = list(genBoard) 
tempBoard = genBoard[:] 
tempBoard = copy.copy(genBoard) 

Каждая из этих линий создает новый список, начальное содержимое которого является таким же, как genBoard. tempboard привязан к этому новому списку, а genboard остается связанным со старым списком.

Если рассматриваемый объект был более сложным, чем список строк, что вам может понадобиться, чтобы сделать это:

tempBoard = copy.deepcopy(genBoard) 
+0

Спасибо за быстрый ответ! Я знал, что это будет что-то глупое ... – OmegaTwig

+0

См. Также: http://docs.python.org/2/tutorial/classes.html#a-word-about-names-and-objects –

0

Я верю, что Python не создает копию вашего совета, а просто указывает на оригинальную версию. Поэтому Отпечаток:

"MovesList:" [[0, (Х, О, О, О, О, О, О, О, О)], [1, (Х, О, О, O, O, O, O, O, O)], [2, (X, O, O, O, O, O, O, O, O)], и т. Д.

и ваш genBoard, переменная изменяется.

, чтобы проверить, что добавить

печати genBoard

непосредственно до конца вашего метода

, если это было действительно проблемой пытаются Google, как создать копию совета вместо ссылаясь на него.

+0

+1: Добро пожаловать в Stack Overflow! Вы на правильном пути, но ... в вашем ответе не хватает убеждений, и вы должны дать конкретный совет о том, как создать копию доски. Кроме того, ваш пост плохо сформулирован и плохо отредактирован. Пожалуйста, продолжайте отвечать на вопросы! –