Java (家庭作业)骰子程序,找不到符号

Java (家庭作业)骰子程序,找不到符号,java,Java,我是java新手,我的dice程序又遇到了一个错误 在这个程序中,我有三种方法,roll()滚动模具并返回一个介于1和用户指定的数字之间的值,getFaceValue()以int形式返回模具滚动的值,以及toString()以字符串形式返回模具滚动 我之前关于我的程序的问题的答案使我能够让程序正常工作,但它的结构并不是教授想要的,所以我不得不重新编写它。我现在知道我的方法/变量都不能是静态的,我只能在程序的主要部分接受用户输入 当我尝试编译时,出现以下错误: Die.java:12: error

我是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(您可以在我的程序中看到它被注释掉),但这产生了一个静态引用错误

我感谢你能提供的任何帮助


前面的问题是:

您没有在
public int roll(){

在main内部创建变量会将其作用域缩小到仅在main内部-除非将其作为变量传入(将通过值传递)或使其成为类变量(字段),否则无法访问该范围之外的变量

作为骰子,您希望将其作为实际类上的字段。因此,请在类的顶部定义边:

public class Die {
  int sides;
并将其分配到构造函数中:

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

然后,当您调用
roll
时,您的sides变量将可用。

您的变量sides未定义 如果按这样的值传递,则可以传递

public int roll(int sides) {
    .....
    double y = (x * sides) + 1;
    .....
}

边作为参数传递给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());
    }

    }

您可以为
sides
创建一个实例变量,并通过构造函数将其传递给die。这需要您取消对
私有int-sides
变量的注释

模具构造函数示例:

public Die(int s) {
  sides = s;
}
public Die(int sides) {
    this.sides = sides;
}
使用这样的构造函数,您可以使用读取的边数作为输入来实例化模具

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

现在,您的die的
sides
字段被设置为用户输入的任何值,die的方法相应地使用该值。

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

有两种方法可以实现这一点,但您应该找到一种方法,将从
main()
中的用户收集的输入传递到
Die
类。一种方法是在Die类的构造函数中:

public static void main(String [] args) {
    int sides = keyboard.nextInt();
    ...
    Die die = new Die(sides);
然后将
Die
类更改为具有一个构造函数,该构造函数接受
int
,并在名为
sides
的成员字段中跟踪它(尽管
main()
方法和
Die
类中的变量名称实际上不需要相同,这只是一种方便)


是的,这会起作用,但请把它当作一个真实的模型来考虑。如果你有一个骰子,它是否有可变的边数,你可以在每次掷骰子时交换它?没有。@Vulcan你是对的-我在第一次写答案时并没有真正考虑到这一点。更新以反映更好的类集成。是的,这将修复编译问题错误,但OP要求的解决方案与他的程序在另一个问题中的解决方案相同(不幸的是,他在这个问题中没有链接).是的,这会起作用,但要像真实的模型一样考虑。如果你有一个骰子,它有可变的边数,你可以在掷骰子时交换吗?没有。@Vulcan,我经常把我的d6当作d2、d3或d6p@Vulcan很好的一点是,骰子构造器更合适,这样只需设置一次边..在赌博中king dice=被击败后被踢出局x)@MimiEAM就像换骰子一样棒..xD无论如何,我认为你的答案作为一个有用的例子(而且比我这样的答案更省力)发布对OP的学习体验是有好处的,但没有以人们期望的方式模拟现实生活中的情况。谢谢,这非常有效。另外,我为没有链接到前面的问题而道歉。