-1

私は現在、私のクラスの 1 つのプロジェクトに取り組んでおり、動きを決定するために minmax および Alpha-Beta minmax アルゴリズムを使用して三目並べをプレイする AI 対戦相手を実装する必要があります。

しかし、私が抱えている問題は、ボードの可能な動きのリストを生成しようとすることです。

私の問題コードは次のとおりです

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 が挿入された場所) であり、2 番目の要素が結果のボードであるタプルのリストをムーブ リストに返させることです。

私が抱えている問題は、可能な移動の正しい数のリストを受け取ることです(例:両側で最初の4つの移動を手動でプレイすると、5つの可能な移動しか得られません)が、それぞれに同じ移動が配置されます* を含む場所。(したがって、可能な2番目の動きのためにX、O、O、O、O、O、O、O、Oのようなものを生成することになります)

minmax を使用しなければならなかったのはこれが初めてではありませんが、python で使用しなければならなかったのはこれが初めてです。

この問題を回避する方法についての提案は役に立ちます!

ありがとう!

4

2 に答える 2

1

この行は問題です:

tempBoard = genBoard

この行の後に、 2 つのリストがあると考えているようです。元のリストはまだ によって参照されgenBoardており、新しいリストは によって参照されていtempBoardます。これはそうではありません。

この行は、リストのコピーを作成しません。代わりに、バインド先の同じオブジェクトtempBoard参照するように名前をバインドします。genBoard

したがって、以降の への参照tempBoard[i]も に影響しgenBoard[i]ます。

代わりに次のいずれかを試してください。

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

これらの各行は新しいリストを作成します。その初期内容は と同じgenBoardです。tempboardこの新しいリストにgenboardバインドされていますが、古いリストにバインドされたままです。

問題のオブジェクトが文字列のリストよりも複雑な場合は、次のようにする必要があります。

tempBoard = copy.deepcopy(genBoard)
于 2013-03-22T18:11:55.240 に答える
0

Python はボードのコピーを作成せず、元のバージョンを指しているだけだと思います。したがって、印刷物は次のとおりです。

"MovesList: " [[0,(X,O,O,O,O,O,O,O,O)],[1,(X,O,O,O,O,O,O,O,O) )]、[2、(X、O、O、O、O、O、O、O、O)]など

そしてあなたのgenBoard、変数が変更されます。

追加することをテストする

genBoardを印刷する

メソッドの終了直前

それが本当に問題だった場合は、ボードを参照する代わりに、ボードのコピーを作成する方法をグーグルで検索してみてください。

于 2013-03-22T17:55:39.830 に答える