2016-10-13 43 views
-1

我試圖將數組normMap中的值更改爲另一個值,但這樣做也會更改數組fireMap中的值。在一個列表中更改值將其更改爲單獨的一個

public int boardX = Board.boardX; 
public int boardY = Board.boardY; 
public int tileSizeX = Board.tileSizeX; 
public int tileSizeY = Board.tileSizeY; 
public int curr_dimension = Board.current_dimension; 

public BufferedImage[] grassImage = {Board.norm.grassImage, Board.fire.grassImage}; 
public BufferedImage[] waterImage = {Board.norm.waterImage, Board.fire.waterImage}; 
public BufferedImage[] pathVImage = {Board.norm.pathVImage, Board.fire.pathVImage}; 
public BufferedImage[] pathHImage = {Board.norm.pathHImage, Board.fire.pathHImage}; 
public BufferedImage[] treeImage = {Board.norm.treeImage, Board.fire.treeImage}; 

// y/x/tile type 
public List<List<Integer>> normMap = new ArrayList<List<Integer>>(); 
public List<List<Integer>> fireMap = new ArrayList<List<Integer>>(); 

@Override 
public void mouseClicked(MouseEvent arg0) 
{ 
    int y = (int) Math.ceil((arg0.getY() + boardY * tileSizeY)/32); 
    int x = (int) Math.ceil((arg0.getX() + boardX * tileSizeX)/32); 
    switch(curr_dimension) 
    { 
    case(0): normMap.get(y).set(x, 0); break; 
    case(1): fireMap.get(y).set(x, 0); break; 
    } 
} 

@Override 
public void keyPressed(KeyEvent arg0) 
{ 
    switch(arg0.getKeyCode()) 
    { 
    case(KeyEvent.VK_ENTER): writeFile(); break; 
    case(KeyEvent.VK_ESCAPE): GameStateManager.setState(GameStateManager.MENU_STATE); break; 
    case(KeyEvent.VK_UP): boardY--; break; 
    case(KeyEvent.VK_DOWN): boardY++; break; 
    case(KeyEvent.VK_LEFT): boardX--; break; 
    case(KeyEvent.VK_RIGHT): boardX++; break; 
    case(KeyEvent.VK_1): curr_dimension = 0; break; 
    case(KeyEvent.VK_2): curr_dimension = 1; break; 
    } 

} 

public String getPrefix(int dimension) 
{ 
    switch(dimension) 
    { 
    case(0): return "norm"; 
    case(1): return "fire"; 
    default: 
     System.out.println("Incorrect dimension, " 
    + dimension + ". Find the map in maps/custom/unidentified."); 
     return "unidentified"; 
    } 
} 

public void writeFile() 
{ 
    List<List<Integer>> map; 

    switch(curr_dimension) 
    { 
    case(0): map = normMap; break; 
    case(1): map = fireMap; break; 
    default: map = normMap; break; 
    } 
    PrintWriter writer; 
    try 
    { 
     for(int i = 0; i < 2; i++) 
     { 
      writer = new PrintWriter("/maps/custom/" + getPrefix(i) + "map1.txt", "UTF-8"); 
      for(List<Integer> list : map) 
      { 
       for(int integer : list) 
       { 
        writer.print(integer + " "); 
       } 
       writer.println(""); 
      } 
      writer.close(); 
     } 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

@Override 
public void init() 
{ 
    Main.panel.addKeyListener(this); 
    Main.panel.addMouseListener(this); 

    for(int i = 0; i < 50; i++) 
    { 
     List<Integer> map1 = new ArrayList<Integer>(); 
     for(int j = 0; j < 50; j++) 
     { 
      map1.add(9); 
     } 
     normMap.add(map1); 
     fireMap.add(map1); 
    } 
} 

public void draw(Graphics g) 
{ 
    switch(curr_dimension) 
    { 
    case(0): drawTiles(g, normMap); break; 
    case(1): drawTiles(g, fireMap); break; 
    } 

} 

public void drawTiles(Graphics g, List<List<Integer>> map) 
{ 
    for(int y = 0; y < map.size(); y++) 
    { 
     List<Integer> mapY = map.get(y); 
     for(int x = 0; x < mapY.size(); x++) 
     { 
      if(mapY.get(x) == 0) g.drawImage(grassImage[curr_dimension], (x - boardX) * tileSizeX, (y - boardY) * tileSizeY, null); 
      else if(mapY.get(x) == 1) g.drawImage(waterImage[curr_dimension], (x - boardX) * tileSizeX, (y - boardY) * tileSizeY, null); 
      else if(mapY.get(x) == 2) g.drawImage(pathVImage[curr_dimension], (x - boardX) * tileSizeX, (y - boardY) * tileSizeY, null); 
      else if(mapY.get(x) == 4) g.drawImage(pathHImage[curr_dimension], (x - boardX) * tileSizeX, (y - boardY) * tileSizeY, null); 
      else if(mapY.get(x) == 3) g.drawImage(treeImage[curr_dimension], (x - boardX) * tileSizeX, (y - boardY) * tileSizeY - tileSizeY, null); 
      else if(mapY.get(x) == 9) g.drawRect((x - boardX) * tileSizeX, (y - boardY) * tileSizeY, tileSizeX, tileSizeY); 
      else if(mapY.get(x) == Board.PLAYER) GameState.player.draw(g, x, y, boardX, boardY, tileSizeX, tileSizeY); 

     } 
    } 
}} 

預期輸出是兩個不同的列表。但是,打印出fireMap和normMap顯示了相同的結果。

刪除了不重要的代碼段。請告訴我是否需要澄清任何事情。

+2

請添加代碼剪斷要在其中面向錯誤ö問題。不要馬上粘貼整個代碼。 – FallAndLearn

+0

你在哪裏打印列表值? –

+0

@FallAndLearn我已經刪除了所有與該問題無關的代碼,我是否應該進一步減少它? – that2guy

回答

1

你相同的對象添加到NormMap和FireMap就在這裏:

normMap.add(map1); 
    fireMap.add(map1); 

即使這兩張圖是不同的地圖內的對象是一樣的。因爲你在同一個對象都映射normMap.get(y)和fireMap.get(y)是一樣好,如果你做

normMap.get(y).set(x, 0); 

更改fireMap對象也是如此。所以你的問題是,你有兩個不同的地圖,但地圖內的所有對象都是一樣的。

在我看來,解決你的問題將是兩個不同的對象添加到您的地圖最簡單的方法:

for(int i = 0; i < 50; i++) 
{ 
    List<Integer> map1 = new ArrayList<Integer>(); 
    List<Integer> map2 = new ArrayList<Integer>(); 
    for(int j = 0; j < 50; j++) 
    { 
     map1.add(9); 
     map2.add(9); 
    } 
    normMap.add(map1); 
    fireMap.add(map2); 
} 

編輯:如果您的列表有合適的尺寸(50×50),你永遠不會改變大小,我建議您使用的二維陣列代替

int fireMap[][] = new int[50][50]; 

(也:在遊戲瓦片地圖通常是2-d陣列)

+0

我會試試這個,謝謝。 – that2guy

相關問題