【问题标题】:having a problem with java for game simulation使用java进行游戏模拟有问题
【发布时间】:2020-02-10 12:03:50
【问题描述】:

用户为赌徒输入整数值开始资金 用户输入赌徒所需资金的整数值 - 如果赌徒的资金达到此值,他将退出游戏 用户输入要执行的试验次数的整数值 - 每个试验将包含足够的游戏,以将赌徒的资金减少到零或将其增加到所需的资金 声明一个整数变量(设置为零)以跟踪获胜次数 显然,解决方案将包括嵌套循环结构和选择结构 第一个(外循环)将循环执行所需的试验次数 设置现金等于股份 第二个(内循环)将模拟一张纸牌游戏的结果。只要现金大于零且小于所需资金,此循环就会重复 假设赌徒赢得比赛的机会小于 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 );
    }
}

【问题讨论】:

  • 从包含您的 while 语句的行的末尾删除分号 (;)。你还想具体一点。不要说“其中一些有效”。我们不知道你在说什么。 确切地说什么是有效的。同样,确切地说什么不起作用。
  • 内部工作。它需要一个随机数,如果数字小于 50,则从起始数量中取 1。如果它高于 50,它会在起始金额上加一。一旦起始金额等于结束金额或等于零,它应该向计数器加一。这就是有效的部分。我需要它将起始值重置为原始起始量并再次运行相同的模拟,直到它达到零或等于结束量。我有一个 gethub 的链接,其中包含所有程序规范。它在链接中。
  • 我确实删除了 ;但编译器告诉我内置它
  • 是的,抱歉,您使用的是 do...while,所以分号是合适的。明天早上我会看看你的代码。

标签: java loops for-loop if-statement while-loop


【解决方案1】:

您的代码的主要问题似乎在于对问题的理解。我看了看你链接的 Github 页面(我注意到你的作业明天到期——请不要等到最后一分钟才寻求帮助,总是先问老师,而不是 Stack Overflow 上的陌生人)。让我们正确地分解作业。

玩家一开始是现金(在你的例子中是 2 个单位),所以我们知道如何初始化 startCash,你已经正确完成了

他的目标是达到 10 个单位或半身像,因此我们知道定义他参与游戏的参数的上限和下限。换句话说,他只在拥有 > 0 且

虽然这些条件都成立,但他玩的是抛硬币游戏,其中 50 或更少是失去一个单位,51 或更多是一个单位的胜利。每次他翻转时,我们都会增加一个计数器,这样我们就知道他进行了多少次硬币翻转才能达到 0 或 10。

请注意我是如何改写问题的:当现金 > 0 且现金

你添加了一个你根本不需要的外循环让自己感到困惑——也许你把它放在那里是为了在玩家有钱的时候继续翻转,但这是多余的,因为你的 do...while 正在检查下部和上部游戏是否应该玩的限制。那个外循环也运行了 5 次,但是如果需要 5 次以上的试验才能破坏或获得 10 次呢?

我通过基本上重新排列您已有的内容来简化这里的代码。比较你所拥有的和我所拥有的,你会发现我或多或少只是剥离了无用的外循环。运行代码几次,你会发现在你开枪之前,你已经或多或少有了正确的逻辑。

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 循环在运行代码块之前检查条件,因此如果玩家没有资格玩(现金过多或过少),那么他就不会玩。

【讨论】:

  • 但是我仍然很难弄清楚一件事是计数器 int numberTrials = 0 在我的代码中,它每次外循环循环时都会添加一个,但是当它运行时,数字不会相加.我给它运行了 4 次,但最后当我打印它时。它总是还有一个。所以如果我说运行 4 次,它会告诉我它运行了 5
  • 好的。 Stack Overflow 以问答格式设置,这意味着一个问题得到一个答案。如果您需要更多,您应该单独发布其他问题。单击此问题左侧的复选标记表示您的原始问题已得到回答。
  • 为了节省一些时间,接受输入,使用java.util.Scanner。有很多关于如何在网上使用它的例子。然后,您将需要添加另一个计数器来跟踪胜利。在您执行startCash++ 的代码块中,添加wins++。要获得胜率,可以使用wins / counter,或者可能是(wins * 1.0) / counter,如果您想显示数字比例,请保存到float
  • 最后...看看我的代码,看看你的。您以值 1 开始 trials,但此时您甚至还没有运行过试用版。你应该这样做吗?当您从 0 开始试验时,您可能会发现您的代码神奇地工作,因为您已经完成了 0 次试验。
【解决方案2】:

我想通了只是花了一段时间和很多版本。这是最终代码。大多数早期的代码是查看数字的去向。 {导入 java.util.Scanner; // 导入一个扫描器类。 导入 java.security.SecureRandom; // 导入一个安全的随机类。

类赌徒

    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 + "%");
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2014-12-06
    • 2015-11-12
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多