Subversion Repositories programming

Rev

Rev 393 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 393 Rev 395
Line 2... Line 2...
2
 
2
 
3
__author__    = "Ira W. Snyder (devel@irasnyder.com)"
3
__author__    = "Ira W. Snyder (devel@irasnyder.com)"
4
__copyright__ = "Copyright (c) 2006 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)"
5
__license__   = "GNU GPL v2 (or, at your option, any later version)"
6
 
6
 
-
 
7
# Fix for the lame version of python on the school's computers (v2.1)
-
 
8
try:
-
 
9
	(True, False)
-
 
10
except NameError:
-
 
11
	(True, False) = (1, 0)
-
 
12
 
7
class PuzzlePiece (object):
13
class PuzzlePiece:
8
 
14
 
9
	EMPTY = 'E'
15
	EMPTY = 'E'
10
 
16
 
-
 
17
	(UP, DOWN, LEFT, RIGHT) = ('up', 'down', 'left', 'right')
-
 
18
 
11
	def __init__ (self, state, depth=0, goal=None):
19
	def __init__ (self, state, depth=0, goal=None, generated_by='root'):
12
		if len(state) != 9:
20
		if len(state) != 9:
13
			raise ValueError
21
			raise ValueError
14
 
22
 
15
		self.state = state
23
		self.state = state
16
		self.depth = depth
24
		self.depth = depth
17
		self.goal = goal
25
		self.goal = goal
-
 
26
		self.generated_by = generated_by
18
 
27
 
19
	def __eq__ (self, rhs):
28
	def __eq__ (self, rhs):
20
		return self.state == rhs.state
29
		return self.state == rhs.state
21
 
30
 
22
	def __repr__(self):
31
	def __repr__(self):
Line 32... Line 41...
32
	def get_children (self):
41
	def get_children (self):
33
		children = []
42
		children = []
34
		empty_pos = self.find_position (self.EMPTY)
43
		empty_pos = self.find_position (self.EMPTY)
35
 
44
 
36
		# Get the correct moves for this position
45
		# Get the correct moves for this position
37
		fn = {	0 : (self.move_down,  self.move_right),
46
		mov = {	0 : (self.DOWN,  self.RIGHT),
38
			1 : (self.move_down,  self.move_left,  self.move_right),
47
			1 : (self.DOWN,  self.LEFT,  self.RIGHT),
39
			2 : (self.move_down,  self.move_left),
48
			2 : (self.DOWN,  self.LEFT),
40
			3 : (self.move_down,  self.move_right, self.move_up),
49
			3 : (self.DOWN,  self.RIGHT, self.UP),
41
			4 : (self.move_down,  self.move_left,  self.move_right, self.move_up),
50
			4 : (self.DOWN,  self.LEFT,  self.RIGHT, self.UP),
42
			5 : (self.move_down,  self.move_left,  self.move_up),
51
			5 : (self.DOWN,  self.LEFT,  self.UP),
43
			6 : (self.move_right, self.move_up),
52
			6 : (self.RIGHT, self.UP),
44
			7 : (self.move_left,  self.move_right, self.move_up),
53
			7 : (self.LEFT,  self.RIGHT, self.UP),
45
			8 : (self.move_left,  self.move_up) }[empty_pos]
54
			8 : (self.LEFT,  self.UP) }[empty_pos]
46
 
55
 
47
		# Call each of the proper functions
56
		# Call each of the proper functions
48
		for f in fn:
57
		for m in mov:
-
 
58
			config = self.move (empty_pos, m)
49
			children.append (PuzzlePiece (f (empty_pos), self.depth+1, self.goal))
59
			children.append (PuzzlePiece (config, self.depth+1, self.goal, m))
50
 
60
 
51
		# Return the created list
61
		# Return the created list
52
		return children
62
		return children
53
 
63
 
54
	def find_position (self, value):
64
	def find_position (self, value):
Line 56... Line 66...
56
			if self.state[i] == value:
66
			if self.state[i] == value:
57
				return i
67
				return i
58
 
68
 
59
		raise ValueError
69
		raise ValueError
60
 
70
 
61
	def move_up (self, empty_pos):
71
	def move (self, empty_pos, direction):
62
		copy = self.state[:]
-
 
63
		copy[empty_pos] = copy[empty_pos - 3]
-
 
64
		copy[empty_pos - 3] = self.EMPTY
-
 
65
		return copy
-
 
66
 
-
 
67
	def move_left (self, empty_pos):
-
 
68
		copy = self.state[:]
-
 
69
		copy[empty_pos] = copy[empty_pos - 1]
-
 
70
		copy[empty_pos - 1] = self.EMPTY
-
 
71
		return copy
72
		val = 0
72
 
73
 
73
	def move_right (self, empty_pos):
74
		if direction == self.UP:
-
 
75
			val = -3
74
		copy = self.state[:]
76
		elif direction == self.LEFT:
-
 
77
			val = -1
75
		copy[empty_pos] = copy[empty_pos + 1]
78
		elif direction == self.RIGHT:
-
 
79
			val = 1
76
		copy[empty_pos + 1] = self.EMPTY
80
		elif direction == self.DOWN:
77
		return copy
81
			val = 3
-
 
82
		else:
-
 
83
			raise ValueError
78
 
84
 
79
	def move_down (self, empty_pos):
-
 
80
		copy = self.state[:]
85
		copy = self.state[:]
81
		copy[empty_pos] = copy[empty_pos + 3]
86
		copy[empty_pos] = copy[empty_pos + val]
82
		copy[empty_pos + 3] = self.EMPTY
87
		copy[empty_pos + val] = self.EMPTY
83
		return copy
88
		return copy
84
 
89
 
85
	def num_out_of_place (self):
90
	def num_out_of_place (self):
86
		"""Find the number of tiles that are out of place"""
91
		"""Find the number of tiles that are out of place"""
87
		count = 0
92
		count = 0