Java中originalmap与playermap同步更新问题求助
问题分析与解决:修改playermap导致originalmap同步变化
问题根源
你在createmap方法中犯了Java引用类型的常见错误:
this.originalmap.add(mapLine); this.playermap.add(mapLine);
mapLine是ArrayList<Character>类型的引用对象,当你把它同时添加到两个二维列表中时,originalmap和playermap存储的是同一个列表对象的内存引用,而非两个独立的副本。因此当你在spawnPlayer中通过playermap.get(spawny).set(spawnx,'P')修改元素时,本质是修改了内存中唯一的那个列表对象,originalmap里的对应列表自然会同步变化。
解决方案
为playermap创建独立的列表副本,避免共享引用。修改createmap中的添加逻辑,为playermap传入mapLine的复制版本:
while (textfile.hasNextLine()) { String line = textfile.nextLine(); List<Character> mapLine = new ArrayList<Character>(); for (int i = 0; i<line.length();i++) { mapLine.add(line.charAt(i)); } this.originalmap.add(mapLine); // 创建mapLine的副本,确保两个地图的列表相互独立 this.playermap.add(new ArrayList<>(mapLine)); }
new ArrayList<>(mapLine)会生成一个新的ArrayList并复制原mapLine的所有元素,这样originalmap和playermap就各自持有独立的列表对象,修改其中一个不会影响另一个。
额外bug提示
你的spawnPlayer方法中条件判断存在逻辑错误:
if (spawnchar!= '#'||spawnchar != 'G'||spawnchar != 'B')
使用||(逻辑或)会导致这个条件永远为true——一个字符不可能同时等于#、G、B,无论取到什么字符,总有一个不等的条件成立,这会导致玩家可能被生成在障碍物或特殊地形上。应改为&&(逻辑与):
if (spawnchar != '#' && spawnchar != 'G' && spawnchar != 'B')
内容的提问来源于stack exchange,提问作者Rhian Kansara
相关产品推荐
相关产品推荐

