Java (家庭作业)骰子程序,找不到符号
我是java新手,我的dice程序又遇到了一个错误 在这个程序中,我有三种方法,roll()滚动模具并返回一个介于1和用户指定的数字之间的值,getFaceValue()以int形式返回模具滚动的值,以及toString()以字符串形式返回模具滚动 我之前关于我的程序的问题的答案使我能够让程序正常工作,但它的结构并不是教授想要的,所以我不得不重新编写它。我现在知道我的方法/变量都不能是静态的,我只能在程序的主要部分接受用户输入 当我尝试编译时,出现以下错误:Java (家庭作业)骰子程序,找不到符号,java,Java,我是java新手,我的dice程序又遇到了一个错误 在这个程序中,我有三种方法,roll()滚动模具并返回一个介于1和用户指定的数字之间的值,getFaceValue()以int形式返回模具滚动的值,以及toString()以字符串形式返回模具滚动 我之前关于我的程序的问题的答案使我能够让程序正常工作,但它的结构并不是教授想要的,所以我不得不重新编写它。我现在知道我的方法/变量都不能是静态的,我只能在程序的主要部分接受用户输入 当我尝试编译时,出现以下错误: Die.java:12: error
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的学习体验是有好处的,但没有以人们期望的方式模拟现实生活中的情况。谢谢,这非常有效。另外,我为没有链接到前面的问题而道歉。