首页 > 解决方案 > 对于一个简单的迷宫游戏,我怎样才能让我的代码更短?

问题描述

再会。我是编码初学者,基本上我用python做了一个简单的迷宫游戏。它是 3x3,所以我制作了 9 个字典变量,详细说明了每个图块(北、南、东、西)的可能移动。我的代码由嵌套的 if-elif 和一个主 while 循环组成。

if level == 1: #level of difficulty.
    i = 0
    maplist1 = {'directions1':'south'}
    maplist2 = {'directions1':'south','directions2':'east'}
    maplist3 = {'directions1':'west'}
    maplist4 = {'directions1':'north','directions2':'east','directions3':'south'}
....
....
    current_position = 1 #local variable within the first if statement

这是一段将被重复的代码块,几乎没有变化(字面意思是重复)。

    while i == 0: #to continuously loop the program
        if current_position == 1:
            directions = maplist1['directions1']
            direction = input(f"What direction do you want to go: {directions} ").title() #choose the possible directions to go to.
            if direction == "S" or direction == "South":
                current_position = 4
                print(f"You are in cell {current_position}.")
            else:
                print("Cannot go in that direction.")
        if current_position == 2:
            directions = maplist2['directions1']
            directions2 = maplist2['directions2']
            direction = input(f"What direction do you want to go: {directions} {directions2} ").title()
            if direction == "S" or direction == "South":
                current_position = 5
                print(f"You are in cell {current_position}.")
            elif direction == "E" or direction == "East":
                current_position = 3
                print(f"You are in cell {current_position}.")
            else:
                print("Cannot go in that direction.")
        if current_position == 3:
            directions = maplist3['directions1']
            direction = input(f"What direction do you want to go: {directions} ").title()
            if direction == "W" or direction == "West":
                current_position = 2
                print(f"You are in cell {current_position}.")
            else:
                print("Cannot go in that direction.")
        if current_position == 4:
            directions = maplist4['directions1']
            directions2 = maplist4['directions2']
            directions3 = maplist4['directions3']
            direction = input(f"What direction do you want to go: {directions} {directions2} {directions3} ").title()
            if direction == "N" or direction == "North":
                current_position = 1
                print(f"You are in cell {current_position}.")
            elif direction == "S" or direction == "South":
                current_position = 7
                print(f"You are in cell {current_position}.")
            elif direction == "E" or direction == "East":
                current_position = 5
                print(f"You are in cell {current_position}.")
            else:
                print("Cannot go in that direction.")
.......
......
.......
        if current_position == 9:
            print("Congratulations, you finished the game.")
            i += 1 #to stop the loop

我的问题是如何使它更简单,更紧凑?

这个游戏有 3 个级别,基本上是 3x3、4x4 和 5x5。这就是我询问有关如何缩短/压缩代码的任何想法的原因。

我不需要你给我你的代码,但是一些指导会很好地指导我如何继续,因为我现在感觉很迷茫。

标签: pythonpython-3.x

解决方案


尝试创建一个迷宫数据结构。一个典型的想法是创建一个二维单元阵列,每个单元都有一个北/西/南/东墙。

让我们创建一个类,只是为了更好地理解。我希望您忽略除can_move()方法之外的所有内容。

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

让我们制作一些细胞,看看它们长什么样:

>>> Cell('NWSE')
 ___ 
|   |
|___|

>>> Cell('NWS')
 ___ 
|    
|___ 

现在,迷宫是由 2D 单元格列表组成的。这是一个小迷宫:

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')]
])

看起来像这样:

>>> maze
 ___  ___  ___
| x ||        |
|   ||        |

|   ||   ||   |
|   ||   ||   |

|        ||   |
|___  ___||___|

可是等等!我们还没有定义什么Maze是。再一次,忽略所有与绘图相关的东西并专注于move_direction().

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

要使用它,只需创建一个简单的小循环:

while True:
    print(maze)
    direction = input('What direction? ')
    maze.move_direction(direction)

并观看魔术发生!

你可以在这里试试。


推荐阅读