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

Random number guessing game with limitations after each guess

我在做猜数游戏:

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

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.";
    }

提前致谢!

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

public String makeGuess(int guess)

避免以完全相同的名称命名不同的实体 space(局部变量出现在不同的方法中或参数与数据成员具有相似名称以用于初始化目的除外)。从现在开始,您将调用该方法作为 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是游戏设置。而 lbhbguessCount 代表游戏状态。您可以将此逻辑拆分为另一个 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.";
    }
}

注意:我不喜欢将逻辑与输出层混淆,我在上面的方法中这样做的原因是你提到你是初学者,我的目的是让刚刚接触的人可以理解这个答案开始编程,非常困惑。出于实际解决方案的目的,您应该 return 一个状态,并在不同的层处理该状态并执行您需要的 console/UI 操作。我现在不会讨论细节,因为它也超出了范围,但是现在,请在上面的解决方案中取得一些成功,但是然后你应该明确地研究你需要如何编码,因为这几乎同样重要让您的代码正常工作。