OpenCog Framework  Branch: master, revision 6f0b7fc776b08468cf1b74aa9db028f387b4f0c0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
sokoban.py
Go to the documentation of this file.
1 """
2 Created on 5 Jun, 2012
3 
4 @author: keyvan
5 
6 Usage Instructions
7 
8 The following methods can be used for generating Sokoban atoms from a file/url:
9 - add_socoban_level_to_atomspace_from_file
10 - add_socoban_level_to_atomspace_from_url
11 
12 Use levels from http://www.sourcecode.se/sokoban/levels.php
13 
14 """
15 __author__ = 'keyvan-m-sadeghi'
16 
17 from xml.dom.minidom import parseString
18 from opencog.atomspace import AtomSpace, TruthValue, Atom
19 from opencog.atomspace import types
20 
21 def add_socoban_level_to_atomspace_from_file(atomspace, file_path, level_index):
22  _add_globals_to_atomspace(atomspace)
23  levels = generate_levels_from_file(file_path)
24  levels[level_index].append_to_atomspace(atomspace)
25 
26 def add_socoban_level_to_atomspace_from_url(atomspace, url, level_index):
27  """
28  Url should point to 'http://www.sourcecode.se/sokoban/' database
29  e.g. 'httpd://www.sourcecode.se/sokoban/dnldlevel.php?LevelFile=100Boxes.slc'
30  """
31  _add_globals_to_atomspace(atomspace)
32  levels = generate_levels_from_url(url)
33  levels[level_index].append_to_atomspace(atomspace)
34 
36  global TRUTH_VALUE, TIME, BLOCK, MOVABLE_BLOCK, MOVABLE_OBJECT, SOKOBAN_GOAL
37  TRUTH_VALUE = TruthValue(1,1)
38  TIME = atomspace.add_node(types.TimeNode, '0')
39  BLOCK = atomspace.add_node(types.ConceptNode, 'block')
40  MOVABLE_BLOCK = atomspace.add_node(types.ConceptNode, 'MovableBlock')
41  MOVABLE_OBJECT = atomspace.add_node(types.ConceptNode, 'MovableObject')
42  SOKOBAN_GOAL = atomspace.add_node(types.ConceptNode, 'SokobanGoal')
43  atomspace.add_link(types.InheritanceLink, [MOVABLE_BLOCK, MOVABLE_OBJECT], TRUTH_VALUE)
44 
45 def generate_levels_from_file(xml_file_path):
46  return _generate_levels(open(xml_file_path,'r'))
47 
49  import urllib2
50  return _generate_levels(urllib2.urlopen(url))
51 
52 def _generate_levels(open_xml_stream):
53  data = open_xml_stream.read()
54  open_xml_stream.close()
55  levelTags = parseString(data).getElementsByTagName('Level')
56  levels = []
57  for levelTag in levelTags:
58  levels.append(Level(levelTag))
59 
60  return levels
61 
62 class Block:
63 
64  def __init__(self, x = 0, y = 0, charachter = ' '):
65  self.x, self.y = x, y
66  self.character = charachter
67 
68  def append_to_atomspace(self, atomspace):
69  self.atomspace = atomspace
70  for method in self._method_by_charachter[self.character]:
71  node = method(self) # This can only be done in python!
72  if node is not None:
73  self._give_position_to_node(node)
74 
76  return self.atomspace.add_node(types.PetNode, 'OAC_MrSokobanRobot')
77 
79  box = self.atomspace.add_node(types.ObjectNode, 'id_movable_block' +
80  str(self.x) + '_' + str(self.y) + '_99')
81  self.atomspace.add_link(types.InheritanceLink, [box, MOVABLE_BLOCK], TRUTH_VALUE)
82  return box
83 
85  wall = self.atomspace.add_node(types.ObjectNode, 'id_CHUNK_0_0_0_BLOCK' +
86  str(self.x) + '_' + str(self.y) + '_99')
87  self.atomspace.add_link(types.InheritanceLink, [wall, BLOCK], TRUTH_VALUE)
88  return wall
89 
91  goal = self.atomspace.add_node(types.ObjectNode, 'id_SokobanGoal_' +
92  str(self.x) + '_' + str(self.y) + '_99')
93 
94  self.atomspace.add_link(types.InheritanceLink, [goal, SOKOBAN_GOAL], TRUTH_VALUE)
95  return goal
96 
97  def _do_nothing(self):
98  return None
99 
100  _method_by_charachter = {'@':(_add_to_atomspace_as_player,),
101  '+':(_add_to_atomspace_as_player, _add_to_atomspace_as_goal),
102  '$':(_add_to_atomspace_as_box,),
103  '*':(_add_to_atomspace_as_box, _add_to_atomspace_as_goal),
104  '#':(_add_to_atomspace_as_wall,),
105  '.':(_add_to_atomspace_as_goal,),
106  ' ':(_do_nothing,)
107  }
108 
109  def _give_position_to_node(self, node):
110  atomspace, truth_value, time = self.atomspace, TRUTH_VALUE, TIME
111 
112  x = atomspace.add_node(types.NumberNode, str(self.x + 1.5))
113  y = atomspace.add_node(types.NumberNode, str(self.y + 1.5))
114  z = atomspace.add_node(types.NumberNode, '99.5')
115 
116  list = atomspace.add_link(types.ListLink, [node, x, y, z])
117  predicate = atomspace.add_node(types.PredicateNode, "AGISIM_position")
118 
119  evaluation = atomspace.add_link(types.EvaluationLink, [predicate, list])
120  at_time = atomspace.add_link(types.AtTimeLink, [time, evaluation], truth_value)
121  atomspace.add_link(types.LatestLink, [at_time])
122 
123 
124  def __repr__(self):
125  return "'" + self.character + "' at" + ' X=' + str(self.x) + ' Y=' + str(self.y)
126 
127 
128 class Level:
129  '''
130  classdocs
131  '''
132  def __init__(self, xml_tag): # xml_tag specs at:
133  # http://epydoc.sourceforge.net/stdlib/xml.dom.minidom.Element-class.html
134  '''
135  Constructor
136  '''
137  self.Height = int(xml_tag.getAttribute('Height'))
138  self.Width = int(xml_tag.getAttribute('Width'))
139  self.Rows = []
140  xmlRows = xml_tag.getElementsByTagName('L')
141 
142  for i, xmlRow in enumerate(xmlRows):
143  blockRow = []
144  rowString = str(xmlRow.toxml().\
145  replace('<L>','').replace('</L>',''))
146 
147  for j in range(self.Width):
148  if j == len(rowString):
149  rowString += ' '
150  character = rowString[j]
151  if character == '@' or character == '+':
152  self.PlayerCoordinates = (i, j)
153  block = Block(i, j, character)
154  blockRow.append(block)
155 
156  self.Rows.append(blockRow)
157 
158  def append_to_atomspace(self, atomspace):
159  for block in self:
160  block.append_to_atomspace(atomspace)
161 
162  def __iter__(self):
163  for row in self.Rows:
164  for block in row:
165  yield block
166 
167  def __getitem__(self, index):
168  return self.Rows[index]
169 
170 if __name__ == '__main__':
171  atomspace = AtomSpace()
173  'http://www.sourcecode.se/sokoban/dnldlevel.php?LevelFile=100Boxes.slc', 0)
174  atomspace.print_list()
def __init__
Definition: sokoban.py:64
def __repr__
Definition: sokoban.py:124
def __getitem__
Definition: sokoban.py:167
def _add_globals_to_atomspace
Definition: sokoban.py:35
def _give_position_to_node
Definition: sokoban.py:109
def _add_to_atomspace_as_wall
Definition: sokoban.py:84
def _do_nothing
Definition: sokoban.py:97
def generate_levels_from_file
Definition: sokoban.py:45
def generate_levels_from_url
Definition: sokoban.py:48
def __iter__
Definition: sokoban.py:162
def add_socoban_level_to_atomspace_from_file
Definition: sokoban.py:21
def _generate_levels
Definition: sokoban.py:52
def _add_to_atomspace_as_box
Definition: sokoban.py:78
def _add_to_atomspace_as_goal
Definition: sokoban.py:90
def _add_to_atomspace_as_player
Definition: sokoban.py:75
def append_to_atomspace
Definition: sokoban.py:158
dictionary _method_by_charachter
Definition: sokoban.py:100
def add_socoban_level_to_atomspace_from_url
Definition: sokoban.py:26
def __init__
Definition: sokoban.py:132
def append_to_atomspace
Definition: sokoban.py:68