如何解决变量?

时间:2015-02-05 01:23:13

标签: java variables

我正在制作Nim游戏,我正在添加单人游戏模式。为此,我创建了一个方法(不确定这是否就是你所说的),并在用户结束时调用它。弹出一条错误消息:“变量未解析”。它是我的代码的位置吗?请帮忙。

我尝试再次创建变量,只是调用变量。

以下是目前的代码:

import java.util.Scanner;
import java.util.Random; 
public class nim {

    public static void computerMove() {
        Random randA = new Random();
        int pcPilePick = randA.nextInt(10);

        Object amtInPile;
        if (pcPilePick == 1) {
            amtInPile = stones1;
        }
        if (pcPilePick == 2) {
            amtInPile = stones2;
        }
        if (pcPilePick == 3) {
            amtInPile = stones3;
        }
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.println("Welcome!");
        System.out.println("This is the game of Nim.");
        System.out.println("[1]Single player or [2]multiplayer?");
        String choice = input.nextLine();
        int gameMode = Integer.parseInt(choice);

        int stones1 = 9;// These variables will be used
        int stones2 = 9;// in order to subtract a number
        int stones3 = 9;// of stones from the pile.

        int tStones = stones1 + stones2 + stones3;

        while (tStones > 0) {
            System.out.println("[1] Pile 1:   " + stones1);  //This stack will display 
            System.out.println("[2] Pile 2:   " + stones2);  //the stone count for 
            System.out.println("[3] Pile 3:   " + stones3);  //each pile after the first move. 

            System.out.println("From which pile would you like to take?");
            String aMove = input.nextLine();
            System.out.println("How many stones would you like to take?");
            String bMove = input.nextLine();
            int pilePick = Integer.parseInt(aMove);
            int amtInPile = 0;
            if (pilePick == 1) {
                amtInPile = stones1;
            }
            if (pilePick == 2) {
                amtInPile = stones2;
            }
            if (pilePick == 3) {
                amtInPile = stones3;
            }

            int stonePick = Integer.parseInt(bMove);

            /*All the while loops after this comment are
             *used in order to prevent stupid answers.
             */
        //legal move
            //illegal move
            if (pilePick > 3 || stonePick > amtInPile) {
                System.out.println("But nothing happened!");

                System.out.println("That move is invalid");
                pilePick = 0;
                stonePick = 0; // ensure that for an illegal move, nothing will change. 
            }
            if (pilePick == 1) {            //This stack of code will
                stones1 = stones1 - stonePick;
            }
            if (pilePick == 2) {            // subtract stones based on the
                stones2 = stones2 - stonePick;
            }
            if (pilePick == 3) {           // pile input and stone input. 
                stones3 = stones3 - stonePick;
            }
            tStones = stones1 + stones2 + stones3;
            if (stones1 + stones2 + stones3 > 0) {
                System.out.println("Taking " + stonePick + " stones from stack " + pilePick);
            }
            if (gameMode == 1) {
                computerMove();
            }

        }
        System.out.println("You lose!");
    }

}

2 个答案:

答案 0 :(得分:2)

变量stones1stones2stones3只有main方法中的上下文,它们在computerMove方法中未定义

您可以将它们定义为static类变量,但这是一个不良习惯的滑坡的开始,而是修改computerMove方法以接受所需的信息

public static void computerMove(int stone1, int stone2, int stone3) {
    Random randA = new Random();
    int pcPilePick = randA.nextInt(10);

    Object amtInPile;
    if (pcPilePick == 1) {
        amtInPile = stones1;
    }
    if (pcPilePick == 2) {
        amtInPile = stones2;
    }
    if (pcPilePick == 3) {
        amtInPile = stones3;
    }
}

现在调用computeMove会有所作为,但它没有超出方法本身的上下文,所以你可能需要返回值

public static int computerMove(int stone1, int stone2, int stone3) {
    //...
    return amtInPile;
}

然后您可以在相同的上下文中维护它...

int computerPile = 0;
//...
if (gameMode == 1) {
    computerPile = computerMove(stones1, stones2, stones3);
}

请查看Passing Information to a Method or a Constructor了解详情

答案 1 :(得分:0)

在方法computeMove中第8行 - > 16行的if语句中,引用了未定义的变量stones1, stones2, stones3。你需要声明这些变量来引用它们,或者将它们作为参数传递(这可能是你想要的)。

public static void computerMove(int stones1, int stones2, int stones3){
    Random randA = new Random();
    int pcPilePick = randA.nextInt(10);

    Object amtInPile;
    if (pcPilePick==1){
        amtInPile = stones1;
    }
    if (pcPilePick==2){
        amtInPile = stones2;
    }
    if (pcPilePick==3){
        amtInPile = stones3;
    }
}

并将第87行的函数调用更改为:

computerMove(stones1, stones2, stones3);