2013-03-22 6 views
-1

현재 minmax 및 Alpha-Beta minmax 알고리즘을 사용하여 tic-tac-toe를 실행하는 AI 상대방을 구현해야하는 클래스의 프로젝트를 진행 중입니다. 움직임을 결정하십시오.가능한 이동 목록 생성 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 번만 움직일 수 있음). a *가있는 각 위치에서 동일한 이동. (따라서 두 번째 이동에 대해 X, O, O, O, O, O, O, O, O 같은 것을 생성합니다)

이것은 처음으로 minmax를 사용해야했던 것이 아니지만 처음에는 파이썬으로해야했습니다.

이 문제를 해결하는 방법에 대한 제안 사항이 도움이 될 것입니다.

감사합니다.

답변

1

이 줄은 문제가 에 의해 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

나는 파이썬이 당신의 보드 사본을 만들지는 않지만 단지 원래 버전을 가리키고 있다고 말한다. 따라서 출력물은

"MovesList :" [0, (X, O, O, O, O, O, O)], [1, (X, O,

및 genBoard, 변수 (X, O, O, O, O, O, O, O, O) 변경됩니다.

은 직접 그 문제가 당신의 보드의 복사본을 생성하는 대신하는 방법을 구글하려고 참이라면 당신의 방법

이 끝나기 전에 인쇄가

을 genBoard

추가 테스트 그것을 참조하십시오. , 당신은 당신이 목록이 있다고 생각하는 것이 선 후

tempBoard = genBoard 

- 원래, 여전히 genBoard에 의해 참조하고, 새가 지금 참조 :

+0

1 : 스택 오버플로에 오신 것을 환영합니다! 당신은 올바른 길을 가고 있습니다,하지만 ... 당신의 대답은 신념이 결여되어 있고 이사회의 사본을 만드는 방법에 대한 구체적인 조언을 제공해야합니다. 그 외에도 글은 가볍게 말을 잘 못 편집하고 있습니다. 그래도 계속 질문에 대답하십시오! –