2

我是 java 新手,我的 dice 程序又遇到了另一个错误。

在这个程序中,我有三个方法,roll() 来掷骰子并返回一个介于 1 和用户指定的数字之间的值,getFaceValue(),以 int 形式返回掷骰子的值,以及 toString(),将骰子作为字符串返回。

我之前关于我的程序的问题的答案使我能够使程序正常工作,但它的结构不像教授想要的那样,所以我不得不重新设计它。我现在知道我的方法/变量都不能是静态的,我只能在程序的主要部分接受用户输入。

当我尝试编译时,出现以下错误:

Die.java:12: error: cannot find symbol
double y = (x * sides) + 1;

symbol: variable sides
location: class Die

我的代码如下:

import java.io.*;
import java.util.*;

public class Die {
    //private int sides;
    private int z;
    private String faceName;

    //sets (and returns) the face value to a uniform random number between 1 and the number of faces.
    public int roll() {
        double x = Math.random();
        double y = (x * sides) + 1;
        z = (int)y;
        return z;
    }

    //returns the current face value of the die.
    public int getFaceValue() {
        int face = z;
        return face;
    }

    //returns the string representation of the face value.
    public String toString() {
        faceName = Integer.toString(z);
        return faceName;
    }

    public static void main(String [] args) {
        int sides;
        System.out.println("How many sides will the die have?");
        Scanner keyboard = new Scanner(System.in);
        sides = keyboard.nextInt();

        System.out.println(" ");
        Die die = new Die();
        System.out.println("Roll: " + die.roll());
        System.out.println("Face: " + die.getFaceValue());
        System.out.println("String: " + die.toString());
    }
}

最初,我将变量边作为私有 int(您可以在我的程序中看到它被注释掉),但这会产生静态引用错误。

感谢您提供的任何帮助。

上一个问题是:骰子程序中的方法返回0

4

5 回答 5

1

您可以创建一个实例变量sides并通过构造函数将其传递给模具。这将要求您取消注释您的private int sides变量。

示例模具构造函数:

public Die(int sides) {
    this.sides = sides;
}

使用这样的构造函数,您可以使用读取的面数作为输入来实例化您的 Die。

sides = keyboard.nextInt();
Die die = new Die(sides);

现在,您的 diesides字段设置为用户输入的任何内容,并且 die 的方法相应地使用该值。

于 2012-09-26T20:43:24.417 回答
0

你还没有sides在范围内定义public int roll() {

在 main 内部创建一个变量会将其范围缩小到仅在 main 内部 - 除非您将其作为变量(将按值传递)传递或使其成为类变量(字段),否则您无法访问外部变量。

作为一个骰子,你想让它成为实际类的一个字段。所以在类的顶部定义边:

public class Die {
  int sides;

并在您的构造函数中分配它:

public Die(int s) {
  sides = s;
}

然后当你调用时roll,你的边变量将可用。

于 2012-09-26T20:40:21.627 回答
0

你的变量边是未定义的,如果像这样按值传递,你可以通过

public int roll(int sides) {
    .....
    double y = (x * sides) + 1;
    .....
}
于 2012-09-26T20:40:41.860 回答
0

作为参数传递给 roll 方法。

import java.io.*;
import java.util.*;

public class Die {
//private int sides;  
private int z;
private String faceName;

//sets (and returns) the face value to a uniform random number between 1 and the number of faces.
public int roll(int sides) {
    double x = Math.random();
    double y = (x * sides) + 1;
    z = (int)y;
    return z;
}


public static void main(String [] args) {
        int sides;
        System.out.println("How many sides will the die have?");
        Scanner keyboard = new Scanner(System.in);
        sides = keyboard.nextInt();

        System.out.println(" ");
        Die die = new Die();
        System.out.println("Roll: " + die.roll(sides)); // pass it as an argument to roll
        System.out.println("Face: " + die.getFaceValue());
        System.out.println("String: " + die.toString());
    }

    }
于 2012-09-26T20:40:51.080 回答
0

您遇到的问题是sides该方法的本地问题main(),并且不会以任何方式传递给该roll()方法。当编译器正在编译roll()时,它看到double y = (x * sides) + 1;并且不知道sides指的是什么 - 因此是错误。

有两种方法可以完成此操作,但您应该找到一种方法将您从用户那里收集的输入传递main()给您的Die班级。一种方法是在 Die 类的构造函数中:

public static void main(String [] args) {
    int sides = keyboard.nextInt();
    ...
    Die die = new Die(sides);

然后,您将Die类更改为具有接受 an并在名为的成员字段int中跟踪它的构造函数(尽管方法和类中的变量名称实际上不需要相同,这只是为了方便) .sidesmain()Die

public class Die {
    private int sides;

    public Die(int sides) {
        this.sides = sides;
    }

    public int roll() {
        ...
        double y = (x * this.sides) + 1;
于 2012-09-26T20:43:45.553 回答