Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何比较循环中的变量,java_Java_Loops_For Loop - Fatal编程技术网

如何比较循环中的变量,java

如何比较循环中的变量,java,java,loops,for-loop,Java,Loops,For Loop,我必须设计一个程序来模拟玩家掷三个骰子打几轮。每次掷骰子都会得到点数。我必须为每一轮掷骰子值,每个玩家的点数以及每一轮的获胜者(该轮得分最高的玩家,如果相同,则没有人) 我已经实现了积分计算器,但我不知道如何显示每一轮的获胜者。另外,我垂直显示输出,而它应该是水平的 我认为在游戏类中比较循环中的值可能有用。另外,我是java新手,如果有更好的解决方案,请提出修改代码的建议 这是我的程序显示的内容 第1轮-->玩家1:2 4 5分:11 第二轮-->玩家1:23 5分:10 第三轮-->玩家1:2

我必须设计一个程序来模拟玩家掷三个骰子打几轮。每次掷骰子都会得到点数。我必须为每一轮掷骰子值,每个玩家的点数以及每一轮的获胜者(该轮得分最高的玩家,如果相同,则没有人)

我已经实现了积分计算器,但我不知道如何显示每一轮的获胜者。另外,我垂直显示输出,而它应该是水平的

我认为在游戏类中比较循环中的值可能有用。另外,我是java新手,如果有更好的解决方案,请提出修改代码的建议

这是我的程序显示的内容

第1轮-->玩家1:2 4 5分:11

第二轮-->玩家1:23 5分:10

第三轮-->玩家1:2 4 6分:12

第四轮-->玩家1:4:34

第五轮-->玩家1:3 4 5分:52

第1轮-->玩家2:35分:33

第二轮-->玩家2:36:35

第三轮-->玩家2:23 4分:49

第四轮-->玩家2:1 3分:25

第5轮-->玩家2:1 2 4分:7

这就是它应该显示的内容

第1轮玩家1:13 3分:27玩家2:14 5分:10轮赢家为玩家1

第二轮玩家1:1 2 5分:8玩家2:1 3 6分:10轮赢家是玩家2

第三轮玩家1:14 4分:29名玩家2:45 6分:55分第二轮胜利者为玩家

第四轮玩家1:1 3 5分:9玩家2:1 5分:31轮赢家是玩家2

第5轮玩家1:36 6分:35玩家2:2 4分:28轮赢家是玩家1

总赢数:玩家1:2/玩家2:3

总分:玩家1:108/玩家2:134

每轮平均分:球员1:21.6/球员2:26.8

总积分的赢家是玩家2

主代码

    import java.util.Scanner;

public class Game {

  // ------------------- FIELDS ------------------------    
        // Create instance of Scanner class
        public static Scanner input = new Scanner(System.in);
        // variables
        public static ThreeDiceScorer thrdiesc;

        public static int diceArray [];

    // ------------------ METHODS ------------------------  
        public static void main(String[] args) {

        int rounds; // input by user
        int players;  // input by user

        System.out.print("Please input number of rounds (grater or equal than 0) --> ");
        rounds = input.nextInt();
        System.out.print("\n");

        System.out.print("Please input number of rounds (grater or equal than 0) --> ");
        players = input.nextInt();
        System.out.print("\n");

        for (int p = 0; p < players; p++) { //loop for players
        for (int r = 0; r < rounds; r++) {  // loop for number of rounds
        int diceArray [] = new int [3];
        for (int i = 0; i < diceArray.length; i++) { // loop for random Array 
        diceArray [i] = 1 + (int)(6 * Math.random());   
        }

        // Create new ThreeDice and calculator instances
        thrdiesc = new ThreeDiceScorer(diceArray [0], diceArray [1], diceArray [2]);


        //Calculate
        thrdiesc.getDie1();
        thrdiesc.getDie2();
        thrdiesc.getDie3();
        thrdiesc.threeSame();
        thrdiesc.runOfThree();
        thrdiesc.pair();
        thrdiesc.allDifferent();
        thrdiesc.calcTotalPoints();
        thrdiesc.printResult(p,r);

        }
        System.out.print("\n");
        }
    }//end Main Method  
}// end Class
溶胶
  • 切换玩家循环和回合循环
  • 在每一轮循环中保持一个最大值,并用最大值和玩家更新它
  • 稍微修改printresult以删除圆形
