You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 09:01:15