Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中如何在迷宫中移动老鼠_Python_List_Move_Messages_Maze - Fatal编程技术网

在Python中如何在迷宫中移动老鼠

在Python中如何在迷宫中移动老鼠,python,list,move,messages,maze,Python,List,Move,Messages,Maze,我对Python真的很陌生,我正在尝试做一个游戏,让迷宫中的老鼠尝试吃豆芽——所以我有两个老鼠——“J”和“p”,还有两个类——老鼠和迷宫。到目前为止,老鼠类的所有功能都在工作——而我被困在迷宫类的最后一个功能上了!这两个类相互交织。我在修正迷宫类的移动方法时遇到了问题-下面是两个类 # The visual representation of a wall. WALL = '#' # The visual representation of a hallway. HALL = '.' #

我对Python真的很陌生,我正在尝试做一个游戏,让迷宫中的老鼠尝试吃豆芽——所以我有两个老鼠——“J”和“p”,还有两个类——老鼠和迷宫。到目前为止,老鼠类的所有功能都在工作——而我被困在迷宫类的最后一个功能上了!这两个类相互交织。我在修正迷宫类的移动方法时遇到了问题-下面是两个类

# 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
班级迷宫: “”“二维迷宫。”“”

因此,当我通过迷宫对象调用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
>>> 
>>d=Maze([['#'、'#'、'#'、'#'、'#'、'#'、'#'、'#'],
['#', '.', '.', '.', '.', '.', '#'], 
['#', '.', '#', '#', '#', '.', '#'], 
['#', '.', '.', '@', '#', '.', '#'], 
['#', '@', '#', '.', '@', '.', '#'], 
['#', '#', '#', '#', '#', '#', '#']], 
老鼠('J',1,1),
老鼠(P',1,4))
>>>d.移动('J',2,2)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
d、 移动('J',2,2)
文件“C:\Users\gijoe\Downloads\a2.py”,第96行,移动中
num_sprouts_left=sum(Maze.content[row][col]中x的x.count('@'))
NameError:未定义全局名称“行”
>>> 

请帮我修复错误信息,并将老鼠移动到迷宫中的任何一点(只要它在走廊里)

执行
Maze.content[row][col]
时,python会查找名为
row
col
的变量,并尝试将它们用作
Maze.content
的索引。由于
(和
)未在
move()
中定义,而且它们也未全局定义,因此python抛出一个
名称错误

不过,还有一个问题。即使在该行之前设置了
row=someNumber
col=someOtherNumber
,您仍然无法得到预期的结果。 调用Maze.content[row][col]将返回长度为1的字符串。(带有值“#”、“@”或“#”)。因此,对该字符串执行x.count(“@”)将返回1或0。由于您对长度为1的字符串进行操作,
num\u sprouts\u left
将只取值1或0

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

num_sprouts_left = sum(row.count('@') for row in Maze.content)
在上述情况下,
在生成器表达式中被赋值。(事实上,它被分配了多个值,每个迭代一个不同的值)

关于使用
Maze
Rat
作为
self
参数的说明: 首先,第一个参数叫什么并不重要。你可以很容易地做到:

def set_location(balloons, row, col):

    balloons.row = row
    balloons.col = col
这是因为python将类实例作为第一个参数传递。您在那里键入的名称只是一个变量名,以便您可以在该特定方法中引用它

然而

按照惯例,该参数称为
self
。你应该称它为self,以保持代码清晰

那么,为什么不像我一直在做的那样,把它叫做
迷宫
老鼠
? 首先,因为它令人困惑。实际上,您并不是在任何方法中引用类
Maze
Rat
,python将这些名称分配给类实例。稍后可能有人(包括您自己)阅读了您的代码,认为您引用的是类而不是实例


其次,因为它覆盖了该方法中的类名。如果您真的想引用该方法中的类,该怎么办?你不能,因为你用你名字不好的参数重写了这个名字。

你的程序有几个问题。我会指出一些主要的问题,让你来解决。在学习Python时,请记住Python.org上的Python文档是您的朋友

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

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

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

然后,要移动“J”老鼠,您可以说,
d.move(JRat,2,2)

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

    def移动(自身、Rat、hor、ver):

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

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

def move(self, rat, hor, ver):
然后在move方法中使用
rat
(小写r)而不是
rat
,来引用rat参数

  • 不要在移动方法中重新指定常量。您已经定义了各种常量,如WALL、HALL、SPROUT、LEFT、RIGHT等。如果您打算将这些常量用作全局常量(我想您是这样做的),您永远不会在赋值语句的左侧使用它们。例如,这个声明

    UP=Rat.set\u位置(行、列+1)

没有达到你的期望

  • 最好为每个函数添加一些注释,以指示它在做什么,以及每个参数在做什么。这将迫使你仔细思考你想要完成什么。因此,在记录move方法时,问问自己“hor”和“ver”参数的用途。它们是否标明了数量 老鼠移动的距离?或者,它们是否指示老鼠将移动到的绝对坐标
我就到此为止,让你再做些调查。我知道这是一种痛苦,但我们经常通过奋斗学习到最好的东西


祝你好运。

你的
Maze
Rat
方法的第一个参数
def move(self, rat, hor, ver):