当前位置: 首页 > 知识库问答 >
问题:

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

谷梁英毅
2023-03-14

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

  • 计算机在间隔内生成一个数字
  • 我试着猜测它,并收到一个回复,不管它是高于/低于我的猜测,还是等于我的猜测,我赢了
  • 有一个可以猜测的间隔,还有一个猜测尝试限制
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个答案

孟英光
2023-03-14

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

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

注意:我不喜欢把逻辑和输出层混在一起,我在上面的方法中这样做的原因是你已经提到你是一个初学者,我的意图是让这个答案对刚刚开始编程并非常困惑的人来说是可以理解的。为了实际解决方案的目的,您应该返回一个状态,并在不同的层处理该状态,并执行所需的控制台/UI操作。现在我将不详细说明,因为它也超出了范围,但现在,请使用上面的解决方案取得一些成功,但随后您应该明确地研究您需要如何编写代码,因为这几乎与使代码工作同样重要。

 类似资料:
  • 好吧,我知道这个以前有人问过,但我就是想不出哪里出了问题。以下是我的说明: “编写一个程序,生成1到1000之间的随机数。然后让用户猜猜数字是多少。如果用户的猜测值高于随机数,程序应该显示“太高,再试一次”。如果用户的猜测值低于随机数,程序应该显示“太低,再试一次”。程序应该使用一个循环,直到用户正确猜测出随机数。 还有,保持用户猜测次数的计数。当用户正确猜测随机数时,程序应该显示猜测的次数。输入

  • 我想做一个简单的猜谜游戏,电脑应该猜出我在0和100之间选择的数字。尝试运行它,如果数字太低按1,如果数字太高按2。 1.如果我选择50,计算机猜测41,我按1,因为数字太低了 是55吗?2 是26吗?1 是35吗?1 是97吗?2

  • 我的程序应该要求用户猜测 0 到 100 之间的数字,但我似乎无法正确输出。目前,如果用户数大于随机数,它会打印出无限数量的“您的数字太高”。此外,如果第一个 UserGuess 很低,那么以下所有数字都将具有相同的提示:(“您的数字太低”),尽管它们实际上大于随机数。我不知道我做错了什么。任何帮助将不胜感激。谢谢!

  • Java,Net beans 8.2 } 输入你的猜测(0退出):20你的猜测太低了

  • 本文向大家介绍Java实现猜数字小游戏(有次数限制),包括了Java实现猜数字小游戏(有次数限制)的使用技巧和注意事项,需要的朋友参考一下 用代码模拟猜数字的小游戏,供大家参考,具体内容如下 思路: 1、首先需要产生一个随机数字,并且一旦产生不再变化。用Random的nextInt方法 2、需要键盘输入,所以用到了Scanner 3、获取键盘输入的数字,用Scanner当中的nextInt方法 4