Программа пропускает оператор if, а по умолчанию - else - PullRequest
0 голосов
/ 11 октября 2018

Я делаю задание для своего класса программирования, но что-то не так с моим кодом (снова), и я потратил последние полтора часа, пытаясь его отладить.Код представляет собой разновидность азартной игры, в которой пользователь вводит сумму ставки и выбирает высокий, низкий или семерки.максимум - когда бросок кубика 8 или выше, минимум - когда бросок кубика 6 или ниже, а семь - когда бросок кубика в общей сложности 7. Если бросок кубика семь, ставка умножается на 4 и присуждаетсяпользователь.В противном случае, когда пользователь «проигрывает», он теряет сумму, которую он поставил.Я не могу понять, что именно не так.

Начнем с того, что выигрыши не верны.Они отображаются в консоли как «Вы выиграли 128 долларов!»и затем, когда код повторяется, текущий пул всегда становится равным 132, даже если пользователь проиграл и деньги должны были быть вычтены.Кроме того, программа пропускает операторы if в методе defineWinnings - по умолчанию используется другой оператор, даже если пользователь должен был выиграть.Это должно произойти через 20 минут, и я не могу понять, как это исправить!Любая помощь искренне приветствуется!

package example;
import java.util.Scanner;

public class test
{

public static void main(String[] args)
{

    Scanner inScanner = new Scanner(System.in);
    int currentPool = 100; 
    int bet = ' ';
    char highLow = ' ';
    int roll = ' ';
    int winnings = ' ';

    System.out.println("You have " + currentPool + " dollars.");
    getBet(inScanner, currentPool);
    getHighLow(inScanner);
    determineWinnings(highLow, bet, roll);
    currentPool = currentPool + winnings;
    System.out.println("");

    while (bet != 0)
    {
        System.out.println("You have " + currentPool + " dollars.");
        getBet(inScanner, currentPool);
        getHighLow(inScanner);
        determineWinnings(highLow, bet, roll);
        currentPool = currentPool + winnings;
        System.out.println("");
    }


}



private static int getBet(Scanner inScanner, int currentPool)
{
    System.out.print("Enter an amount to bet (0 to quit): ");
    String strBet = inScanner.nextLine();
    int bet = Integer.parseInt(strBet);


    while (bet < 0 || bet > currentPool)
    {
        System.out.print("Your bet MUST be between 0 and " + currentPool + " dollars.");
        System.out.println("You have " + currentPool + " dollars.");
        System.out.print("Enter an amount to bet (0 to quit): ");
        strBet = (inScanner.nextLine());
        bet = Integer.parseInt(strBet);
    }

    if (bet == 0)
    {
        System.out.println("You have " + currentPool + " dollars.");
        System.out.println("Goodbye!");
        return bet;
    }
    else
    {
        return bet;
    }
}


private static char getHighLow(Scanner inScanner)
{
    System.out.print("High, Low, or Sevens (H/L/S): ");
    String hls = inScanner.nextLine();
    char highLow = ' ';

    if (hls.equals("H") || hls.equals("h"))
    {
        highLow = 'H';
    }
    else if (hls.equals("L") || hls.equals("l"))
    {
        highLow = 'L';
    }
    else if (hls.equals("S") || hls.equals("s"))
    {
        highLow = 'S';
    }
    else
    {
        System.out.print("ERROR: invalid character entered. Please try again.");

        while (!hls.equals("H") || !hls.equals("h") || !hls.equals("L") || !hls.equals("l") || !hls.equals("S") || !hls.equals("s"))
        {
            System.out.println("High, Low, or Sevens (H/L/S): ");
            hls = inScanner.nextLine();
        }
    }
    return highLow;
}   


private static int getRoll()
{
    int roll = (int)Math.floor(Math.random() * 6 + 1);
    return roll;
}


private static int determineWinnings(char highLow, int bet, int roll)
{
    int rollOne = getRoll();
    int rollTwo = getRoll();
    int total = rollOne + rollTwo;
    int winnings = bet + 0;
    System.out.println("Die 1 rolls: " + rollOne);
    System.out.println("Die 2 rolls: " + rollTwo);
    System.out.println("Total of two dice is: " + total);

    if (highLow == 'H')
    {
        if (total >= 8)
        {
            System.out.println("You won " + winnings + " dollars!");

        }
        else
        {
            System.out.println("You lost!");
            winnings = 0 - bet;

        }
    }
    else if (highLow == 'L')
    {
        if (total <= 6)
        {
            System.out.println("You won " + winnings + " dollars!");

        }
        else 
        {
            System.out.println("You lost!");
            winnings = (0 - bet);

        }
    }
    else
    {
        if (total == 7)
        {
            winnings = bet * 4;
            System.out.println("You won " + winnings + " dollars!");

        }
        else 
        {
            System.out.println("You lost!");
            winnings = 0 - bet;

        }
    }
    return winnings;
}

}

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Чтобы не пропускать при выполнении, используйте

bet = getBet(inScanner, currentPool); highLow = getHighLow(inScanner); winnings = determineWinnings(highLow, bet, roll);

вместо прямого вызова

getBet(inScanner, currentPool); getHighLow(inScanner); determineWinnings(highLow, bet, roll);

Reson для пропуска оператора if инеправильный ответ:

Метод getBet (inScanner, currentPool) возвращает значение, которое не присвоено

int bet = '';java пытается преобразовать '' в целое число, равное 32. поэтому при каждом вызове getBet (inScanner, currentPool) ставке каждый раз назначается значение 32, даже если введенное значение отличается (что даст неправильный ответ).

В случае метода getHighLow (inScanner) возвращает значение char, но поскольку он не назначен highLow, highLow всегда будет иметь значение ''.

, поскольку highLow не присвоил фактическое значение (H / L /S), если оператор будет пропущен как ''! = (H / L / S) и всегда выполняются операторы в else.

0 голосов
/ 11 октября 2018

Часть, которую вы не поняли, заключается в том, что каждый метод - фактически каждый вызов каждого метода - имеет свою собственную коллекцию локальных переменных.Это означает, что

  • переменная winnings, объявленная в main, НЕ является той же переменной, что и переменная winnings, объявленная в determineWinnings;
  • переменная betобъявленная в main НЕ является той же переменной, что и переменная bet, объявленная в getBet.

Вам нужно убедиться, что значение, возвращаемое каждым , вызываетсяМетод назначается переменной, в которой вы хотите сохранить его, в методе caller .Таким образом, в main, когда вы вызываете getBet, вы действительно хотите записать

bet = getBet(inScanner, currentPool);

, чтобы значение, возвращаемое из getBet, присваивалось переменной bet из main.Аналогичным образом, когда вы вызываете determineWinnings, вам нужно написать

winnings = determineWinnings(highLow, bet, roll);

, чтобы значение, возвращаемое из determineWinnings, было присвоено переменной winnings из main.

Если вы этого не сделаете, то все переменные в main просто сохранят свои исходные значения, которые 100 для currentPool и 32 для выигрышей (потому что ' ' - это просто еще один способ записи 32).Вот почему ваше окончательное значение оказывается 132.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...