<p>尝试创建一个迷宫式的数据结构。一个典型的想法是创建一个二维单元阵列,每个单元都有一个北/西/南/东墙。你知道吗</p>
<p>让我们创建一个类,只是为了更好地理解。我希望你<strong>忽略除<code>can_move()</code>方法之外的所有内容。你知道吗</p>
<pre><code>class Cell:
def __init__(self, walls):
self.walls = walls
def __str__(self):
"""Allows us to call print() on a Cell!"""
return '\n'.join(self.draw())
def _draw_wall(self, wall, s):
return s if wall in self.walls else ' ' * len(s)
def draw(self, inner=' '):
"""Draw top, mid, and bottom parts of the cell."""
n = self._draw_wall('N', '___')
w = self._draw_wall('W', '|')
e = self._draw_wall('E', '|')
s = self._draw_wall('S', '___')
top = ' ' + n + ' '
mid = w + inner + e
bot = w + s + e
return top, mid, bot
def can_move(self, direction):
return direction not in self.walls
</code></pre>
<p>让我们做一些细胞,看看它们是什么样子:</p>
<pre><code>>>> Cell('NWSE')
___
| |
|___|
>>> Cell('NWS')
___
|
|___
</code></pre>
<p>现在,一个迷宫是由一个二维的细胞列表组成的。这里有一个小迷宫:</p>
<pre><code>maze = Maze(width=3, height=3, rows=[
[Cell('NWE'), Cell('NW'), Cell('NE')],
[Cell('WE'), Cell('WE'), Cell('WE')],
[Cell('WS'), Cell('SE'), Cell('WSE')]
])
</code></pre>
<p>看起来是这样的:</p>
<pre><code>>>> maze
___ ___ ___
| x || |
| || |
| || || |
| || || |
| || |
|___ ___||___|
</code></pre>
<p>但是等等!我们还没有定义什么是<code>Maze</code>。再一次,<strong>忽略所有与绘图相关的内容,将注意力集中在<code>move_direction()</code></strong>。你知道吗</p>
<pre><code>class Maze:
def __init__(self, width, height, rows):
self.width = width
self.height = height
self.rows = rows
self.position = (0, 0)
def __str__(self):
return '\n'.join(self.draw_row(i) for i, _ in enumerate(self.rows))
def _inner(self, i, j):
return ' x ' if (i, j) == self.position else ' '
def draw_row(self, i):
triples = [
cell.draw(self._inner(i, j)) for j, cell in enumerate(self.rows[i])
]
return '\n'.join([
''.join(t for t, _, _ in triples),
''.join(m for _, m, _ in triples),
''.join(b for _, _, b in triples)])
def cell_at_position(self, i, j):
return self.rows[i][j]
def move_direction(self, direction):
curr_cell = self.cell_at_position(*self.position)
if not curr_cell.can_move(direction):
print("Can't go in that direction!")
return
deltas = {'N': (-1, 0), 'W': (0, -1), 'S': (1, 0), 'E': (0, 1)}
y, x = self.position
dy, dx = deltas[direction]
self.position = y + dy, x + dx
</code></pre>
<p>要使用它,只需创建一个简单的小循环:</p>
<pre><code>while True:
print(maze)
direction = input('What direction? ')
maze.move_direction(direction)
</code></pre>
<p>看着奇迹发生!你知道吗</p>
<p>你可以试试<a href="https://repl.it/@SicariusNoctis/SO-Maze" rel="nofollow noreferrer">here</a>。你知道吗</p>