我对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
>>>
请帮我修正错误信息,把老鼠移到迷宫里的任何地方(只要它在走廊里)!在
当您执行}的变量,并尝试将它们用作
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的值。在我假设您希望遍历整个迷宫来计算芽苗菜的数量。你可以这样做:
在上面的例子中,
row
在生成器表达式中被分配了一个值。(事实上,它被分配了多个值,每次迭代都有不同的值)关于使用
Maze
或Rat
作为self
参数的注意事项:首先,你称第一个参数是什么并不重要。你可以很容易地做到:
^{pr2}$这是因为python将类实例作为第一个参数传递。你输入的名字只是一个变量名,这样你就可以在特定的方法中引用它。在
但是
该参数按惯例称为
self
。您应该将其称为self
,这样可以使代码保持清晰。在为什么不叫它},就像我一直在做的那样?
首先,因为它令人困惑。实际上,您并不是在引用任何方法中的类},python将这些名称分配给类实例。有人(包括您自己)可能会在以后读到您的代码,并认为您引用的是类而不是实例。在
Maze
或者{Maze
或{第二,因为它覆盖了该方法中的类名。如果你真的想引用这个方法中的类呢?你不能,因为你用你不好命名的参数重写了这个名字。在
你的程序有几个问题。我会指出一些主要的,让你来研究。在学习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中是合法的,但这是一种有点高级的技术,我猜这不是您想要的。因此,移动方法最好定义为:
然后在move方法中使用
rat
(小写r)来引用rat参数,而不是使用Rat
。在不要在move方法中重新分配常量。这些常量,如果你想在左边的墙上,我想你永远不会用这些常量。所以,举例来说
UP = Rat.set_location(row,col+1)
没有做你期望的事。在
我就到此为止,让你再做些调查。我知道这是一种痛苦,但我们经常通过奋斗学习到最好的东西。在
祝你好运。在
相关问题 更多 >
编程相关推荐