1
class SlidePuzzle(object):

    def __init__(self, state = None):
        if state == None: state = [[1,2,3],[4,'N',5],[6,7,8]]
        self.puzzle_state = list(state)

    def isValidMove(self, move):
        x,y = self.getBlank()

        if move == 'up':
            return y != 0
        elif move == 'down':
            return y != 2
        elif move == 'left':
            return x != 0
        elif move == 'right':
            return x != 2
        else:
            print "Invalid Move"
            return 0
    def getValidMoves(self):
        validMoves = ['up', 'down', 'left', 'right']

        if not self.isValidMove('down'):
            validMoves.remove('down')
        if not self.isValidMove('up'):
            validMoves.remove('up')
        if not self.isValidMove('right'):
            validMoves.remove('right')
        if not self.isValidMove('left'):
            validMoves.remove('left')

        return validMoves

    def generateChildren(self):
        return [SlidePuzzle(self.puzzle_state).move(m) for m in self.getValidMoves()]

これらのコマンドを実行すると、次のようになります。

- p = SlidePuzzle()
- print p
- p.move('up')
- print p
- print p.generateChildren()
- print p 

これが出力です。すべてのソースを含めたわけではありませんが、ご覧のとおり、移動機能は必要に応じて機能します。私が理解していないのは、generateChildren関数が新しいスライドパズルオブジェクトを作成していないように見えるだけでなく、呼び出し元のオブジェクトのパズルの状態も混乱させている理由です。

- [1, 2, 3]
- [4, 'N', 5]
- [6, 7, 8]

- [1, 'N', 3]
- [4, 2, 5]
- [6, 7, 8]

- [None, None, None]

- [1, 2, 3]
- [4, 'N', 5]
- [6, 7, 8]
4

2 に答える 2

2

generateChildrenSlidePuzzle.move()オブジェクトのリストではなく、からの戻り値のリストを返しSlidePuzzleます。は表示されませんがmove、None が返されると思われます。

于 2012-09-12T15:07:02.733 に答える
-1

リストは「参照」によって渡されるため、最初にリストをコピーする必要があります。そうしないと、新しいパズルが同じリストで動作します。

def generateChildren(self):
    return [SlidePuzzle(self.puzzle_state[:]).move(m) for m in self.getValidMoves()]

[:]リストをコピーすることに注意してください。

さらにを.move返すNoneので、beeing になってしまいますNone

于 2012-09-12T15:02:57.390 に答える