возникли проблемы с Java для игрового моделирования - PullRequest
1 голос
/ 13 октября 2019

Пользователь вводит целочисленное значение для игроков, начинающих банкролл. Пользователь вводит целочисленное значение для игроков желаемый банкролл - если банкролл игрока достигает этого значения, он выходит из игры. Пользователь вводит целочисленное значение для количества выполняемых испытаний - каждое испытание будет состоять из достаточного количества игр. либо уменьшить банкролл игроков до нуля, либо увеличить его до желаемого банкролла. Объявить целочисленную переменную (установить в ноль) для отслеживания количества выигрышей. Решение, очевидно, будет состоять из вложенных циклических структур и структур выбора First (внешний цикл) выполнит цикл для выполнения необходимого количества попыток. Установите денежные средства равными ставке Second (внутренний цикл) будет имитировать результаты одной карточной игры. Этот цикл будет повторяться до тех пор, пока денежные средства больше нуля и меньше требуемого банкролла. Предположим, что у игрока есть шанс выиграть игру менее чем на 50%. Используйте генератор случайных чисел, чтобы определить, выиграл ли игрок в игру. Если игрок выигралдобавьте 1,00 долл. США к его денежным средствам. В противном случае вычтите 1,00 долл. США из его денежных средств. В конце внутреннего цикла (запускается одна игра) - если денежная сумма равна желаемому банкроллу игроков, то приращение выигрывает на единицу. После завершения внешнего цикла выведите:на экране отображается количество побед из числа испытаний и процент выигранных игр.

пытается получить игровой симулятор для подсчета количества выигранных игр после того, как общая начальная сумма достигает конечной суммы. отчасти это работает, но не от всего, тогда это следует делать x раз. https://github.com/samuelatlas/gamesimulation/tree/master '' '// демонстрация цикла Java for

import java.util.Scanner; // import a scanner c
import java.security.SecureRandom;  // imports a secure random class

class newLoopTest1
{
    public static void main(String[] args)
    {
        // OUTER -------LOOP
        Scanner input = new Scanner(System.in);

        System.out.print("Enter the start bankroll  ");
        int startBankRoll = input.nextInt();
        //int desiredBankRoll = 5;

        System.out.print("Enter the desired bankroll  ");
        int desiredBankRoll = input.nextInt();

        System.out.print("Enter the number of trials  ");
        int numberTrials = input.nextInt();

        //int startBankRoll = 2;
        int i = 1;
        int current = startBankRoll;
        int wins = 0;

        //int numberTrials = 0;
        //OUTER----LOOP
        while(i <= numberTrials)
        //while(numberTrials <= 4)
        {


            i++;
            int innerloop = 0;
            System.out.println("printing from outer");

            //INNER----LOOP
            while((startBankRoll < desiredBankRoll) && (startBankRoll > 0))
            {
                SecureRandom randomNumber = new SecureRandom();
                int number = randomNumber.nextInt(101);
                System.out.println("Before hand start amount of " + 
startBankRoll + " end amount of " + desiredBankRoll);
                System.out.println("Rolled " + number);
                if( number <= 50)
                {
                    System.out.println("lost");
                    startBankRoll--;
                    System.out.println("After hand start amount of " + 
startBankRoll + " end amount of " + desiredBankRoll);
                }
                else
                {
                    System.out.println("won");
                    startBankRoll++;
                    System.out.println("After hand start amount of " + 
startBankRoll + " end amount of " + desiredBankRoll);
                }




                System.out.println(" Outerloop ran " + numberTrials + " 
Innerloop ran " + innerloop);
                innerloop++;


                //INNER----LOOP
            }

            //OUTER----LOOP
            numberTrials += 1;
            //wins++;
            System.out.println("Current" + current);
            if(startBankRoll == desiredBankRoll)
            {
                wins += 1;
                startBankRoll = current;
                System.out.println("wins" + wins);

            }
            else
            {
                startBankRoll = current;
                System.out.println(" lost all cash");
            }


            //OUTER----LOOP
        }
        int totalWins = (wins/(numberTrials-1));
        System.out.println("Won " + wins + " out of " + (numberTrials-1));
        //System.out.println("total percent" + wins/totalWins );
    }
}

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Основная проблема в вашем коде, похоже, заключается в понимании проблемы. Я посмотрел на страницу Github, на которую вы ссылались (я заметил, что ваше назначение должно быть завтра - пожалуйста, не ждите до последней минуты, чтобы попросить о помощи в будущем, и всегда сначала спрашивайте учителя, а не незнакомца о переполнении стека)). Давайте разберем назначение правильно.

Игрок начинает с денег (в вашем случае, 2 единицы), поэтому мы знаем, как инициализировать startCash, что вы сделали правильно

ЕгоЦель состоит в том, чтобы добраться до 10 юнитов или перебрать, чтобы мы знали верхний и нижний пределы, определяющие параметры его участия в игре. Другими словами, он играет только тогда, когда у него> 0 и <10 единиц. Внешняя петля, проверяющая, достаточно ли у него денег, бессмысленна. </p>

