Subversion Repositories programming

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
385 ira 1
#!/usr/bin/env python
2
 
3
__author__    = "Ira W. Snyder (devel@irasnyder.com)"
4
__copyright__ = "Copyright (c) 2006 Ira W. Snyder (devel@irasnyder.com)"
5
__license__   = "GNU GPL v2 (or, at your option, any later version)"
6
 
7
class PuzzlePiece (object):
8
 
9
	EMPTY = 'E'
10
 
11
	def __init__ (self, state):
12
		self.state = state
13
 
14
	def __eq__ (self, rhs):
15
		return self.state == rhs.state
16
 
17
	def __repr__(self):
18
		"""Print yourself"""
19
		result = ''
20
		for i in xrange(3):
21
			result += '%s %s %s' % (self.state[3*i], self.state[3*i+1], self.state[3*i+2])
22
			if i<2:
23
				result += '\n'
24
 
25
		return result
26
 
27
	def get_children (self):
28
		children = []
29
		empty_pos = self.find_empty_pos ()
30
 
31
		# Get the correct moves for this position
32
		fn = {	0 : (self.move_down,  self.move_right),
33
			1 : (self.move_down,  self.move_left,  self.move_right),
34
			2 : (self.move_down,  self.move_left),
35
			3 : (self.move_down,  self.move_right, self.move_up),
36
			4 : (self.move_down,  self.move_left,  self.move_right, self.move_up),
37
			5 : (self.move_down,  self.move_left,  self.move_up),
38
			6 : (self.move_right, self.move_up),
39
			7 : (self.move_left,  self.move_right, self.move_up),
40
			8 : (self.move_left,  self.move_up) }[empty_pos]
41
 
42
		# Call each of the proper functions
43
		for f in fn:
44
			children.append (PuzzlePiece (f (empty_pos)))
45
 
46
		# Return the created list
47
		return children
48
 
49
	def find_empty_pos (self):
50
		for i in xrange (len (self.state)):
51
			if self.state[i] == self.EMPTY:
52
				return i
53
 
54
		raise ValueError
55
 
56
	def move_up (self, empty_pos):
57
		copy = self.state[:]
58
		copy[empty_pos] = copy[empty_pos - 3]
59
		copy[empty_pos - 3] = self.EMPTY
60
		return copy
61
 
62
	def move_left (self, empty_pos):
63
		copy = self.state[:]
64
		copy[empty_pos] = copy[empty_pos - 1]
65
		copy[empty_pos - 1] = self.EMPTY
66
		return copy
67
 
68
	def move_right (self, empty_pos):
69
		copy = self.state[:]
70
		copy[empty_pos] = copy[empty_pos + 1]
71
		copy[empty_pos + 1] = self.EMPTY
72
		return copy
73
 
74
	def move_down (self, empty_pos):
75
		copy = self.state[:]
76
		copy[empty_pos] = copy[empty_pos + 3]
77
		copy[empty_pos + 3] = self.EMPTY
78
		return copy
79
 
80
 
81
 
82