You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何访问字典中对象的属性?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 23:57:29