当前位置: 首页 > 知识库问答 >
问题:

使用java进行游戏模拟有问题

慕云
2023-03-14

用户输入赌徒开始资金的整数值用户输入赌徒期望资金的整数值-如果赌徒的资金达到这个值,他就退出游戏用户输入要执行的试验次数的整数值-每次试验将由足够的游戏组成,要么将赌徒资金减少到零,要么将其增加到期望的资金声明一个整数变量(设置为零)来跟踪解决方案的获胜次数,显然,将由嵌套循环结构和选择结构组成,第一个循环(外循环)将循环执行所需的试玩次数设置现金等于赌注第二个循环(内循环)将模拟一张牌游戏的结果。只要现金大于零且小于所需的资金,这个循环就会重复。假定赌徒在游戏中获胜的几率小于50%,则使用随机数生成器来确定赌徒是否赢了游戏。如果赌徒赢了,则使用随机数生成器来确定赌徒是否赢了游戏。如果赌徒赢了,则使用随机数生成器来确定赌徒是否赢了游戏,在他的现金中增加1.00美元,否则在内循环结束时从他的现金中减去1.00美元(运行一场游戏)--如果现金的价值等于赌徒所希望的资金,那么在外循环停止后将赢数增加一,打印到屏幕上的赢数从试玩次数和赢游戏的百分比。

试图获得一个游戏模拟器来统计在总开始金额达到结束金额后赢得的游戏数量。它的一部分工作,但不是全部工作,那么它应该做x次。https://github.com/samuelatlas/gamesimulation/tree/master''//演示Java html" target="_blank">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 );
    }
}

共有1个答案

乌和畅
2023-03-14

代码的主要问题似乎在于理解问题。我看了看你链接的Github页面(我注意到你的作业明天就要交了--以后请不要等到最后一刻才寻求帮助,总是先问老师,而不是问堆栈溢出的陌生人)。让我们把作业适当地分解一下。

播放机以现金开始(在您的情况下,2个单位),因此我们知道如何初始化startcash,您已经正确地完成了这一操作

他的目标是达到10个单位或胸围,所以我们知道定义他参与游戏的参数的上下限。换句话说,他只有在他拥有>0和<10个单位的时候才上场。外圈检查他是否有足够的现金是毫无意义的。

虽然这些条件都是真的,但他玩的是一个掷硬币游戏,50或更少是一个单位的损失,51或更多是一个单位的胜利。每次他掷硬币时,我们增加一个计数器,这样我们就知道他掷了多少次硬币,得到0或10。

注意我是如何重新表述这个问题的:当现金>0和现金<10时,抛硬币。如果翻转<50,玩家输,否则赢。增量计数器。这就是它的全部,全部在一个循环中。

您添加了一个完全不需要的外部循环,从而使自己感到困惑--也许您将它放在那里是为了在玩家有钱时继续翻转,但这是多余的,因为您的做了...而正在检查游戏是否应该进行的下限和上限。那个外循环也运行了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循环在运行代码块之前检查条件,因此如果玩家没有资格玩(现金太多或太少),那么他就不玩了。

 类似资料:
  • 该程序应模拟滚动两个骰子,并计算和。添加一个循环,使程序可以玩10,000个游戏。添加计数器,计算玩家赢了多少次,输了多少次。在10,000场比赛结束时,计算获胜的概率[即赢/(赢+输)]并输出该值。从长远来看,谁会赢得最多的比赛,你还是房子?注意:要生成一个随机数x,其中0x≤<1,使用x=math.random();例如,乘以6并转换为一个整数,结果是一个介于0和5之间的整数。

  • 包含在程序启动时启动的线程。这个线程包含一个循环,每40毫秒更新一次游戏并重新绘制()board。 备选办法B: 板创建一个摆动计时器。这个计时器的动作监听器是板本身。actionPerformed()方法每40毫秒运行一次,并更新game+repaints Board()。 谢谢

  • 我在Java中创建了一个小TicTacToe游戏,我想编写更有效的代码,我会制作一个for循环来创建9个按钮。 我现在面临的问题是如何测试按下哪个按钮以确定胜利者。我已经注释掉了我的旧测试代码,因为它不再工作。

  • 球门 我对机器学习相当陌生,经过一些在线教育后,这是我的第一个真正的项目。这是一个叫做Ouril的游戏,在这个游戏中,你和你的对手各有六个“房子”,里面有四块起始石头。你轮流玩一个房子和分配它的石头,这可能会让你获得对手的石头。你赢得了25块石头。 该项目的目标是拥有一个经过训练的函数,可以在给定当前游戏状态的情况下预测一个动作的好坏,以便机器人可以选择最好的预测动作并进行游戏。 安装程序 我构建

  • 本文向大家介绍java中使用数组进行模拟加密的方法,包括了java中使用数组进行模拟加密的方法的使用技巧和注意事项,需要的朋友参考一下 现假设某个公司采用公用电话来传递数据,数据是四位的整数,在传递过程中是加密的。 加密规则是每位数字都加上5,然后再用除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。 编写一个程序,用于接收一个四位的整数,并且打印输出加密后的数。 这道题原本没

  • 我需要创建一个方法来检查tictactoe游戏是否在玩、DRAW、XWIN或owin。然而,我很难编写代码来检查X或O是否获胜,因为游戏板的大小和获胜所需的大小(sizeWin)会根据用户的输入而改变。我被迫使用一维阵列的游戏板。我根本不知道从这里到哪里去。我最近的想法是使用嵌套的for循环来检查是否按行、列或对角线获得胜利,但我不确定如何实现它。如果有人对如何处理这个问题有任何提示,或者有任何其