控制台怪物游戏开发:如何编写检测对象坐标重复的函数?
游戏坐标重复校验函数修复方案
现有代码的核心问题
- 使用
==比较int数组:Java中数组属于引用类型,==比较的是数组对象的内存地址,而非内部存储的(x,y)数值。即使两个数组的坐标完全相同,只要是不同的实例,判断结果也为false,无法识别重复坐标。 - 仅对比相邻元素:现有逻辑只校验了下标i和i+1的对象,非相邻的重复坐标(如下标0和下标2的对象重合)无法被检测到,校验逻辑不完整。
修复后实现(基础版)
函数返回值说明:返回true代表存在重复坐标,返回false代表所有坐标无冲突。
private static boolean checkObjects(int[][] allObjects){ int objectCount = allObjects.length; // 双层遍历比对所有对象组合,避免遗漏非相邻重复 for(int i = 0; i < objectCount - 1; i++){ for(int j = i + 1; j < objectCount; j++){ // 分别比对x、y坐标数值是否完全一致 if(allObjects[i][0] == allObjects[j][0] && allObjects[i][1] == allObjects[j][1]){ return true; } } } return false; }
高性能优化版(适合对象数量较多的场景)
如果游戏对象数量超过100个,可以用哈希集合将校验时间复杂度从O(n²)降至O(n),需要先在代码顶部导入java.util.HashSet和java.util.Set:
private static boolean checkObjects(int[][] allObjects){ Set<String> coordinateSet = new HashSet<>(); for(int[] coord : allObjects){ String coordKey = coord[0] + "," + coord[1]; // 坐标已存在说明重复 if(coordinateSet.contains(coordKey)){ return true; } coordinateSet.add(coordKey); } return false; }
内容的提问来源于stack exchange,提问作者EpicAshman
相关产品推荐
相关产品推荐