循环和最大值:

    for (int r = 0; r < rounds; r++) { // loop for number of rounds
        int max = 0;
        int max_p = 0;
        System.out.println("Round " + r + ": ");
        for (int p = 0; p < players; p++) { //loop for players
            int diceArray[] = new int[3];
            //...
            thrdiesc.printResult(p, r);
            if (thrdiesc.total > max) {
                max = thrdiesc.total;
                max_p = p;
            }
        }
        System.out.println("Winner is player " + (max_p + 1) + "\n");
    }
杂项
  • 正确缩进代码
  • 复印时要小心。(见提示)

在查看代码时,我有一种感觉,您可以通过创建一些简单的类(确切地说是五个或六个)来简化这一过程

首先,我会把一些部分分成几节课。我想到的两个主要类是一个简单的
Die
类,它只是一个不可变的
Die
,创建时将Die值设置为1到6之间的随机数。创建
Die
对象后,无法更改该对象。你的
ThreeDice
类很窄,实际上没有必要,因为作为3个
Die
对象的简单数组,三个骰子应该是
Player
对象(下一个类)的一部分,作为
Die
对象的数组,我们可以从低到高对骰子进行排序

“模具”类别的示例如下:

Public final class Die implements Comparable<Die>
{
  private int dieNumber;

  // default constructor  
  public Die()
  {
     RollDie();
  }

  public int GetDieNumber()
  {
    return dieNumber;
  }

  public int compareTo(Die otherDie)
  {
     return this.dieNumber - otherDie.dieNumber;
  }

  private void RollDie()
  {
    dieNumber = 1 + (int)(6 * Math.random());
  }
}
public final class GameUtils
{
  public static Player[] GetPlayerArray(int numOfPlayers, int numOfDice)
  {
    Player[] playerArray = new Player[numOfPlayers];
    for (int i = 0; i < numOfPlayers; i++)
    {
      Die[] diceArray = new Die[numOfDice];
      for (int j = 0; j < numOfDice; j++)
      {
        diceArray[j] = new Die();
      }
      Arrays.sort(diceArray);
      playerArray[i] = new Player("Player " + (i + 1), diceArray);
    }
    return playerArray;
  }

  public static int GetNumberOfPlayers(Scanner input)
  {
    return GetValidInteger("Please input number of players (greater than 0) --> ", input);
  }

  public static int GetNumberOfRounds(Scanner input)
  {
    return GetValidInteger("Please input number of rounds (greater than 0) --> ", input);
  }

  private static int GetValidInteger(String prompt, Scanner input)
  {
    boolean done = false;
    int validInt = -1;
    String userInput = "";
    while (!done)
    {
      System.out.print(prompt);
      userInput = input.nextLine();
      try
      {
        validInt = Integer.parseInt(userInput);
        done = true;
      }
      catch (NumberFormatException e)
      {
        System.out.println("Invalid Input: " + userInput + " Try again!");
      }
    }
    return validInt;
  }

  public static int GetPlayerOverallWins(String playerName, Round[] allRounds)
  {
    int totalWins = 0;
    for (int i = 0; i < allRounds.length; i++)
    {
      Round curRound = allRounds[i];
      String roundWinner = curRound.GetRoundWinnerName();
      if (playerName.equals(roundWinner))
      {
        totalWins++;
      }
    }
    return totalWins;
  }

  public static int GetTotalTies(Round[] allRounds)
  {
    int totalTies = 0;
    for (int i = 0; i < allRounds.length; i++)
    {
      Round curRound = allRounds[i];
      String roundWinner = curRound.GetRoundWinnerName();
      if (roundWinner.equals("Tie"))
      {
        totalTies++;
      }
    }
    return totalTies;
  }

