2016-01-03 53 views
0

我练习使游戏战舰。我在这里为玩家制作了游戏网格,并试图为电脑玩家复制网格。然而,当我改变AI的网格时,它会改变玩家的网格。我读到这是因为它们是一起引用的,而不是单个副本。我怎样才能让(不refernce)二维字符串的副本?

static String[] Row1 = new String[] {" ", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"}; 
    static String[] Row2 = new String[] {"A", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-"}; 
    static String[] Row3 = new String[] {"B", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-"}; 
    static String[] Row4 = new String[] {"C", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-"}; 
    static String[] Row5 = new String[] {"D", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-"}; 
    static String[] Row6 = new String[] {"E", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-"}; 
    static String[] Row7 = new String[] {"F", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-"}; 
    static String[] Row8 = new String[] {"G", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-"}; 
    static String[] Row9 = new String[] {"H", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-"}; 
    static String[] Row10 = new String[] {"I", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-"}; 
    static String[] Row11 = new String[] {"J", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-"}; 

    static String[][] playerGrid = {Row1,Row2,Row3,Row4,Row5,Row6,Row7,Row8,Row9,Row10,Row11}; 

    static String[][] aiGrid = playerGrid; 

我读了关于使用clone(),但我不知道代码中的位置。

我也试过

static String[][] aiGrid = new String[][](playerGrid.getText()); 

,但我得到一个错误,说明我是想一个String []存储到一个String [] []

有什么建议?

+2

的可能的复制[复制在Java 2D阵列(http://stackoverflow.com/questions/1686425/copy-a-2d-array-in-java) – resueman

回答

-1

这将做到这一点:

static String[][] aiGrid = playerGrid.clone(); 

在这里,您使用对象的方法克隆来克隆String[][] playerGrid。 这将复制变量playerGridaiGrid

+1

感谢您的信息。我用这个,并编译了代码,但是当我更改aiGrid时,它也改变了playerGrid。 – Bill

+1

这只是一个浅拷贝,并没有复制的各个排的阵列。 –

2

尝试Arrays.copyOf(...)在一个循环内:

https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html

实施例:

String[][] source = {{"a","b","c"},{"d","e","f"},{"g","h","i"}}; 
    String[][] copy = new String[source.length][]; 
    for(int i = 0 ; i < source.length ; i++) { 
     copy[i] = Arrays.copyOf(source[i],source[i].length); 
    } 

clone()克隆包围阵列,而不是内部阵列。例如:

String[][] source = {{"a","b","c"},{"d","e","f"},{"g","h","i"}}; 
    String[][] copy = source.clone(); 
    boolean areTheSame = true; 
    for(int i = 0 ; i < source.length ; i++) { 
     areTheSame = areTheSame && (source[i] == copy[i]); 
    } 
    System.out.println("areTheSame = " + areTheSame); 

输出为areTheSame = true

0

克隆只会复制的第一个维度。

你可以试试这个:

static String[][] playerGrid = {Row1.clone,Row2.clone,Row3.clone,Row4.clone,Row5.clone,Row6.clone,Row7.clone,Row8.clone,Row9.clone,Row10.clone,Row11.clone}; 
0

我会去建立两个数组的方式是,通过使它们都通过一个方法来初始化网格。

public String[][] playerGrid; 
public String[][] aiGrid; 

public static void main(String[] args){ 

    initBoard(playerBoard); 
    initBoard(aiBoard); 

} 

public static void initBoard(String[][] board){ 

    String[] digits=new String[]{"1","2","3","4","5","6","7","8","9","10"}; 
    String[] chars=new String[]{"A","B","C","D","E","F","G","H","I","J"}; 
    board = new String[11][11]; 
    for(int y=0;y<11;y++){ 
     for(int x=0;x<11;x++){ 
      if(x == 0 && y == 0){ 
       board[y][x] = " "; 
      } else if(x == 0){ 
       board[y][x] = chars[y-1]; 
      } else if(y == 0){ 
       board[y][x] = digits[x-1]; 
      } else { 
       board[y][x] = "-"; 
      } 
     } 
    } 
} 

如果您添加重新启动游戏的能力,您也可以稍后使用此方法。只需再次通过网格通过该方法,他们会像新的一样好。