Subversion Repositories programming

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
383 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
from Generator import Generator
8
 
9
 
10
class PuzzleGenerator (Generator):
11
 
12
	EMPTY = 'E'
13
 
14
	def get_children (self):
15
		children = []
16
		empty_pos = self.find_empty_pos ()
17
 
18
		# Get the correct moves for this position
19
		fn = {	0 : (self.move_down,  self.move_right),
20
			1 : (self.move_down,  self.move_left,  self.move_right),
21
			2 : (self.move_down,  self.move_left),
22
			3 : (self.move_down,  self.move_right, self.move_up),
23
			4 : (self.move_down,  self.move_left,  self.move_right, self.move_up),
24
			5 : (self.move_down,  self.move_left,  self.move_up),
25
			6 : (self.move_right, self.move_up),
26
			7 : (self.move_left,  self.move_right, self.move_up),
27
			8 : (self.move_left,  self.move_up) }[empty_pos]
28
 
29
		# Call each of the proper functions
30
		for f in fn:
31
			children.append (f (empty_pos))
32
 
33
		# Return the created list
34
		return children
35
 
36
	def find_empty_pos (self):
37
		for i in xrange (len (self.value)):
38
			if self.value[i] == self.EMPTY:
39
				return i
40
 
41
		raise ValueError
42
 
43
	def move_up (self, empty_pos):
44
		copy = self.value[:]
45
		copy[empty_pos] = copy[empty_pos - 3]
46
		copy[empty_pos - 3] = self.EMPTY
47
		return copy
48
 
49
	def move_left (self, empty_pos):
50
		copy = self.value[:]
51
		copy[empty_pos] = copy[empty_pos - 1]
52
		copy[empty_pos - 1] = self.EMPTY
53
		return copy
54
 
55
	def move_right (self, empty_pos):
56
		copy = self.value[:]
57
		copy[empty_pos] = copy[empty_pos + 1]
58
		copy[empty_pos + 1] = self.EMPTY
59
		return copy
60
 
61
	def move_down (self, empty_pos):
62
		copy = self.value[:]
63
		copy[empty_pos] = copy[empty_pos + 3]
64
		copy[empty_pos + 3] = self.EMPTY
65
		return copy
66
 
67
 
68
 
69
def printpuz (state):
70
	for i in xrange(3):
71
		for j in xrange(3):
72
			print '%s ' % (str(state[(3*i)+j]), ) ,
73
 
74
		print
75
 
76
def main ():
77
 
78
	#initial = [1, 2, 3, 4, PuzzleGenerator.EMPTY, 5, 6, 7, 8]
79
	initial = [PuzzleGenerator.EMPTY, 2, 3, 4, 1, 5, 6, 7, 8]
80
 
81
	print 'Initial State:'
82
	printpuz (initial)
83
	print
84
 
85
	print 'Children:'
86
	p = PuzzleGenerator(initial)
87
	for c in p.get_children ():
88
		printpuz (c)
89
		print
90
 
91
if __name__ == '__main__':
92
	main ()
93