如何在Python迷宫中移动

2024-09-27 19:18:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python很陌生,我正在尝试做一个游戏,在迷宫里的老鼠尝试吃豆芽甘蓝-所以我有两个老鼠-'J'和'p'和两个类-老鼠和迷宫。到目前为止,老鼠类的所有功能都在工作,而我在迷宫类的最后一个函数上卡住了!这两个类是交织在一起的。我在修复Maze类的move方法时遇到了问题-下面是两个类。在

# The visual representation of a wall.
WALL = '#'

# The visual representation of a hallway.
HALL = '.'

# The visual representation of a brussels sprout.
SPROUT = '@'

# Constants for the directions. Use these to make Rats move.

# The left direction.
LEFT = -1

# The right direction.
RIGHT = 1

# No change in direction.
NO_CHANGE = 0

# The up direction.
UP = -1

# The down direction.
DOWN = 1

# The letters for rat_1 and rat_2 in the maze.
RAT_1_CHAR = 'J'
RAT_2_CHAR = 'P'
num_sprouts_eaten = 0



class Rat:
    """ A rat caught in a maze. """

    # Write your Rat methods here.
    def __init__(Rat, symbol, row, col):
        Rat.symbol = symbol
        Rat.row = row
        Rat.col = col

        num_sprouts_eaten = 0

    def set_location(Rat, row, col):

        Rat.row = row
        Rat.col = col

    def eat_sprout(Rat):
        num_sprouts_eaten += 1        

    def __str__(Rat):
        """ (Contact) -> str

        Return a string representation of this contact.
        """
        result = ''

        result = result + '{0} '.format(Rat.symbol) + 'at '

        result = result + '('+ '{0}'.format(Rat.row) + ', '
        result = result + '{0}'.format(Rat.col) + ') ate '
        result = result + str(num_sprouts_eaten) + ' sprouts.'
        return result

类迷宫: “二维迷宫。”在

^{pr2}$

所以当我通过一个Maze对象调用move方法时,我得到一个错误消息!在

>>> d = Maze([['#', '#', '#', '#', '#', '#', '#'], 
      ['#', '.', '.', '.', '.', '.', '#'], 
      ['#', '.', '#', '#', '#', '.', '#'], 
      ['#', '.', '.', '@', '#', '.', '#'], 
      ['#', '@', '#', '.', '@', '.', '#'], 
      ['#', '#', '#', '#', '#', '#', '#']], 
      Rat('J', 1, 1),
      Rat('P', 1, 4))
>>> d.move('J',2,2)

Traceback (most recent call last):
  File "<pyshell#167>", line 1, in <module>
    d.move('J',2,2)
  File "C:\Users\gijoe\Downloads\a2.py", line 96, in move
    num_sprouts_left = sum(x.count('@') for x in Maze.content[row][col])
NameError: global name 'row' is not defined
>>> 

请帮我修正错误信息,把老鼠移到迷宫里的任何地方(只要它在走廊里)!在


Tags: oftheinmovecolresultnumrow
2条回答

当您执行Maze.content[row][col]时,python会查找名为row和{}的变量,并尝试将它们用作Maze.content的索引。由于row(和col)没有在move()中定义,而且它们也不是全局定义的,python抛出一个NameError。在

不过,还有一个问题。即使如果在该行之前设置了row = someNumber和{},仍然无法得到预期的结果。 调用Maze.content[row][col]将返回长度为1的字符串。(值为“#”、“@”或“uU”)。因此,对该字符串执行x.count(“@”)将返回1或0。而且由于操作的是长度为1的字符串,num_sprouts_left将只接受1或0的值。在

我假设您希望遍历整个迷宫来计算芽苗菜的数量。你可以这样做:

num_sprouts_left = sum(row.count('@') for row in Maze.content)

在上面的例子中,row在生成器表达式中被分配了一个值。(事实上,它被分配了多个值,每次迭代都有不同的值)

关于使用MazeRat作为self参数的注意事项:

首先,你称第一个参数是什么并不重要。你可以很容易地做到:

^{pr2}$

这是因为python将类实例作为第一个参数传递。你输入的名字只是一个变量名,这样你就可以在特定的方法中引用它。在

但是

该参数按惯例称为self。您应该将其称为self,这样可以使代码保持清晰。在

为什么不叫它Maze或者{},就像我一直在做的那样? 首先,因为它令人困惑。实际上,您并不是在引用任何方法中的Maze或{},python将这些名称分配给类实例。有人(包括您自己)可能会在以后读到您的代码,并认为您引用的是类而不是实例。在

第二,因为它覆盖了该方法中的类名。如果你真的想引用这个方法中的类呢?你不能,因为你用你不好命名的参数重写了这个名字。在

你的程序有几个问题。我会指出一些主要的,让你来研究。在学习Python时,请记住python.org网站是你的朋友。在

  • 你需要为每只老鼠声明Rat对象。您可以按如下方式执行此操作:

    JRat = Rat('J', 1, 1)

    PRat = Rat('P', 1, 4)

然后,要移动“J”鼠,你会说,d.Move(JRat, 2, 2)

  • 正如Joel所指出的,每个类方法的第一个参数应该是self。这是一个Python约定,您也可以像其他人那样学习它。例如,移动方法的定义如下:

    def move(self, Rat, hor, ver):

然后,在move方法中,要引用一个类变量,比如content,可以使用self.content。在

也不应将类名用作函数的参数。虽然这在Python中是合法的,但这是一种有点高级的技术,我猜这不是您想要的。因此,移动方法最好定义为:

def move(self, rat, hor, ver):

然后在move方法中使用rat(小写r)来引用rat参数,而不是使用Rat。在

  • 不要在move方法中重新分配常量。这些常量,如果你想在左边的墙上,我想你永远不会用这些常量。所以,举例来说

    UP = Rat.set_location(row,col+1)

没有做你期望的事。在

  • 最好为每个函数添加一些注释,以指示它在做什么,以及每个参数的作用。这将迫使你思考你想要完成什么。因此,在记录move方法时,问问自己“hor”和“ver”参数的用途。它们是否表明 老鼠移动的距离?或者,它们是否表示老鼠将移动到的绝对坐标?在

我就到此为止,让你再做些调查。我知道这是一种痛苦,但我们经常通过奋斗学习到最好的东西。在

祝你好运。在

相关问题 更多 >

    热门问题