CLI地图中邻近显示元素的代码异常排查求助
问题排查与修复方案
核心问题分析
- 地图未实时更新物品显示状态:仅在初始化阶段设置了物品位置的显示值,玩家移动后没有重新调用
hidden()函数更新该位置的显示,导致即使邻近也不会切换为'i'。 - 碰撞检测未包含物品tile:当前碰撞逻辑只判断了墙壁(
'#'),未将显示为'i'的物品tile纳入不可穿过范围,所以玩家可以直接穿过。 - 坐标校验代码冗余:物品生成的
while循环完全多余,random.randint(1,25)和random.randint(0,24)已经保证坐标在有效范围内,无需二次校验。
具体修复步骤
1. 实时更新物品显示状态
每次绘制地图前,重新计算物品的显示值并更新到地图数组中,确保玩家移动后能实时触发显示逻辑。将fMap[scitemcraft[0]][scitemcraft[1]] = hidden()移到地图打印循环之前:
# 绘制地图前重新更新物品显示状态 fMap[scitemcraft[0]][scitemcraft[1]] = hidden() # 执行地图打印 for y in range(26): for x in range(25): if y == pY and x == pX: print('P', end='') else: print(fMap[y][x], end='') print()
2. 完善碰撞检测逻辑
在玩家移动的判断中,加入对物品tile('i')的检测,阻止玩家穿过显示的物品。以W键移动为例:
if key == 'w': newY = pY - 1 if newY >= 0 and fMap[newY][pX] != '#' and fMap[newY][pX] != 'i': pY = newY
对S/A/D键的移动判断做相同修改,统一加入fMap[newY][newX] != 'i'的条件。
3. 移除冗余代码
删掉不必要的坐标校验循环,物品生成代码简化为:
scitemcraft = [random.randint(1, 25), random.randint(0, 24)]
4. 优化坐标判断可读性
调整hidden()函数的条件顺序,让行/列坐标对应关系更清晰(不影响功能,仅提升可读性):
def hidden(): if abs(pY - scitemcraft[0]) <= 1 and abs(pX - scitemcraft[1]) <= 1: return 'i' else: return '_'
内容的提问来源于stack exchange,提问作者alittles1lly
相关产品推荐
相关产品推荐

