Java进行游戏模拟时遇到问题

时间:2019-10-13 19:25:09

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

用户输入赌徒开始存款的整数值 用户输入赌徒所需资金的整数值–如果赌徒的资金达到此值,他退出游戏 用户输入要执行的试验次数的整数值–每个试验将包含足够多的游戏,以将赌徒的资金减少到零或将其增加到所需的资金 声明一个整数变量(设置为零)以跟踪获胜次数 显然,该解决方案将由嵌套循环结构和选择结构组成 首先(外循环)将循环执行所需的试验次数 设定现金等于本金 第二(内循环)将模拟一个纸牌游戏的结果。只要现金大于零且小于所需资金,此循环就会重复 假设赌徒赢得游戏的机会少于50% 使用随机数生成器确定赌徒是否赢得了比赛 如果赌徒获胜,则在其现金上增加$ 1.00 否则,从他的现金中减去$ 1.00 在内循环结束时(运行一个游戏)- 如果现金价值等于赌徒所需的资金,则将获胜者增加一 外循环停止后,将尝试次数和获胜百分比中的获胜次数打印到屏幕上。

试图获得一个游戏模拟器来计算总起始金额达到结束金额后所赢得的游戏数量。它的一部分有效,但并非全部      那么它应该执行x次。 https://github.com/samuelatlas/gamesimulation/tree/master     '''     //演示Java for循环

select *
from (
    select 
        w.*,
        row_number() over(
            partition by 
                DATEADD(
                    DAY, 
                    - (DATEPART(dw, ModifiedDate) + @@DATEFIRST - 4) % 7, 
                    ModifiedDate
                ) 
            order by ModifiedDate desc
        ) rn
    from WarehouseUpdate w
) x
where rn = 1

2 个答案:

答案 0 :(得分:1)

您的代码的主要问题似乎在于理解问题。我查看了您链接的Github页面(我注意到您的作业明天就要交了-请不要等到最后一分钟以后再寻求帮助,请始终先问老师,而不是Stack Overflow上的一些陌生人)。让我们适当地分解作业。

玩家从现金(在您的情况下为2个单位)开始,所以我们知道如何初始化startCash,您已经正确完成了

他的目标是达到10个单位或半身,所以我们知道为他参加比赛定义参数的上限和下限。换句话说,他只有在拥有> 0和<10个单位的情况下才能玩。一个外部循环检查他是否有足够的现金是没有意义的。

在这些条件成立的情况下,他玩掷硬币游戏,其中50或更少的损失一个单位,而51或更多的损失赢得一个单位。他每次翻转,我们都会增加一个计数器,以便知道他进行了多少次硬币翻转以达到0或10。

注意我如何改写这个问题:当现金> 0且现金<10时,掷硬币。如果翻转<50,则玩家损失,否则获胜。增量计数器。这就是全部内容,一个循环。

您通过添加根本不需要的外循环来使自己感到困惑-也许您将它放在那里以在玩家有钱时继续翻转,但这是多余的,因为您的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循环会在运行代码块之前检查条件,因此,如果玩家没有资格玩游戏(现金过多或过少),那么他就不会玩。

答案 1 :(得分:0)

好吧,我想通了,花了一段时间和很多版本。这是最终代码。较早的代码大部分是查看数字往何处去。 {import java.util.Scanner; //导入扫描器类。 导入java.security.SecureRandom; //导入一个安全的随机类。

The The Gambler类

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