Rev 393 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
#!/usr/bin/env python
__author__ = "Ira W. Snyder (devel@irasnyder.com)"
__copyright__ = "Copyright (c) 2006 Ira W. Snyder (devel@irasnyder.com)"
__license__ = "GNU GPL v2 (or, at your option, any later version)"
class PuzzlePiece (object):
EMPTY = 'E'
def __init__ (self, state):
self.state = state
def __eq__ (self, rhs):
return self.state == rhs.state
def __repr__(self):
"""Print yourself"""
result = ''
for i in xrange(3):
result += '%s %s %s' % (self.state[3*i], self.state[3*i+1], self.state[3*i+2])
if i<2:
result += '\n'
return result
def get_children (self):
children = []
empty_pos = self.find_empty_pos ()
# Get the correct moves for this position
fn = { 0 : (self.move_down, self.move_right),
1 : (self.move_down, self.move_left, self.move_right),
2 : (self.move_down, self.move_left),
3 : (self.move_down, self.move_right, self.move_up),
4 : (self.move_down, self.move_left, self.move_right, self.move_up),
5 : (self.move_down, self.move_left, self.move_up),
6 : (self.move_right, self.move_up),
7 : (self.move_left, self.move_right, self.move_up),
8 : (self.move_left, self.move_up) }[empty_pos]
# Call each of the proper functions
for f in fn:
children.append (PuzzlePiece (f (empty_pos)))
# Return the created list
return children
def find_empty_pos (self):
for i in xrange (len (self.state)):
if self.state[i] == self.EMPTY:
return i
raise ValueError
def move_up (self, empty_pos):
copy = self.state[:]
copy[empty_pos] = copy[empty_pos - 3]
copy[empty_pos - 3] = self.EMPTY
return copy
def move_left (self, empty_pos):
copy = self.state[:]
copy[empty_pos] = copy[empty_pos - 1]
copy[empty_pos - 1] = self.EMPTY
return copy
def move_right (self, empty_pos):
copy = self.state[:]
copy[empty_pos] = copy[empty_pos + 1]
copy[empty_pos + 1] = self.EMPTY
return copy
def move_down (self, empty_pos):
copy = self.state[:]
copy[empty_pos] = copy[empty_pos + 3]
copy[empty_pos + 3] = self.EMPTY
return copy