Java中的作用域和数组是如何工作的? 我通常是用C++编程,只是开始编写一些简单的程序,用以在java中编程。p>

Java中的作用域和数组是如何工作的? 我通常是用C++编程,只是开始编写一些简单的程序,用以在java中编程。p>,java,arrays,declaration,scopes,Java,Arrays,Declaration,Scopes,我正在制作一个刽子手游戏,在这里我初始化数组来可视化当前的游戏状态。在开始时,您可以键入要玩多少次。在每次失败或胜利后,游戏状态需要回到默认状态。所以我尝试初始化二维数组,我称之为initializedLevel。稍后,在循环中,我创建了一个新的二维数组,并将其值设置为initialized one。我会在每场比赛后对其他值进行同样的重置。当我输赢的时候,比赛的状态并没有改变,但生活、猜测和言语却改变了。我改变了作用域并初始化了循环中的第一个数组,它工作了,但我真的很想了解为什么它一开始不工作,

我正在制作一个刽子手游戏,在这里我初始化数组来可视化当前的游戏状态。在开始时,您可以键入要玩多少次。在每次失败或胜利后,游戏状态需要回到默认状态。所以我尝试初始化二维数组,我称之为initializedLevel。稍后,在循环中,我创建了一个新的二维数组,并将其值设置为initialized one。我会在每场比赛后对其他值进行同样的重置。当我输赢的时候,比赛的状态并没有改变,但生活、猜测和言语却改变了。我改变了作用域并初始化了循环中的第一个数组,它工作了,但我真的很想了解为什么它一开始不工作,以及最好的方法是什么

之前:

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)
...
之后:

Scanner reader=new Scanner(System.in);
        int n=reader.nextInt();
        for(int i=0;i<n;i++)
        {
            char initializedLevel [][]={
            {'+','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','+'},
            {'|',' ',' ',' ',' ','_','_','_','_','_','_','_','_','_','_','_','_',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ',' ','|','/',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ',' ','|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ',' ','|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ',' ','|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ',' ','|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ',' ','|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ',' ','|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ',' ','|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ',' ','|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ',' ','|',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'|',' ',' ',' ','_','|','_',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','|'},
            {'+','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','+'},
            };
            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

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

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

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();
}

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

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

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();
}

此字符级别[][]=initializedLevel;这不是副本。您正在分配一个引用。我如何制作数组的简单副本?就是这样一种方法。您需要一个循环来创建一个char[][]的副本;这不是副本。您正在分配一个引用。我如何制作数组的简单副本?就是这样一种方法。您需要一个循环来创建char[]]的副本。