Хотя эти условия выполняются, он играет в игру с переворачиванием монет, где 50 или меньше - это проигрыш одной единицы, а 51 или больше - выигрыш. одной единицы. Каждый раз, когда он подбрасывает, мы увеличиваем счетчик, чтобы знать, сколько монет он подбросил, чтобы получить либо 0, либо 10.

Обратите внимание, как я перефразировал вопрос: «Наличные> 0 и наличные <10,флип монета. Если сальто <50, проигрыш игрока, иначе победа. Счетчик приращений. Это все, что нужно сделать, все в одном цикле. </p>

Вы запутали себя, добавив внешний цикл, который вам совсем не нужен - может быть, вы положили его туда, чтобы продолжать переворачивать, пока у игрока есть деньги,но это избыточно, потому что ваш do...while проверяет нижний и верхний пределы того, следует ли играть в игру. Этот внешний цикл также выполняется 5 раз, но что, если для разорения или получения 10 потребуется более 5 попыток?

Я упростил здесь код, в основном переставив то, что у вас уже было. Сравните то, что у вас есть, с тем, что у меня есть, и вы увидите, что я более или менее просто отбросил бесполезную внешнюю петлю. Запустите код несколько раз, и вы увидите, что у вас уже была более или менее правильная логика, прежде чем вы застрелились в ноге.

import java.security.SecureRandom;

public class Homework
{
  public static void main(String[] args)
  {
    int startCash = 2;
    int endCash = 10;
    int currentCash = startCash;
    int counter = 0;

    while(currentCash > 0 && currentCash < endCash)
    {
      SecureRandom randomNumber = new SecureRandom();
      int number = randomNumber.nextInt(101);

      if(number <= 50)
      {
        // lost
        currentCash--;
      }
      else
      {
        // won
        currentCash++;
      }

      counter++;
    }

    System.out.println("Current Cash: " + currentCash);
    System.out.println("Trials: " + counter);

  }
}

Единственное «важное» изменение, кроме удаления лишнего цикламеняет ваш do...while в while цикл. Разница в том, что do...while всегда будет запускаться хотя бы один раз, потому что условие выхода не проверяется до тех пор, пока не будет запущен блок кода, что кажется неправильным, потому что, если startCash уже равен 0 или 10? Цикл while проверяет условие перед запуском блока кода, поэтому, если игрок не может играть (слишком много или слишком мало денег), он не играет.

0 голосов
/ 14 октября 2019

ну, я понял, все это заняло некоторое время и много версий. вот окончательный код. большая часть предыдущего кода заключалась в том, чтобы увидеть, где номера, где собираются. {import java.util.Scanner;// импортируем класс сканера. import java.security.SecureRandom;// импортируем безопасный случайный класс.

class TheGambler

    public static void main(String[] args)
    {
        // OUTER -------LOOP AREA
        // create scanner for object.
        Scanner input = new Scanner(System.in);

        //prompt users for the starting bankroll amount.
        System.out.print("Enter the start bankroll  ");
        int startBankRoll = input.nextInt();

        //prompt users for the desired bank roll amount.
        System.out.print("Enter the desired bankroll  ");
        int desiredBankRoll = input.nextInt();

        //prompt users for the number of tirals.
        System.out.print("Enter the number of trials  ");
        int aNumber = input.nextInt();

        //to reset the value after to inner loop has ran.
        int current = startBankRoll;

        // keep track of number of wins.
        int wins = 0;

        // keep track of numberTrials.
        int numberTrials = 1;

        //OUTER----LOOP AREA
        //condition for the outer while loop to continue.
        while(numberTrials <= aNumber)
        {

            // number of time inner loops executes.
            int innerloop = 0;

            //INNER----LOOP
            // condition for the inner while loop to continue.
            while((startBankRoll < desiredBankRoll) && (startBankRoll > 0))
            {
                //create a random number and assign it an integer named number.
                SecureRandom randomNumber = new SecureRandom();
                int number = randomNumber.nextInt(101);

                //condition to determine if player wins or a losses.
                if( number <= 50)
                {
                    // if losses subtract one from startamount.
                    startBankRoll--;

                }
                else
                {
                    // if wins adds one to startamount.
                    startBankRoll++;

                }
                // add one to the inner loop count.
                innerloop++;


                //INNER----LOOP AREA
            }

            //OUTER----LOOP AREA
            //add to the total number of trials ran
            numberTrials += 1;

            // condition to add one to wins if startamount is equal to desiredamount.
            if(startBankRoll == desiredBankRoll)
            {
                // adds one to the wins count and resets the startamount.
                wins += 1;
                startBankRoll = current;

            }
            else
            {
                //if startamount equals zero reset the startamount.
                startBankRoll = current;

            }

            //OUTER----LOOP AREA
        }

        // determine total number of games played.
        int total = (numberTrials-1);

        // converts the amount of wins to a percent.
        int percent = wins * 100 / total;

        //displays how many wins out of total amount of games played.
        System.out.println("Won " + wins + " out of " + total);

        //displayes the percent of games won.
        System.out.println(percent + "%");
    }
}
...