【问题标题】:Random number guessing game with limitations after each guess每次猜测后有限制的随机数猜谜游戏
【发布时间】:2021-03-28 11:40:16
【问题描述】:

我正在做一个猜数字游戏:

  • 计算机在区间内生成一个数字
  • 我尝试猜测它并收到回复,无论它高于/低于我的猜测还是等于我的猜测,我已经赢了
  • 有一个我可以猜测的区间,以及一个猜测尝试限制

然而,诀窍是我需要实现另一个条件:每次猜测都应该“缩小”我能够猜测的区间。例如:电脑生成50,我猜是25,电脑回复“随机数较大。”。现在知道了,我不应该再猜测低于 25 的任何东西,这是不合理的。如果我猜到 15,计算机应该回复“猜测没有意义。”。我知道我需要以某种方式将每个猜测值保存到一个新变量中,但似乎没有任何效果。我是初学者,请耐心等待下面的代码,我尝试了很多东西:

public String guess(int guess)
{
    
    int lowerBound = 0;
    int upperBound = 99;
    
    Set<Integer> lowerGuesses = new TreeSet<>();
    Set<Integer> higherGuesses = new TreeSet<>();

    if (gameOver) {
        return "The game is over.";
    }
    
    if (guess < 0 || guess > 99) {
        return "The guess is out of bounds.";
    }
        
    if (guessCount < maxGuessCount) {
            
        if (guess < secretNumber) {       
            if (lowerGuesses.contains(guess)) {
                return "The guess doesn't make sense.";
            }
            else {
            guessCount++;
            lowerBound = guess;
            lowerGuesses.add(guess);
            
            return "The random number is larger."; 
            }
        }

        if (guess > secretNumber) {
            if (higherGuesses.contains(guess)) {
                return "The guess doesn't make sense.";
            }
            else {
            guessCount++;
            upperBound = guess;
            higherGuesses.add(guess);
            
            return "The random number is smaller.";
            }
        }
        
        if (lowerGuesses.contains(guess)) {
                return "The guess doesn't make sense.";
        }
        
        if (higherGuesses.contains(guess)) {
                return "The guess doesn't make sense.";
        }
        
    }
    
    if (guess < lowerBound || guess > upperBound) {
        return "The guess doesn't make sense.";
    }
    
    if (guessCount == maxGuessCount) {
        gameOver = true;
        victorious = false;
        return "Ran out of guess attempts.";
    }
    
    guessCount++;
    gameOver = true;
    victorious = true; 
    return "You won.";
    }

提前谢谢你!

【问题讨论】:

  • 您可能不必存储所有“lowerGuesses”和“higherGuesses”。只需跟踪最后的猜测,如果它低于“secretNumber”,请确保输入大于最后一个输入,反之亦然。此外,您正在检查猜测是否在“lowerGuesses”/“higherGuesses”中;但是,您不想这样做,因为您希望它在新输入大于以前的输入时仍然返回“猜测没有意义”,而前一个输入应该更小。如果新输入不是猜测之一,则不会通过 if 语句。
  • 另外,您似乎多次调用“guess”,这意味着每次“higherGuesses”/“lowerGuesses”中只有一个元素。
  • @DavidLee 我正在尝试存储每个猜测。如果它大于secretNumber,我认为它是猜测的新上边界并将其值分配给upperBound。如果更小,我将其分配给 lowerBound,这是我第一次尝试跟踪该值的方式。但是它被完全忽略了,即使条件“if (guess > lower/upperBound)”也无法识别它。我得到的唯一答复是猜测是否更大/更小。您是否认为问题在于“猜测”被反复调用?我不太明白为什么它的值不保持在 lower/upperBound 甚至猜测集中。

标签: java logic binary-search logical-operators


【解决方案1】:

首先,为了避免混淆,让我们重命名该方法,以确保其名称与其参数不完全匹配,所以它应该是这样的:

public String makeGuess(int guess)

避免使用完全相同的名称命名同一名称空间中的不同实体(局部变量存在于不同的方法或参数中,具有相似名称的数据成员用于初始化是一个例外)。从现在开始,您将调用该方法为makeGuess(25),例如。

现在,到实际问题。你有一个错误的假设。您假设您需要跟踪过去的时间间隔。事实并非如此。您可以只更改间隔的边缘。另外,你的代码是多余的,我建议你重构它。最后,您总是将上限、局部边界以及上下猜测值初始化为局部变量,因此它们永远不会被跟踪。取而代之的是,您需要执行以下简单的措施来完成这项工作:

将边界和限制定义为数据成员

protected int lowerBound = 0;
protected int higherBound = 99;
protected int lb = 0;
protected int hb = 99;
protected int limit = 5;
protected int guessCount = 0;
protected int randomizedNumber; //Initialize this somewhere

请注意,我对一些值进行了硬编码。您可能希望通过初始化和类似的东西使这个动态化,但这超出了答案的范围。 lowerBound、higherBound、limit 是游戏设置。而lb、hb、guessCount代表游戏状态。您可以将此逻辑分离为另一个 class,但为了简单起见,即使我会以不同的方式进行编程,我也会在这种情况下将它们留在这里。

有一个初始化游戏的方法

public void initialize() {
    lb = lowerBound;
    hb = higherBound;
    guessCount = 0;
}

因此,您将游戏初始化与启动和维护游戏的外部逻辑分开。

以简单的方式实现 makeGuess

public String makeGuess(int guess) {
    if (++guessCount >= limit) return "The game is over.";
    else if ((lb > guess) || (hb < guess)) return "The guess doesn't make sense";
    else if (randomizedNumber == guess) return "You won.";
    else if (guess < randomizedNumber) {
        hb = guess;
        return "The random number is smaller.";
    } else {
        lb = guess;
        return "The random number is larger.";
    }
}

注意:我不喜欢将逻辑与输出层混为一谈,我在上面的方法中这样做的原因是你提到你是一个初学者,我的目的是让刚开始编程的人可以理解这个答案并且很困惑。出于实际解决方案的目的,您应该返回一个状态,并在不同的层进程中状态并执行您需要的控制台/UI 操作。我现在不会详细介绍,因为它也超出了范围,但是现在,请在上面的解决方案中取得一些成功,但是你应该明确地研究你需要如何编码,因为这几乎同样重要就像让你的代码工作一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多