def getRandomMove(board, lastMove=None): # start with a full list of all four moves validMoves = [UP, DOWN, LEFT, RIGHT] # remove moves from the list as they are disqualified if lastMove == UP or not isValidMove(board, DOWN): validMoves.remove(DOWN) if lastMove == DOWN or not isValidMove(board, UP): validMoves.remove(UP) if lastMove == LEFT or not isValidMove(board, RIGHT): validMoves.remove(RIGHT) if lastMove == RIGHT or not isValidMove(board, LEFT): validMoves.remove(LEFT) # return a random move from the list of remaining moves return random.choice(validMoves)
At the beginning of the game, we start with the board data structure in the solved, ordered state and create the puzzle by randomly sliding around tiles. To decide which of the four directions we should slide, we’ll call our
getRandomMove() function. Normally we could just use the
random.choice() function and pass it a tuple
(UP, DOWN, LEFT, RIGHT) to have Python simply randomly choose a direction value for us. But the Sliding Puzzle game has a small restriction that prevents us from choosing a purely random number.
If you had a slide puzzle and slid a tile to left, and then slid a tile to the right, you would end up with the exact same board you had at the start. It’s pointless to make a slide followed by the opposite slide. Also, if the blank space is in the lower right corner than it is impossible to slide a tile up or to the left.
The code in
getRandomMove() will take these factors into account. To prevent the function from selecting the last move that was made, the caller of the function can pass a directional value for the
lastMove parameter. Line 181 starts with a list of all four directional values stored in the
validMoves variable. The
lastMove value (if not set to
None) is removed from
validMoves. Depending on if the blank space is at the edge of the board, lines 6  to 13  will remove other directional values from the
Of the values that are left in
lastMove, one of them is randomly selected with a call to
random.choice() and returned.