That's what I'd do. Remember that you don't have to actually interpret which way a piece should move, because any piece that you select would only ever move to the blank area. So if you select a piece, check for a neighboring blank space and move there.
Also, to ensure that the puzzle is reasonably solvable, just do a load of random moves, after setting the tiles to the solved locations. If find that it's easier to always stick to the game rules... like a card game I'd shuffle the deck by swapping cards randomly, a rubiks cube I'd do random rotations from a solved cube - this way you always know it's possible to solve the puzzle.
To control the movement of tiles/sprites, I'd store the grid X Y values related to the sprites - so when moving a sprite, you'd set the grid position, and have the sprite move there, like a loop that shows the sprite moving when it isn't at the correct location.