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

Java 随机数猜测游戏,每次猜测后有限制,java,logic,binary-search,logical-operators,Java,Logic,Binary Search,Logical Operators,我正在做一个数字猜测游戏: 计算机在一个区间内生成一个数字 我试着猜测,然后收到回复,无论是高于/低于我的猜测,还是等于我的猜测,我都赢了 有一个时间间隔,我可以猜测,以及猜测尝试极限 然而,诀窍是,我需要实现另一个条件:每次猜测都应该“缩短”我能够猜测的时间间隔。例如:计算机生成50,我猜是25,计算机回答“随机数更大”。现在知道了这一点,我再也猜不到低于25的了,这是不合理的。如果我猜测,即15,计算机应回答“猜测没有意义。”。我知道我需要以某种方式将每个猜测值保存到一个新变量中,但似乎

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

  • 计算机在一个区间内生成一个数字
  • 我试着猜测,然后收到回复,无论是高于/低于我的猜测,还是等于我的猜测,我都赢了
  • 有一个时间间隔,我可以猜测,以及猜测尝试极限
然而,诀窍是,我需要实现另一个条件:每次猜测都应该“缩短”我能够猜测的时间间隔。例如:计算机生成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.";
    }
公共字符串猜测(int-guess)
{
int lowerBound=0;
int上限=99;
设置LowerGuesss=新树集();
Set higherGuesses=new TreeSet();
如果(游戏结束){
return“游戏结束了。”;
}
如果(猜测<0 | |猜测>99){
return“猜测超出范围。”;
}
if(猜测计数<最大猜测计数){
如果(猜测<秘密数){
if(lowerguesss.contains(猜测)){
return“猜测没有意义。”;
}
否则{
猜数++;
lowerBound=猜测;
添加(猜测);
返回“随机数较大。”;
}
}
如果(猜测>秘密数字){
if(higherGuesses.contains(猜测)){
return“猜测没有意义。”;
}
否则{
猜数++;
上限=猜测;
高级。添加(猜测);
返回“随机数较小。”;
}
}
if(lowerguesss.contains(猜测)){
return“猜测没有意义。”;
}
if(higherGuesses.contains(猜测)){
return“猜测没有意义。”;
}
}
if(猜测<下界| |猜测>上界){
return“猜测没有意义。”;
}
如果(猜测计数==最大猜测计数){
gameOver=true;
胜利=错误;
return“猜测尝试已用尽”;
}
猜数++;
gameOver=true;
胜利的=正确的;
返回“您赢了。”;
}

提前谢谢你

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

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

现在,我们来谈谈实际问题。你的假设不正确。您假设需要跟踪过去的时间间隔。事实并非如此。您可以只更改间隔的边。另外,您的代码是多余的,我建议您重构它。最后,您总是将上界、局部界以及较高和较低的猜测初始化为局部变量,因此它们永远不会被跟踪。相反,您需要执行以下简单的措施来实现此功能:

将边界和限制定义为数据成员 注意,我已经硬编码了一些值。您可能希望通过初始化之类的东西使其动态化,但这超出了答案的范围<代码>下边界,
高边界
限制
是游戏设置。而
lb
hb
guessCount
代表游戏状态。您可以将此逻辑拆分为另一个
,但是为了简单起见,即使我的编程方式不同,我还是将它们留在这里

有一个初始化游戏的方法 因此,您需要将游戏初始化与启动和维护游戏的外部逻辑分开

以一种简单的方式实现makeGuess
公共字符串makeGuess(int guess){
如果(++guessCount>=limit)返回“游戏结束。”;
否则如果((lb>guess)|(hb

注意:我不喜欢将逻辑与输出层混淆,我在上面的方法中这样做的原因是您提到您是一名初学者,我的目的是让刚刚开始编程且非常困惑的人能够理解这个答案。对于实际的解决方案,您应该返回一个状态,并在不同的层进程中返回该状态并执行所需的控制台/UI操作。我现在不讨论细节,因为它也超出了范围,但现在,请在上面的解决方案中取得一些成功,但接下来您肯定应该研究如何编写代码,因为这几乎与使代码正常工作一样重要。

您可能不必存储所有的“Lowergues”和“Highergues”只需跟踪最后一次猜测,如果它低于“secretNumber”,请确保输入大于最后一次输入,反之亦然。此外,您正在检查猜测是否在“Lowerguesss”/“Higherguesss”中;然而,你不想这样做,因为你想要它
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
public void initialize() {
    lb = lowerBound;
    hb = higherBound;
    guessCount = 0;
}
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.";
    }
}