随机数猜测游戏,每次猜测后都有限制

时间:2021-03-28 11:40:16

标签: java logic binary-search logical-operators

我正在制作一个猜数字游戏:

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

然而,诀窍是我需要实现另一个条件:每个猜测都应该“缩小”我能够猜测的间隔。例如:计算机生成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.";
    }

先谢谢你!

1 个答案:

答案 0 :(得分:2)

首先,为了避免混淆,让我们重命名该方法,以确保其名称与其参数不完全匹配,因此它应该如下所示:

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

请注意,我对一些值进行了硬编码。您可能希望通过初始化和类似的东西使其动态化,但这超出了答案的范围。 lowerBoundhigherBoundlimit 是游戏设置。而 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 操作。我现在不会详述细节,因为它也超出了范围,但是现在,请使用上述解决方案取得一些成功,但是您应该明确了解您需要如何编码,因为这几乎同样重要使您的代码正常工作。