java全局变量如何工作?

时间:2016-10-23 22:13:05

标签: java global-variables

我在java中制作Othello游戏,并且在按下enter时切换其他玩家有问题。我声明了全局变量public static int counter;,它会在按下时递增。

Scanner s = new Scanner(System.in);
move = s.nextLine();
// enter to forfeit
if(move.equals("")){
    if(counter%2 == 0){
        whiteEnterForfeit = turn(board, "White", "W", "B");
        printBoard(board);
        counter++;
        }
    if(counter%2 == 1) {
        blackEnterForfeit = turn(board, "Black", "B", "W");
        printBoard(board);
        counter++;
        }
 }

/* If coordinate is typed like 2,4 I will be recorded at right spot on the board.

else if(!move.equals("")){
    StringTokenizer st = new StringTokenizer(move, ",");
    rowMove = Integer.parseInt(st.nextToken());
    colMove = Integer.parseInt(st.nextToken());
*/

因此,一旦我按行输入两次,就应该打印出Black-White-Black。但是,我打印出Black-White-White.....。我对static全局变量的看法是任何类或方法都可以访问和修改它的值。

当每个玩家成功玩游戏时,我也会增加counter。 由于其代码超过300行,您可以在github(https://github.com/misonam03/TIL/blob/master/Java/Othello.java)上找到它。 提前谢谢!

3 个答案:

答案 0 :(得分:2)

你在这里有一个递归,然后你的计数器永远不会增加:

if(counter%2 == 0){
    whiteEnterForfeit = turn(board, "White", "W", "B");
    printBoard(board);
    counter++;
}

如果在调用之前移动计数器++,则会获得正确的打印,但最终会因为实现递归的方式而得到StackOverflowError。

我认为这个视频系列可以为您提供很多帮助。这是一个C#GO游戏,但它与你正在做的非常相似:Roy Osherove - Building a Go Game Engine With TDD and Pair Programming - Part 1

答案 1 :(得分:0)

您需要使用else关键字而不是if。这将解决它,因为当前,计数器在偶数时会递增,这会使它变为奇数(因此第二个if语句会运行)。

if(counter%2 == 0){
    whiteEnterForfeit = turn(board, "White", "W", "B");
    printBoard(board);
    counter++;
} else {
    blackEnterForfeit = turn(board, "Black", "B", "W");
    printBoard(board);
    counter++;
}

将第二个if改为else将阻止两者运行。

答案 2 :(得分:0)

我更愿意用这种方式编写代码:

Scanner s = new Scanner(System.in);
move = s.nextLine();
// enter to forfeit
if(move.equals("")){
    if(counter%2 == 0){
        whiteEnterForfeit = turn(board, "White", "W", "B");
    }
    if(counter%2 == 1) {
        blackEnterForfeit = turn(board, "Black", "B", "W");
    }
    printBoard(board);
    counter++;
 }