程序忽略 "If Else" 并打印所有内容

Program ignoring "If Else" and printing everything

我正在尝试创建一个随机数生成器程序来跟踪玩家的赢、输、获胜百分比和总奖金。该程序的逻辑是玩家每次会话获得 3 次机会,计算机生成一个随机数,玩家需要猜测或应该匹配该随机数。

我尝试使用 if & else 语句来告诉用户他是否需要在 3 个允许的猜测范围内猜测更大或更小的数字。发生的事情是它完全忽略条件并一次打印所有三个机会并结束游戏。

如有任何意见,我们将不胜感激。

游戏Class:

import java.util.Scanner;

public class Game {

    Player player;
    LuckyNumberGenerator lng;

    public Game() {
        player = new Player();
        lng = new LuckyNumberGenerator();
    }

    public void eventLoop() {
        Scanner scanner = new Scanner(System.in);
        int choice = 0;
        boolean exit = false;
        while (!exit) {
            System.out.println("Welcome to the Guessing Game");
            System.out.println("==============================");
            System.out.println("(1) Set Up New Player");
            System.out.println("(2) Play One Round");
            System.out.println("(3) Player Win Statistics");
            System.out.println("(4) Display Game Help");
            System.out.println("(5) Exit Game");
            System.out.println("Choose an option: ");

            try {
                choice = Integer.parseInt(scanner.nextLine());
                if (choice < 1 || choice > 5) {
                    System.err.println("Error : Choose an option between 1 and 5");
                    choice = 0;
                }
            } catch (NumberFormatException e) {
                System.err.println("Error : Choose an option between 1 and 5");
                choice = 0;
            }

            switch (choice) {
                case 1:
                    createNewPlayer(scanner);
                    break;
                case 2:
                    guessNumber(scanner);
                    break;
                case 3:
                    printStatistics();
                    break;
                case 4:
                    printHelp();
                    break;
                case 5:
                    exit = true;
            }
        }
        scanner.close();
    }

    public void printHelp() {
        System.out.println(" ");
    }

    public void printStatistics() {
        try {
            if (player.getName() == null || player.getName().trim().length() < 1) {
                System.out.println("Player has not been set up!");
            } else {
                System.out.println("Player statistics are: ");
                System.out.println("Name: " + player.getName());
                System.out.println("Wins: " + player.getGamesWon());
                System.out.println("Losses: " + player.getGamesLost());
                System.out.println("Amount won so far: " + player.getTotalWinnings());
                System.out.println("Winnings percentage : "
                        + (((player.getGamesWon()) / (player.getGamesWon() + player.getGamesLost())) * 100));
            }
        } catch (ArithmeticException ae) {
            System.out.println("wins and loss both are 0: divide by zero exception");
        }
    }

    public void guessNumber(Scanner scanner) {
        int compGuess = lng.generate();
        int userGuess = 0;
        int numAttempts = 0;
        int cnum = lng.generateConsole();
        do {
            try {
                System.out.println("Guess a number between 1-100: ");
                userGuess = Integer.parseInt(scanner.nextLine());
                if (userGuess < 1 || userGuess > 100) {
                    System.err.println("Error : your Guess must be between 1-100");
                }
            } catch (Exception e) {
                System.err.println("Error : your Guess must be between 1-100");
            }
        } while (userGuess < 1 && userGuess > 100);
        do {
            if (userGuess > compGuess) {
                System.out.println("Your Guess is: " + userGuess + "and the random number: " + compGuess);
                System.out.println("Sorry, you need to go LOWER  :");
            } else if (userGuess < compGuess) {
                System.out.println("Your Guess is: " + userGuess + "and the random number: " + compGuess);
                System.out.println("Sorry, you need to go HIGHER  :");
            }
            numAttempts++;

            if (userGuess == compGuess) {
                System.out.println("Lucky Number was : " + compGuess + "your  guess was : " + userGuess);
                System.out.println("Congratulations you won " + 10 + "$");
                player.setGamesWon(1);
                player.setTotalWinnings(10);
            }

            if (userGuess != compGuess && (userGuess <= (compGuess + 5)) && (userGuess >= (compGuess - 5))) {
                System.out.println("Lucky Number was : " + compGuess + "your FINAL guess was : " + userGuess);
                System.out.println("Congratulations you won " + cnum + "$");
                player.setTotalWinnings(5);
            } else if (userGuess != compGuess) {
                System.out.println("Lucky Number was : " + compGuess + "your  guess was : " + userGuess);
                System.out.println("Sorry better Luck Next time");
                player.setGamesLost(1);
                player.setTotalWinnings(-1);
            }
        } while (userGuess != compGuess && numAttempts < 3);
    }

