【问题标题】:Classes, Methods and Random Number Generating类、方法和随机数生成
【发布时间】:2014-10-20 01:17:25
【问题描述】:

您将编写一个 Java 程序来玩 Pico、Fermi、Bagel 游戏。 以下是游戏规则:

计算机将随机生成一个“秘密”三位数。 第一个数字不会是0,所有的数字都会不同。 用户尝试猜测数字。如果用户猜对了, 那么游戏就结束了。

如果没有,电脑会给出提示,然后玩家再试一次。这 提示:

  • 对于每个与正确位置的密码匹配的数字,计算机都会打印“Fermi”

  • 对于每个匹配但位置不正确的数字,计算机会打印“Pico”

  • 如果没有一个数字匹配,计算机会打印“Bagels”

该程序将有一个主类和一个 Bagels 类。百吉饼 类将调用其他 3 个方法来

  1. 生成密码

  2. 判断当前猜测是否中奖

  3. 评估当前猜测并打印提示

我的问题 -- 当我运行程序时,它要求我输入一个 3 位代码,但它只是一直要求我输入一个 3 位代码而不是比较用户的猜测数字到随机生成的数字。我假设我对类或方法做了一些愚蠢的事情,因为我们不久前才学习它们,它们仍然让我感到困惑。

程序的第一部分是我的主类,第二部分是百吉饼类。

package assignment.iii;
import javax.swing.JOptionPane;
import java.util.Scanner; 

public class AssignmentIII {

public static void main(String[] args) 
   {
   int playagain = JOptionPane.showConfirmDialog(null, "Would you like to play?", "Message", JOptionPane.YES_NO_OPTION);

    while (playagain == JOptionPane.YES_OPTION) {      

     Bagels myBagels = new Bagels();
     myBagels.playGame() ;     
     myBagels.randNumber = 0;
     playagain = JOptionPane.showConfirmDialog(null, "Would you like to play again?", "Message", JOptionPane.YES_NO_OPTION);
}
}
}



 // start of Bagels class

package assignment.iii;
import java.util.Random;
import javax.swing.JOptionPane;

public class Bagels{


public int randNumber; 
private int Guess; 
private int Rand1, Rand2, Rand3;
private int Guess1, Guess2, Guess3;
private int guessCount;


public void playGame() 
{

    do {
    Guess = Integer.parseInt(JOptionPane.showInputDialog("Enter a three digit number"));
    }
    while (Guess != randNumber);                   

 }

private int generateSecretNumber()
{
         Random randN = new Random();
         return randN.nextInt(999)+1; 
}  

private void printHint(String guess)        
{
   if(randNumber == Guess)
        System.out.println("Correct");

      else
         {
         Guess1 = (Guess)/100;
         Guess2 = (Guess%100)/10;
         Guess3 = (Guess%100)%10;
         }

    if(Guess1 == Rand1)
    {
        System.out.println("Fermi");
    }
    if(Guess2 == Rand2)
    {
        System.out.println("Fermi");
    }
    if(Guess3 == Rand3 )
    {
        System.out.println("Fermi");
    }
    if(Guess2 == Rand1)
    {
        System.out.println("Pico");
    }
    if(Guess3 == Rand1)
    {
        System.out.println("Pico");
    }
    if(Guess1 == Rand2)
    {
        System.out.println("Pico");
    }
    if(Guess3 == Rand2)
    {
        System.out.println("Pico");
    }
    if(Guess1 == Rand3)
    {
        System.out.println("Pico");
    }
    if(Guess2 == Rand3)
    {
        System.out.println("Pico");
    }
    else if(Guess1 != Rand1 && Guess1 != Rand2 && Guess1 != Rand3 &&
            Guess2 != Rand1 && Guess2 != Rand2 && Guess2 != Rand3 &&
            Guess3 != Rand1 && Guess3 != Rand2 && Guess3 != Rand3)
    {
        System.out.println("Bagels");
    }
    guessCount++;
   }
}

【问题讨论】:

  • 仍然不知道为什么它只是反复要求我输入 3 位数字?我认为这与我的百吉饼类有关,我的 generateSecretNumber 和 printHint 方法说它们未使用?但我不确定如何制作,以便在程序中使用它们?

标签: java class random methods numbers


【解决方案1】:

如果没有自己测试,看起来错误确实出在您的 Assignment 类的主要方法中。当您创建百吉饼对象时,首先会调用它的 playGame 方法。

Bagels myBagels = new Bagels();
myBagels.playGame() ;

您的 playGame 方法依赖于与 randNumber 的比较,但 randNumber 永远不会被初始化! Java 成员变量有一个默认值,0 表示整数(参见:Default Values and Initialization in Java)。所以除非用户输入“0”,否则循环条件为真(Guess 不等于0)并再次提示用户。

我将提出的一个建议是编写一个采用单个 int 值的构造函数,并将 randNumber 设置为该值。

【讨论】:

  • 所以我在主类中初始化它对吗?我尝试在字符串下的主类中执行 (int randNumber = 0;) 但它只是说没有使用 randNumber。还是我需要将它添加到 playGame 下的 bagels 类中?
  • 对,那是因为 randNumber 是 'Bagels' 类中的一个字段。您创建的名为 myBagels 的“Bagels”实例具有 randNumber 字段。因此,在该类之外(如在您的 main 方法中),您可以使用myBagels.randNumber 访问它。我会看一下this page 并尝试为您的 Bagels 类添加一个构造函数,该构造函数采用 int,并使用它来初始化 randNumber 字段。然后调用构造函数看起来像 Bagels myBagels = new Bagels(10); 将其初始化为 10。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 2013-03-26
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多