  public static int GetPlayerOverallPoints(String player, Round[] allRounds)
  {
    int totalPoints = 0;
    for (int i = 0; i < allRounds.length; i++)
    {
      Round curRound = allRounds[i];
      for (int j = 0; j < curRound.GetPlayerArray().length; j++)
      {
        Player curPlayer = curRound.GetPlayerArray()[j];
        if (player.equals(curPlayer.GetPlayerName()))
        {
          totalPoints = totalPoints + curPlayer.GetOverallTotal();
          break;
        }
      }
    }
    return totalPoints;
  }

}
然后,由于您希望保留所有回合的总计,我想您可能需要一个
回合
类。该类将由一轮的
玩家
对象数组组成。还有一个回合数、所有玩家的回合总分、回合平均分和一个表示哪位玩家赢了回合的字符串

下面是一个圆形类示例

public class Player implements Comparable<Player>
{
  private String playerName;
  private Die[] diceArray;
  private int diceTotal = 0;
  private int extraPoints = 0;
  private int overallTotal = 0;
  private String extraPointsString = "";

  public Player(String inName, Die[] inDiceArray)
  {
    playerName = inName;
    diceArray = inDiceArray;
    SetDiceTotals();
  }

  public String GetPlayerName()
  {
    return playerName;
  }

  public int GetExtraPoints()
  {
    return extraPoints;
  }

  public int GetDiceTotal()
  {
    return diceTotal;
  }

  public int GetOverallTotal()
  {
    return overallTotal;
  }

  public String GetExtraPointsString()
  {
    return extraPointsString;
  }

  public Die[] GetDiceArray()
  {
    return diceArray;
  }

  public String toString()
  {
    String playerString = playerName + " Dice values: ";
    for (int i = 0; i < diceArray.length; i++)
    {
      if (i < (diceArray.length - 1))
        playerString = playerString + diceArray[i].GetDieNumber() + ", ";
      else
        playerString = playerString + diceArray[i].GetDieNumber();
    }
    playerString = playerString + " Total: " + GetDiceTotal();
    playerString = playerString + " - Special Points added: " + GetExtraPoints() + " for having " + GetExtraPointsString();
    return playerString + "  Total Points: " + GetOverallTotal();
  }

  public int compareTo(Player otherPlayer)
  {
    int thisTotal = this.GetDiceTotal() + this.GetExtraPoints();
    int otherTotal = otherPlayer.GetDiceTotal() + otherPlayer.GetExtraPoints();
    return otherTotal - thisTotal;
  }

  // private internal method to set dice totals, extra points and extra points string
  private void SetDiceTotals()
  {
    int total = 0;
    for (int i = 0; i < diceArray.length; i++)
    {
      total = total + diceArray[i].GetDieNumber();
    }
    diceTotal = total;

    if (is3OfAKind())
    {
      extraPoints = 60;
      extraPointsString = "Three of a Kind";
    }
    else
    {
      if (isPair())
      {
        extraPoints = 40;
        extraPointsString = "Pair";
      }
      else
      {
        if (isStraight())
        {
          extraPoints = 20;
          extraPointsString = "Straight";
        }
        else
        {
          extraPoints = 0;
          extraPointsString = "All die are different";
        }
      }
    }
    overallTotal = extraPoints + diceTotal;
  }

  private boolean is3OfAKind()
  {
    if (diceArray[0].GetDieNumber() == diceArray[1].GetDieNumber() &&
        diceArray[0].GetDieNumber() == diceArray[2].GetDieNumber())
      return true;
    return false;
  }

  private boolean isPair()
  {
    if (diceArray[0].GetDieNumber() == diceArray[1].GetDieNumber() ||
        diceArray[0].GetDieNumber() == diceArray[2].GetDieNumber() ||
        diceArray[1].GetDieNumber() == diceArray[2].GetDieNumber() )
      return true;
    return false;
  }
  // this method needs to have the diceArray sorted from low to high
  private boolean isStraight()
  {
    if (diceArray[1].GetDieNumber() == (diceArray[0].GetDieNumber() + 1) &&
        diceArray[2].GetDieNumber() == (diceArray[1].GetDieNumber() + 1) )
      return true;
    return false;
  }
}
public class Round
{
  private Player[] playerArray;
  private int roundNumber = 0;
  private int totalPointsForRound = 0;
  private double roundAveragePoints = 0;
  private String roundWinnerName = "";