    public void createNewPlayer(Scanner scanner) {
        String name = null;
        do {
            try {
                System.out.println("Enter the name of the player: ");
                name = scanner.nextLine();
                if (name.isEmpty()) {
                    System.err.println("Name cannot be empty");
                }
            } catch (Exception e) {}
        } while (name.isEmpty());
        this.player = new Player(name);
    }

    public static void main() {
        Game game = new Game();
        game.eventLoop();
    }

}
while(userGuess < 1 && userGuess > 100);
        do{

这包含错误。循环应该 运行 而 userGuess 在 1 到 100 之间,你已经排除了它。

应该是

while(userGuess >= 1 && userGuess <= 100);
        do{

尝试将第一个 do-while 放在第二个 do-while 的顶部。

do {
        try {
            System.out.println("Guess a number between 1-100: ");
            userGuess = Integer.parseInt(scanner.nextLine());
            if (userGuess < 1 || userGuess > 100) {
                System.err.println("Error : your Guess must be between 1-100");
            }
        } catch (Exception e) {
            System.err.println("Error : your Guess must be between 1-100");
        } 
    } while(userGuess < 1 && userGuess > 100);//incorrect

//correct condition -> while(userGuess < 1 || userGuess > 100); 

一个数字不能同时小于1和大于100。

编辑 1:在您的第二个循环中,以下两个条件

1) if (userGuess != compGuess && (userGuess <= (compGuess + 5))
            && (userGuess >= (compGuess - 5))) 

2)else if (userGuess != compGuess)

只有当玩家的猜测次数超过尝试次数时才应该被评估,因此这两个 if 条件应该写在循环之外。

您还需要第一个 while 循环来保持用户输入在 1-100 之间有效,您的第二个 while 循环将在其中。

最终代码如下所示。

    do {

        do {
            try {
                System.out.println("Guess a number between 1-100: ");
                userGuess = Integer.parseInt(sc.nextLine());
                if (userGuess < 1 || userGuess > 100) {
                    System.err
                            .println("Error : your Guess must be between 1-100");
                }
            } catch (Exception e) {
                System.err
                        .println("Error : your Guess must be between 1-100");
            }
        } while (userGuess < 1 || userGuess > 100);

        System.out.println(" " + userGuess);

        if (userGuess > compGuess) {
            System.out.println("Your Guess is: " + userGuess
                    + "and the random number: " + compGuess);
            System.out.println("Sorry, you need to go LOWER  :");

        }
        if (userGuess < compGuess) {
            System.out.println("Your Guess is: " + userGuess
                    + "and the random number: " + compGuess);
            System.out.println("Sorry, you need to go HIGHER  :");
            System.out.println("if 1");
        }
        numAttempts++;

        if (userGuess == compGuess) {
            System.out.println("Lucky Number was : " + compGuess
                    + "your  guess was : " + userGuess);
            System.out.println("Congratulations you won " + 10 + "$");
            // player.setGamesWon(1);
            // player.setTotalWinnings(10);

        }

    } while (userGuess != compGuess & numAttempts < 3);

    if (userGuess != compGuess && (userGuess <= (compGuess + 5))
            || (userGuess >= (compGuess - 5))) {
        System.out.println("Lucky Number was : " + compGuess
                + " your FINAL guess was : " + userGuess);
        // System.out.println("Congratulations you won " + cnum + "$");
        // player.setTotalWinnings(5);

    } else if (userGuess != compGuess) {
        System.out.println("Lucky Number was : " + compGuess
                + "your  guess was : " + userGuess);
        System.out.println("Sorry better Luck Next time");
        // player.setGamesLost(1);
        // player.setTotalWinnings(-1);

    }

}

A​​ND 条件需要更改为 OR 条件。因为你只想在用户输入小于 1 或大于 100 时循环。

while(userGuess < 1 && userGuess > 100);  ===> while(userGuess < 1 || userGuess > 100);

同样,另一个 A​​ND 需要更改为 OR.

// Issue with logic
if (userGuess != compGuess && (userGuess <= (compGuess + 5)) &&
               (userGuess >= (compGuess - 5))) {

// Corrected Code
if (userGuess != compGuess && (userGuess <= (compGuess + 5)) ||
               (userGuess >= (compGuess - 5))) {