如何访问字典中对象的属性?Python 2D数组+字典实现移动系统报错排查
问题分析与解决办法
先给你把问题拆成几个关键的新手易犯小错误,改完就能正常运行了:
1. 世界字典(world)指向了空房间!
你创建Room对象时,是存在rooms[5][5]和rooms[5][6]这两个位置的,但后续给world字典赋值时,却错误指向了数组里的空位置:
world["room1"] = rooms[3][3] world["room2"] = rooms[3][4]
rooms是11×11的空数组,除了你手动赋值的[5][5]和[5][6],其他位置全是None(空值)。所以world["room1"]其实是空的,访问world["room1"].coords自然会报错"NoneType没有coords属性"。
修正方法:让world指向你真正创建的Room对象:
world["room1"] = rooms[5][5] world["room2"] = rooms[5][6]
2. Player初始化时传错了room参数!
你的Player类里,self.room应该是一个Room对象(因为Move方法要访问self.room.exits),但你创建player时,传的是world["room1"].coords——这是个坐标元组(5,5),根本不是Room对象!之前的"str object has no attribute 'coords'"也是类似问题,比如你之前传了房间名字字符串,同样不具备Room对象的属性。
修正方法:创建player时,把previousRoom和room参数改成传Room对象本身,而非坐标:
player = Player(10, 10, 5, 5, "Jedidiah", [], [], True, world["room1"], world["room1"])
同时可以优化Player类的初始化逻辑,直接从Room对象里获取坐标,不用单独传:
class Player(): def __init__(self, health, maxHealth, baseDmg, dmg, name, weapons, items, isAlive, previousRoom, room): # 其他属性保持不变 self.previousRoom = previousRoom # 现在存储的是Room对象 self.room = room # 现在存储的是Room对象 self.coords = room.coords # 直接从房间对象中获取坐标
额外的小细节修正
你创建room2时,coords写错成了(5,5),和room1重复了,不符合2D数组的布局逻辑,改成:
rooms[5][6] = Room( "room2", "", {"W": "room1"}, False, None, False, None, False, None, True, (5, 6) )
测试修正后的代码
改完后可以加一句测试代码验证移动功能:
player.Move("E") # 会输出"Moving to room2",说明逻辑正常
内容的提问来源于stack exchange,提问作者Jedidiah Blitz
相关产品推荐
相关产品推荐