  public Round(int inRoundNumber, Player[] inPlayerArray)
  {
    playerArray = inPlayerArray;
    roundNumber = inRoundNumber;
    totalPointsForRound = SetAllPointsForRound();
    roundAveragePoints = SetAveragePoints();
    roundWinnerName = SetRoundWinnerName();
  }

  public int GetTotalPointsForRound()
  {
    return totalPointsForRound;
  }

  public double GetAveragePointsForRound()
  {
    return roundAveragePoints;
  }

  public String GetRoundWinnerName()
  {
    return roundWinnerName;
  }

  public Player[] GetPlayerArray()
  {
    return playerArray;
  }

  public int GetRoundNumber()
  {
    return roundNumber;
  }

  private String SetRoundWinnerName()
  {
    // sort the array from high to low - if the first two total are equal then its a tie
    Player[] tempArray = playerArray;
    Arrays.sort(tempArray);
    if (tempArray[0].GetOverallTotal() == tempArray[1].GetOverallTotal())
      return "Tie";
    if (tempArray[0].GetOverallTotal() > tempArray[1].GetOverallTotal())
      return tempArray[0].GetPlayerName();
    return "Unknown Winner???";
  }

  private double SetAveragePoints()
  {
    double totalPoints = GetTotalPointsForRound();
    double average = totalPoints/playerArray.length;
    return Math.round(average*100.0)/100.0;
  }

  private int SetAllPointsForRound()
  {
    int allPoints = 0;
    for (int i = 0; i < playerArray.length; i++)
    {
      allPoints = allPoints + playerArray[i].GetOverallTotal();
    }
    return allPoints;
  }
}
然后是另外两个类,你可以把它们合并成一个类。一个是静态的
GameUtils
类,它帮助执行一些全局操作,如:
getplayerary
,此方法获取
Player
对象的数组。每个
玩家
对象将包含每个玩家掷出的3个骰子的数组。此骰子阵列将从低到高排序。这是一种为每一位玩家在每一轮中获得初始随机掷骰的方法。在这里,我们还可以
GetPlayerOverallWins
,在这里我们可以循环所有回合,合计每个玩家的胜利数。一个名为
getTotalies
的方法,用于从所有回合中获取领带总数。还有一种方法
GetPlayerOverallPoints
,用于从所有回合获得所有玩家的总积分。在这里,我还提示用户输入玩家数量和回合数,并进行检查以确保用户输入有效

GameUtils示例如下:

Public final class Die implements Comparable<Die>
{
  private int dieNumber;

  // default constructor  
  public Die()
  {
     RollDie();
  }

  public int GetDieNumber()
  {
    return dieNumber;
  }

  public int compareTo(Die otherDie)
  {
     return this.dieNumber - otherDie.dieNumber;
  }

  private void RollDie()
  {
    dieNumber = 1 + (int)(6 * Math.random());
  }
}
public final class GameUtils
{
  public static Player[] GetPlayerArray(int numOfPlayers, int numOfDice)
  {
    Player[] playerArray = new Player[numOfPlayers];
    for (int i = 0; i < numOfPlayers; i++)
    {
      Die[] diceArray = new Die[numOfDice];
      for (int j = 0; j < numOfDice; j++)
      {
        diceArray[j] = new Die();
      }
      Arrays.sort(diceArray);
      playerArray[i] = new Player("Player " + (i + 1), diceArray);
    }
    return playerArray;
  }

  public static int GetNumberOfPlayers(Scanner input)
  {
    return GetValidInteger("Please input number of players (greater than 0) --> ", input);
  }

  public static int GetNumberOfRounds(Scanner input)
  {
    return GetValidInteger("Please input number of rounds (greater than 0) --> ", input);
  }

