Blame | 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 = statedef __eq__ (self, rhs):return self.state == rhs.statedef __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 resultdef get_children (self):children = []empty_pos = self.find_empty_pos ()# Get the correct moves for this positionfn = { 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 functionsfor f in fn:children.append (PuzzlePiece (f (empty_pos)))# Return the created listreturn childrendef find_empty_pos (self):for i in xrange (len (self.state)):if self.state[i] == self.EMPTY:return iraise ValueErrordef move_up (self, empty_pos):copy = self.state[:]copy[empty_pos] = copy[empty_pos - 3]copy[empty_pos - 3] = self.EMPTYreturn copydef move_left (self, empty_pos):copy = self.state[:]copy[empty_pos] = copy[empty_pos - 1]copy[empty_pos - 1] = self.EMPTYreturn copydef move_right (self, empty_pos):copy = self.state[:]copy[empty_pos] = copy[empty_pos + 1]copy[empty_pos + 1] = self.EMPTYreturn copydef move_down (self, empty_pos):copy = self.state[:]copy[empty_pos] = copy[empty_pos + 3]copy[empty_pos + 3] = self.EMPTYreturn copy