在Python中如何在迷宫中移动老鼠
我对Python真的很陌生,我正在尝试做一个游戏,让迷宫中的老鼠尝试吃豆芽——所以我有两个老鼠——“J”和“p”,还有两个类——老鼠和迷宫。到目前为止,老鼠类的所有功能都在工作——而我被困在迷宫类的最后一个功能上了!这两个类相互交织。我在修正迷宫类的移动方法时遇到了问题-下面是两个类在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 = '.' #
# 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)
d.move(JRat,2,2)
- 正如Joel所指出的,每个类方法的第一个参数应该是self。这是一个Python约定,您不妨像其他人那样学习它。例如,您的移动方法定义如下:
def移动(自身、Rat、hor、ver):
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):