Java - 引用其他子类

时间:2014-10-30 17:18:24

标签: java if-statement

我已经学习了几个月的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

3 个答案:

答案 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整数。祝你好运。