在我的java程序中遇到未知错误

在我的java程序中遇到未知错误,java,Java,我已经做了一个Java程序-这个程序将从0到7中随机选择3个数字,我们必须猜测它们是什么。要点击所有数字,我要验证输入。如果用户输入一个大于7的数字,它将再次向number索取,同时忽略用户先前输入的数字 代码正在成功编译,但当我运行它并选择大于7的数字时,它不会提示用户输入新的数字。是什么导致了错误?我怎样才能修好它 import java.io.*; import java.util.*; import java.lang.*; class GameHelper { public

我已经做了一个Java程序-这个程序将从0到7中随机选择3个数字,我们必须猜测它们是什么。要点击所有数字,我要验证输入。如果用户输入一个大于7的数字,它将再次向number索取,同时忽略用户先前输入的数字

代码正在成功编译,但当我运行它并选择大于7的数字时,它不会提示用户输入新的数字。是什么导致了错误?我怎样才能修好它

import java.io.*;
import java.util.*;
import java.lang.*;

class GameHelper {
    public String getUserInput(String prompt) {
        String inputLine = null;
        System.out.print(prompt + " ");
        try {
            BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
            inputLine = is.readLine();
            if(inputLine.length() == 0) {
                return null;
            }
        } catch(IOException e) {
            System.out.println("IOException: " + e);
        }
        return inputLine;
    }
}

class DotGame {
    private int PlayerGuess;
    private int NumberOfGuesses = 0;
    private int[] SelectedNumbers;
    private int NumberOfHits = 0;

    public void setPlayerGuess(String PlayerGuess1) {
        int PlayerGuess2 = Integer.parseInt(PlayerGuess1);
        if(PlayerGuess2 < 8) {
            PlayerGuess = PlayerGuess2;
        } else {
            System.out.println("enter number smaller than 8 ");
        }
    }

    public int getPlayerGuess() {
        return PlayerGuess;
    }

    public void setSelectedNumbers(int[] selected) {
        int totalArrayValue = selected[0] + selected[1] + selected[2];
        if(totalArrayValue < 21) {
            SelectedNumbers = selected;
        } else {
            System.out.println("values in array are more than they should be ");
        }
    }

    public String checkPlayerResult() {
        boolean big = true;
        NumberOfGuesses++;
        String result = "miss";

        for(int number : SelectedNumbers) {
            if(PlayerGuess == number) {
                result = "hit";
                NumberOfHits++;
                break;
            }
        }
        if(NumberOfHits == SelectedNumbers.length) {
            result = "killed";
        }
        System.out.println(result);
        return result;
    }

    public void GameScore() {
        int Score = NumberOfHits * 100 / NumberOfGuesses;

        System.out.println("Number of hits " + NumberOfHits);
        System.out.println("Number of guesses " + NumberOfGuesses);
        System.out.println("you scored " + Score);
    }
}

public class DotGameTester2 {
    public static void main(String[] args) {
        GameHelper helper = new GameHelper();
        int random = (int) (Math.random() * 7);
        int random1 = (int) (Math.random() * 7);
        int random2 = (int) (Math.random() * 7);

        DotGame game = new DotGame();
        int[] selectnumb = { random, random1, random2 };
        boolean isAlive = true;
        int numOfGuesses = 0;
        int test = 0;
        game.setSelectedNumbers(selectnumb);
        while(isAlive == true) {
            do {
                String guess = helper.getUserInput("enter a number ");
                game.setPlayerGuess(guess);
                test = game.getPlayerGuess();
            } while(test > 8);
            String result1 = game.checkPlayerResult();
            numOfGuesses++;
            if(result1 == "killed") {
                isAlive = false;
            }
        }
        System.out.println("you took " + numOfGuesses + " to guess");
        game.GameScore();
    }
}
import java.io.*;
导入java.util.*;
导入java.lang.*;
类游戏助手{
公共字符串getUserInput(字符串提示){
字符串inputLine=null;
系统输出打印(提示+“”);
试一试{
BufferedReader is=新的BufferedReader(新的InputStreamReader(System.in));
inputLine=is.readLine();
如果(inputLine.length()==0){
返回null;
}
}捕获(IOE异常){
System.out.println(“IOException:+e”);
}
返回输入线;
}
}
类网络游戏{
私人int PlayerGuess;
私有int NumberOfGuesses=0;
私有int[]选择的数字;
私有int NumberOfHits=0;
public void setPlayerGuess(字符串PlayerGuess1){
int PlayerGuess2=Integer.parseInt(PlayerGuess1);
如果(PlayerGuess2<8){
PlayerGuess=PlayerGuess2;
}否则{
System.out.println(“输入小于8的数字”);
}
}
public int getPlayerGuess(){
返回PlayerGuess;
}
公共无效设置所选编号(int[]已选){
int totalArrayValue=选定的[0]+选定的[1]+选定的[2];
if(总阵列值<21){
SelectedNumbers=已选择;
}否则{
System.out.println(“数组中的值超出了应有的值”);
}
}
公共字符串checkPlayerResult(){
布尔大=真;
NumberOfGuesses++;
字符串result=“miss”;
对于(整数编号:SelectedNumber){
如果(PlayerGuess==数字){
结果=“命中”;
NumberOfHits++;
打破
}
}
if(NumberOfHits==SelectedNumbers.length){
结果=“死亡”;
}
系统输出打印项次(结果);
返回结果;
}
公开作废游戏分数(){
int分数=NumberOfHits*100/NumberOfGuesses;
System.out.println(“点击次数”+点击次数);
System.out.println(“猜测次数”+猜测次数);
System.out.println(“你得分”+得分);
}
}
公共类DotGameTester2{
公共静态void main(字符串[]args){
GameHelper helper=新GameHelper();
int random=(int)(Math.random()*7);
int random1=(int)(Math.random()*7);
int random2=(int)(Math.random()*7);
DotGame=新的DotGame();
int[]selectnumb={random,random1,random2};
布尔值=真;
int numOfGuesses=0;
int检验=0;
游戏。设置所选号码(选择Numb);
while(isAlive==true){
做{
字符串guess=helper.getUserInput(“输入一个数字”);
game.setPlayerGuess(猜测);
test=game.getPlayerGuess();
}而(试验>8);
String result1=game.checkPlayerResult();
numOfGuesses++;
如果(结果1==“终止”){
isAlive=假;
}
}
System.out.println(“您使用“+numfoguesses+”进行猜测”);
game.GameScore();
}
}
应该是

while(test >= 8)
此外,当您插入一个大于7的数字时,您仍然会将先前插入的数字返回到
test
,因此您检查的数字是错误的

要解决此问题,我将编辑以下内容:

PlayerGuess = PlayerGuess2;

if (PlayerGuess2 < 8) { 
    System.out.println("enter number smaller than 8 ");
}
do {
    game.resetGuess();
    String guess = helper.getUserInput("enter a number ");
    game.setPlayerGuess(guess);
    test = game.getPlayerGuess();
} while (test >= 8);

并在
resetGuess()中实现
PlayerGuess=8
您的错误:如果用户的猜测大于7,则
game.setPlayerGuess
不会设置数字,因为方法中存在“如果”。然后,调用
game.getPlayerGuess()
,基本上得到了之前输入的有效数字


如前所述-无论如何,这是一个糟糕的设计

如果您输入
11
作为猜测,会发生以下情况:

String guess = helper.getUserInput("enter a number "); // guess == 11
game.setPlayerGuess(guess /* 11 */);
钻入
setPlayerGuess

if(PlayerGuess2 < 8) {                                  // False, since 11 > 8
    PlayerGuess = PlayerGuess2;                         // skip
} else {                                                // True
    System.out.println("enter number smaller than 8 "); // This line gets executed
}
这只返回
PlayerGuess
,即
0

现在,您在
while
循环中运行此操作,该循环在
test>8
时执行,但现在,
test
0
,因此循环终止

修复方法是将
setPlayerGuess
更改为该值,因此每次输入数字时都设置猜测:

public void setPlayerGuess(String PlayerGuess1) {
    int PlayerGuess2 = Integer.parseInt(PlayerGuess1);
    PlayerGuess = PlayerGuess2;
    if(PlayerGuess2 >= 8) {
        System.out.println("enter number smaller than 8 ");
    }
}

现在,当您输入一个大于
7
的数字时,系统会再次提示您。

到底什么不起作用?此外,请格式化代码以使其更可读。
if(result1==“killed”)
。不要使用
==
比较字符串。使用
equals()
。这真是糟糕的设计。您需要保护您的数据并将其保存在适当的位置。例如,您有
numOfGuesses
NumberOfGuesses
这两个选项,它们都独立跟踪猜测的数量(我可能会添加错误)。而且从来没有使用过
NumberOfGuesses
。这当然是正确的,但它并没有修复所讨论的bug。@DesertIvy,因为这个问题涉及多个bug。不管怎样,我更新了我的答案。有人对这个答案投了否决票,没有评论为什么。有趣的是,被接受的答案和这个答案完全一样!
test = game.getPlayerGuess();
public void setPlayerGuess(String PlayerGuess1) {
    int PlayerGuess2 = Integer.parseInt(PlayerGuess1);
    PlayerGuess = PlayerGuess2;
    if(PlayerGuess2 >= 8) {
        System.out.println("enter number smaller than 8 ");
    }
}