Java-引用其他子类

Java-引用其他子类,java,if-statement,Java,If Statement,我学Java已经好几个月了,但我似乎真的学得不好。我一直试图自己制作一些非常简单的程序,而不是看教程,但是一个如此简单的游戏已经让我非常头疼了 无论如何,我正在尝试写一个简单的基于控制台的游戏。程序生成一个0-100之间的整数,你必须猜测它,它要么说数字大,要么说数字小。简单对吧 我有两个问题: 1它只运行一次,如果扫描器值不正确,它表示随机数大于/小于,您可以输入另一个整数,但第二个输入没有响应。 2->所以我认为这是因为它将为目标生成新的值,并且存在某种冲突,所以我决定将目标生成放在一个单独

我学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;
    }
给出一个错误

Cannot make a static reference to the non-static field GetMath.goal
如果我将int-goal更改为static-int-goal,int-static-goal将给出一个错误,并要求删除所述行中的单词static

我希望有人能理解,我不太擅长编写行话:D

1它只运行一次,如果扫描器值不正确,它表示随机数大于/小于,您可以输入另一个整数,但第二个输入没有响应

如果我没有遗漏任何内容,那么您没有使用任何类型的循环,因此您的应用程序将读取播放器的输入,检查它并打印消息,然后终止

2->所以我认为这是因为它将为目标生成新的值,并且存在某种冲突,所以我决定将目标生成放在一个单独的子类中。但是没有。我只是不知道如何在if/else块中使用目标值

您不需要单独的类,只要在玩家猜对目标时为目标分配一个新值即可

我将试着做一个简单的例子,说明你的游戏应该是什么样子的,所以你需要扩展它:

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;
      }
    }
  }
}    
这是行不通的,因为GetMath.goal需要是一个静态变量,而事实并非如此。即使是,它也只会按照您的方式初始化一次

如果你这样做,但正如已经说过的,这不是必要的,我会认为这种方法坏设计无论如何,你应该调用int目标=新GETMAth.Objor;为了创建一个新的GetMath实例,将其实例变量目标初始化为一个新的随机数,然后读取该变量

但再一次:这是一个糟糕的设计,无论如何都没有必要

如果我将int-goal更改为static-int-goal,int-static-goal将给出一个错误,并要求删除所述行中的单词static

这取决于你把static关键字放在哪里。它需要放在int类型的前面,在您的情况下,只允许用于GetMath中的目标,即


静态引用错误是因为您正在调用尚未初始化的嵌套类。如果将GetMath类设置为静态,我认为这将解决问题。然而,这并不是必要的

你遇到的实际问题是第二轮。您的程序所做的是在末尾请求一个新的整数,然后停止。倒数第二行的返回将结束节目。相反,您希望在将目标声明到循环中之后将所有内容都粘贴到while或for中是可以的,尽管我对其设置了数字限制以避免无限循环。然后,如果输入了错误的号码,您可以重新查找

我想困惑在于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;

首先,正如约翰所建议的——不需要上GetMath课。第二,你的逻辑是所有的主要方法。相反,在NumberGame中创建一个方法并将逻辑放在那里。它只要求输入一次的原因是因为您只调用Scanner nextInt一次。你需要把它放在一个循环中,只有当numIn等于目标时才退出循环。此外,不使用num整数。祝你好运。

你为什么要单独上课?为什么不直接使用int-goal=int-Math.ceilMath.random*101;?另外,GetMath类定义的位置也很奇怪。我认为它会再次运行Mat.Random并生成一个新的数字。整数必须始终是相同的值。好的,看起来好多了!但是,由于某些原因,如果使用return0,则必须将主类名更改为publicstaticintmainstring[]args{至少伊柯丽斯建议在返回0行上解决这个错误,当我这样做时,我得到一个例外,我必须使用公共静态空隙main。抱歉,我在C++模式中。显然,在这种情况下,你可以将“回合”警告引入到依赖于IFI= 24的循环中,并用断言替换“赢”返回。如果你用完了,循环就不会自然结束
带着对原因的警告转身,一场胜利将过早地结束这一切。好吧,这似乎奏效了。这很有帮助,谢谢你:!哇,谢谢你的帮助。这里有一些非常好的信息,让我的游戏正常运行!我要试着把这个和Felix的for方法混合,看看结果如何。谢谢你所做的一切,托马斯:
int goal = GetMath.goal; 
//      TRIED THIS WITHOUT SEPARATE CLASS TOO:
final class GetMath{
int goal = (int) Math.ceil(Math.random()*101);
}
class GetMath {
  static int goal = ...
}
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;