Subversion Repositories programming

Rev

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