Java中的作用域和数组如何工作?

时间:2018-04-03 22:59:43

标签: java arrays declaration scopes

我通常使用C ++编程,并开始为SPOJ编写一些更简单的程序来练习Java编程。

我正在制作Hangman游戏,我在其中初始化数组以可视化当前游戏状态。开始时,您可以键入要播放的次数。每次失败或胜利后,游戏状态需要回到默认状态。所以我尝试初始化我称为initializedLevel的二维数组。稍后,在循环中,我创建新的二维数组并将其值设置为初始化一个。我对其他值做同样的事情,在每场比赛后重置它们。当我失败或获胜时,游戏的状态并没有改变,但生活,猜测和言语都有。我改变了范围,并在循环中初始化了第一个数组并且它有效但我真的很想理解为什么它最初没有工作,最好的方法是什么。

在:

IO.inspect/2

后:

Scanner reader=new Scanner(System.in);
        int n=reader.nextInt();
        char initializedLevel [][]={
            {'+','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','+'},
            {'|',' ',' ',' ',' ','_','_','_','_','_','_','_','_','_','_','_','_',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ',' ','|','/',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ',' ','|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ',' ','|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ',' ','|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ',' ','|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ',' ','|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ',' ','|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ',' ','|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ',' ','|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ',' ','|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ','_','|','_',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'+','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','+'},
            };
        for(int i=0;i<n;i++)
        {
            char level[][]=initializedLevel;
            String word=reader.next();
            int maxAnswers=reader.nextInt();
            int answers=0;
            String encrypted=getEncryptedWord(word);
            String guesses="-";
            int lives=7;
            System.out.println("Welcome to the Hangman Game!");
            drawGameState(level,encrypted,lives,guesses);
            while(lives>0 && answers<maxAnswers)
...

有些函数将二维数组作为参数,但它们使用了level,而不是initializedLevel。

1 个答案:

答案 0 :(得分:4)

这不是范围问题。第一种方法的问题是你将引用复制到同一个数组,而第二种方法是每次实际创建一个新数组。

另一种方法是在循环外初始化数组并创建数组的深层副本。例如:

char[][] level = Arrays.stream(initializedLevel)
        .map(char[]::clone)
        .toArray(char[][]::new);

或者如果您愿意,可以使用简单的循环:

char[][] level = new char[initializedLevel.length][];
for (int j = 0; j < level.length; j++) {
    level[j] = initializedLevel[j].clone();
}