我已经学习了几个月的Java,但我似乎并不能很好地学习它。我一直试图自己制作真正的简单程序,而不是观看教程,而是一个游戏"这个简单已经让我非常头疼。
无论如何,我试图编写一个简单的基于控制台的游戏。该程序生成一个0-100的整数,你必须猜测它,它要么说数字更大或更小。简单吧?
我有两个问题: 1)它只会运行一次,如果扫描仪值不正确,它表示随机数更大/更小,你可以输入另一个整数,但是第二个输入没有响应。 2) - >所以我认为这是因为它会为"目标"产生新的价值。并且存在某种冲突,所以我决定将目标放在"生成在一个单独的子类中。但不是。我只是不明白如何使用"目标" if / else块中的值。
以下是代码:
import java.util.Scanner;
public class NumberGame {
public static void main(String[] args){
int num, numIn;
int goal = GetMath.goal;
// TRIED THIS WITHOUT SEPARATE CLASS TOO:
final class GetMath{
int goal = (int) Math.ceil(Math.random()*101);
}
System.out.println("Enter an integer from 0 to 100");
//numIn = -1; ---- SOMETHING I TRIED
Scanner in = new Scanner(System.in);
numIn = in.nextInt();
if(numIn>goal){
System.out.println("It's smaller than " + numIn);
in.nextInt();
return;
}else if(numIn<goal){
System.out.println("It's greater than " + numIn);
in.nextInt();
return;
} else if(numIn==goal){
System.out.println("Congratulations, you win the game!");
} else {
System.out.println("Please, enter an integer from 0 to 100");
in.nextInt();
return;
}
现在行
int goal = GetMath.goal;
给出错误
Cannot make a static reference to the non-static field GetMath.goal
如果我改变&#34; int goal&#34; to&#34; static int goal&#34;,&#34; int static goal&#34;会给出错误并要求删除单词&#34; static&#34;在这条线上。
我希望有人理解,我不太擅长编写术语:D
答案 0 :(得分:0)
1)它只运行一次,如果扫描仪值不正确,它表示随机数更大/更小,你可以输入另一个整数,但是第二个输入没有响应。
如果我没有错过任何你没有使用任何类型的循环,那么你的应用程序将读取播放器的输入,检查并打印消息然后终止。
2) - &gt;所以我认为这是因为它会为“目标”产生新的价值并且存在某种冲突,所以我决定将“目标”生成放在一个单独的子类中。但不是。我只是不明白如何使用if / else块中的“目标”值。
您不需要单独的课程,只需在玩家猜对了时为goal
分配一个新值。
我会尝试做一个简短的例子说明你的游戏应该是什么样子(只是一个裸骨,所以你需要扩展它):
public static void main(String... args) {
Random random = new Random(); //more convenient than Math.random()
int goal = random.nextInt(101);
Scanner in = new Scanner(System.in);
while(true) { //run until the loop terminates itself calling return
//get the player's guess
System.out.println("Enter an integer from 0 to 100");
int numIn = in.nextInt();
//TODO: check that numIn is in range 0 to 100
//now check
if(numIn>goal){
System.out.println("It's smaller than " + numIn + "\nPlease try again.");
} else if(numIn<goal){
System.out.println("It's greater than " + numIn + "\nPlease try again.");
} else{ //if the number is not greater or smaller it mut be equal
System.out.println("Congratulations, you win the game! Play again? (y/n)");
//read the answer here and if it is "y" then assign a new value to goal, otherwise call return to end the game.
String answer = in.next();
if( answer.equalsIgnoreCase("y") ) {
goal = random.nextInt(101);
} else {
return;
}
}
}
}
最后对你的代码(以及假设)的一些评论:
int goal = GetMath.goal;
// TRIED THIS WITHOUT SEPARATE CLASS TOO:
final class GetMath{
int goal = (int) Math.ceil(Math.random()*101);
}
这不起作用,因为GetMath.goal
需要是静态变量,而实际情况并非如此。即使它是,它只会按照你的方式进行初始化。
如果你就是这样做的(但是已经说过这里没有必要这样做了,我认为这种做法反正不好),你应该打电话给int goal = new GetMath().goal;
为了创建GetMath
的新实例,将其实例变量goal
初始化为新的随机数,然后读取该变量。
但是又一次:这是糟糕的设计,无论如何都不是必需的。
如果我将“int goal”更改为“static int goal”,则“int static goal”将给出错误并要求删除所述行中的“static”字样。
这取决于您放置static
关键字的位置。它需要放在类型(int
)的前面,在您的情况下,只允许goal
中的GetMath
,即
class GetMath {
static int goal = ...
}
答案 1 :(得分:0)
出现静态引用错误是因为您正在调用尚未初始化的嵌套类。如果你使GetMath类静态,我认为这将解决问题。但是,它并非真的那么必要。
你遇到的实际问题是第二轮问题。你的程序做的是要求一个新的整数(结尾处的else)然后停止。倒数第二行的回报正在结束该计划。相反,你想在将目标声明为循环之后坚持所有内容(虽然或者很好,但是我为此设置了数字限制以避免无限循环)。然后,如果输入了错误的数字,你可以再去一次。
我想混淆在于return
的作用。它并不能帮助你。它结束方法调用并传回给出的内容。您希望程序关闭时,只有返回值,而不是您已完成的操作。
for(int i = 0; i < 25; i++){
System.out.println("Enter an integer from 0 to 100");
//numIn = -1; ---- SOMETHING I TRIED
Scanner in = new Scanner(System.in);
numIn = in.nextInt();
if(numIn==goal){
System.out.println("Congratulations, you win the game!");
return 0; //return 0 indicates a normal completion of the program
}...etc
}
System.out.println("Out of turns. Too bad, you lose...") //Just a suggestion, but an explanation of why the game just stopped is good, no?
return 0;
答案 2 :(得分:0)
首先,正如John建议的那样 - 不需要GetMath类。其次,你的逻辑都是主要方法。相反,在NumberGame中创建一个方法并将逻辑放在那里。它只要求输入一次的原因是因为你只调用一次Scanner nextInt()。只有当numIn等于目标时,才需要将其置于循环中并退出循环。此外,不使用num整数。祝你好运。