  private static int GetValidInteger(String prompt, Scanner input)
  {
    boolean done = false;
    int validInt = -1;
    String userInput = "";
    while (!done)
    {
      System.out.print(prompt);
      userInput = input.nextLine();
      try
      {
        validInt = Integer.parseInt(userInput);
        done = true;
      }
      catch (NumberFormatException e)
      {
        System.out.println("Invalid Input: " + userInput + " Try again!");
      }
    }
    return validInt;
  }

  public static int GetPlayerOverallWins(String playerName, Round[] allRounds)
  {
    int totalWins = 0;
    for (int i = 0; i < allRounds.length; i++)
    {
      Round curRound = allRounds[i];
      String roundWinner = curRound.GetRoundWinnerName();
      if (playerName.equals(roundWinner))
      {
        totalWins++;
      }
    }
    return totalWins;
  }

  public static int GetTotalTies(Round[] allRounds)
  {
    int totalTies = 0;
    for (int i = 0; i < allRounds.length; i++)
    {
      Round curRound = allRounds[i];
      String roundWinner = curRound.GetRoundWinnerName();
      if (roundWinner.equals("Tie"))
      {
        totalTies++;
      }
    }
    return totalTies;
  }

  public static int GetPlayerOverallPoints(String player, Round[] allRounds)
  {
    int totalPoints = 0;
    for (int i = 0; i < allRounds.length; i++)
    {
      Round curRound = allRounds[i];
      for (int j = 0; j < curRound.GetPlayerArray().length; j++)
      {
        Player curPlayer = curRound.GetPlayerArray()[j];
        if (player.equals(curPlayer.GetPlayerName()))
        {
          totalPoints = totalPoints + curPlayer.GetOverallTotal();
          break;
        }
      }
    }
    return totalPoints;
  }

}

希望这些能让事情变得容易些。祝你好运

谢谢您的帮助,很抱歉再次打扰您,但是我如何打印总获胜数、总得分、每轮平均得分和球员总冠军,我已经更新了示例。我需要你的帮助我检查输出,当两个值相等时,代码不起作用。实际上,当我运行它时,代码不起作用。。这应该足以让你知道什么是tondo NWXT不要从你的问题中删除大的(和重要的)块。
public class PlayerTotals implements Comparable<PlayerTotals>
{
  String playerName;
  int totalWins = 0;
  int totalPoints = 0;

  public PlayerTotals(String inPlayerName)
  {
    playerName = inPlayerName;
  }

  public int GetTotalPoints()
  {
    return totalPoints;
  }

  public void SetTotalPoints(int inPoints)
  {
    totalPoints = inPoints;
  }

  public int GetTotalWins()
  {
    return totalWins;
  }

  public void SetTotalWins(int inWins)
  {
    totalWins = inWins;
  }

  public int compareTo(PlayerTotals otherPlayerTotals)
  {
    int thisTotalPoints = this.GetTotalPoints();
    int otherTotalPoints = otherPlayerTotals.GetTotalPoints();
    return otherTotalPoints - thisTotalPoints;
  }

}
public final class GameUtils
{
  public static Player[] GetPlayerArray(int numOfPlayers, int numOfDice)
  {
    Player[] playerArray = new Player[numOfPlayers];
    for (int i = 0; i < numOfPlayers; i++)
    {
      Die[] diceArray = new Die[numOfDice];
      for (int j = 0; j < numOfDice; j++)
      {
        diceArray[j] = new Die();
      }
      Arrays.sort(diceArray);
      playerArray[i] = new Player("Player " + (i + 1), diceArray);
    }
    return playerArray;
  }

  public static int GetNumberOfPlayers(Scanner input)
  {
    return GetValidInteger("Please input number of players (greater than 0) --> ", input);
  }

  public static int GetNumberOfRounds(Scanner input)
  {
    return GetValidInteger("Please input number of rounds (greater than 0) --> ", input);
  }

