Godot开发A*算法游戏时出现数组索引无效错误求助
问题解决:Godot A*寻路中"invalid get index '0' on base array"错误
错误原因
报错行costo_minimo = lista_costos[zero]触发索引越界,本质是**lista_costos数组为空**,此时访问任何索引都会触发错误。
导致数组为空的常见场景:
- 首次调用
evaluacion函数时,hijo_arriba/hijo_izquierda/hijo_abajo/hijo_derecha还未向lista_costos添加任何元素 - 当前节点的所有方向子节点都不满足
comprobar_hijos in celdas的条件,没有生成任何代价数据
修复方案
1. 给evaluacion函数添加空数组判断
在访问数组索引前先做检查,避免越界:
func evaluacion(): # 空数组直接返回,避免索引错误 if lista_costos.empty(): print("警告:无可用代价数据") indice_costo_minimo = -1 # 标记无效索引 return costo_minimo = lista_costos[0] for i in range(1, len(lista_costos)): if lista_costos[i] < costo_minimo: costo_minimo = lista_costos[i] indice_costo_minimo = lista_costos.find(costo_minimo, 0)
2. 确保celdas数组正确初始化
检查celdas是否已填充可通行单元格坐标,否则comprobar_hijos in celdas会一直返回false,导致lista_costos始终为空。
3. 优化最小值查找逻辑(可选)
用Godot内置min函数简化代码,同时保留空数组判断:
func evaluacion(): if lista_costos.empty(): print("警告:无可用代价数据") indice_costo_minimo = -1 return costo_minimo = min(lista_costos) indice_costo_minimo = lista_costos.find(costo_minimo, 0)
4. 调用evaluacion前做前置检查
在astar函数末尾,确认有代价数据再执行评估:
func astar(): # 原有代码... hijo_arriba() hijo_izquierda() hijo_abajo() hijo_derecha() # 仅当存在代价数据时执行评估 if not lista_costos.empty(): evaluacion()
额外建议
- 在
hijo_abajo等函数中添加日志,输出是否成功添加代价数据,方便定位问题 - 检查
celda_actual数组初始化情况,避免astar中访问celda_actual[0]触发同类错误
内容的提问来源于stack exchange,提问作者Marco Mulgado
相关产品推荐
相关产品推荐

