GDScript伪随机数生成二维数组时每行重复问题求助
问题原因
在GDScript中,数组属于引用类型。你定义的subMap是全局变量,每次执行geographyMap.append(subMap)时,并没有将subMap的内容复制到二维数组中,而是把subMap这个数组对象的引用存了进去。后续循环里的subMap.clear()只是清空了当前数组的元素,但所有已经添加到geographyMap里的引用,指向的还是同一个数组对象。最终所有行都会显示最后一次循环填充的内容,导致所有子数组完全重复。
解决方案
直接在外层循环内部创建新的子数组,避免复用全局的subMap变量:
var geographyMap: Array[Array[int]] func generate_map(): print("Generate map function called") var mapHeight: int = 10 var mapWidth: int = 10 geographyMap.clear() for yy in mapHeight: # 每次循环生成新的子数组,不再复用全局变量 var subMap: Array[int] = [] for xx in mapWidth: var chance: int = randi_range(0, 1000) subMap.append(1 if chance > 500 else 0) geographyMap.append(subMap) for i in geographyMap: print(i)
补充优化
- 用三元表达式简化0/1的判断逻辑,让代码更简洁。
- 不需要额外调用
randomize(),Godot项目启动时默认已完成随机种子初始化,除非你需要固定种子生成可复现的结果。 - 如果一定要复用全局数组,也可以在添加时复制数组内容:
geographyMap.append(subMap.duplicate()),但这种方式不如直接创建新数组高效清晰。
内容的提问来源于stack exchange,提问作者Faye Rauscher
相关产品推荐
相关产品推荐