  private static int GetValidInteger(String prompt, Scanner input)
  {
    boolean done = false;
    int validInt = -1;
    String userInput = "";
    while (!done)
    {
      System.out.print(prompt);
      userInput = input.nextLine();
      try
      {
        validInt = Integer.parseInt(userInput);
        done = true;
      }
      catch (NumberFormatException e)
      {
        System.out.println("Invalid Input: " + userInput + " Try again!");
      }
    }
    return validInt;
  }

  public static int GetPlayerOverallWins(String playerName, Round[] allRounds)
  {
    int totalWins = 0;
    for (int i = 0; i < allRounds.length; i++)
    {
      Round curRound = allRounds[i];
      String roundWinner = curRound.GetRoundWinnerName();
      if (playerName.equals(roundWinner))
      {
        totalWins++;
      }
    }
    return totalWins;
  }

  public static int GetTotalTies(Round[] allRounds)
  {
    int totalTies = 0;
    for (int i = 0; i < allRounds.length; i++)
    {
      Round curRound = allRounds[i];
      String roundWinner = curRound.GetRoundWinnerName();
      if (roundWinner.equals("Tie"))
      {
        totalTies++;
      }
    }
    return totalTies;
  }

  public static int GetPlayerOverallPoints(String player, Round[] allRounds)
  {
    int totalPoints = 0;
    for (int i = 0; i < allRounds.length; i++)
    {
      Round curRound = allRounds[i];
      for (int j = 0; j < curRound.GetPlayerArray().length; j++)
      {
        Player curPlayer = curRound.GetPlayerArray()[j];
        if (player.equals(curPlayer.GetPlayerName()))
        {
          totalPoints = totalPoints + curPlayer.GetOverallTotal();
          break;
        }
      }
    }
    return totalPoints;
  }

}
public class DiceGame
{
  public static Scanner input = new Scanner(System.in);

  static int numberOfPlayers;
  static int numberOfRounds;
  static int numberOfDice = 3;
  static Player[] playerArray;
  static Round[] allRounds;

  public static void main(String[] args)
  {
    numberOfPlayers = GameUtils.GetNumberOfPlayers(input);
    numberOfRounds = GameUtils.GetNumberOfRounds(input);

    System.out.println("");
    allRounds = new Round[numberOfRounds];
    // for each round - we want to create players with the proper number of random dice
    for (int i = 0; i < numberOfRounds; i++)
    {
      // get an array of players with random dice
      playerArray = GameUtils.GetPlayerArray(numberOfPlayers, numberOfDice);
      Round currentRound = new Round(i, playerArray);
      allRounds[i] = currentRound;
      // print the results of this round
      System.out.println("Round " + (i + 1) + " Results - Winner is: " + currentRound.GetRoundWinnerName()
      + " -- Average score for this round: " + currentRound.GetAveragePointsForRound());
      for (int j = 0; j < playerArray.length; j++)
      {
        System.out.println(playerArray[j].toString());
      }
      System.out.println("---------------------------------------");
    }

    // now get totals for all rounds
    // first create an array of PlayerTotals
    PlayerTotals[] allPlayersTotals = new PlayerTotals[numberOfPlayers];
    for (int i = 0; i < numberOfPlayers; i++)
    {
      PlayerTotals curPlayer = new PlayerTotals(playerArray[i].GetPlayerName());
      curPlayer.SetTotalPoints(GameUtils.GetPlayerOverallPoints(curPlayer.playerName, allRounds));
      curPlayer.SetTotalWins(GameUtils.GetPlayerOverallWins(curPlayer.playerName, allRounds));
      allPlayersTotals[i] = curPlayer;
    }

    // print the overall results
    System.out.println("");
    System.out.println(" -- Overall Results --");
    System.out.println("Ties: " + GameUtils.GetTotalTies(allRounds));
    Arrays.sort(allPlayersTotals);
    PlayerTotals curPlayer;

    for (int i = 0; i < allPlayersTotals.length; i++)
    {
      curPlayer = allPlayersTotals[i];
      System.out.println(curPlayer.playerName + " Won " + curPlayer.totalWins + " times - Total Points: " + curPlayer.totalPoints);
    }
  }
}