【问题标题】:How to compare variables in a loop, java如何在循环中比较变量,java
【发布时间】:2016-12-16 19:49:24
【问题描述】:

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

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

我认为在游戏类中比较循环内的值可能会起作用。附:我是java新手,如果有更好的解决方案,请提出任何建议以更改代码。

这是我的程序正在显示的内容

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

第2轮-->玩家1:2 3 5分:10

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

第4轮-->玩家1:4 4 6分:34

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

.

第1轮-->玩家2:3 5 5分:33

第2轮-->玩家2:3 6 6分:35

第 3 轮--> 玩家 2:2 3 4 分:49

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

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

这是它应该显示的内容

第 1 回合玩家 1:1 3 3 分:27 玩家 2:1 4 5 分:10 回合获胜者是玩家 1

第 2 回合玩家 1:1 2 5 分:8 玩家 2:1 3 6 分:10 回合获胜者是玩家 2

第 3 轮玩家 1:1 4 4 分:29 玩家 2:4 5 6 分:55 回合获胜者是玩家 2

第 4 回合玩家 1:1 3 5 分:9 玩家 2:1 5 5 分:31 回合获胜者是玩家 2

第 5 回合玩家 1:3 6 6 分:35 玩家 2: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

ThreeDice 类

public class ThreeDice {
     // ---------------------- ATTRIBUTES ---------------------
     protected int die1;
     protected int die2;
     protected int die3;

     // ------------------ CONSTRUCTOR -------------------
     public ThreeDice(int s1, int s2, int s3) {
          // This puts the three dice values in ascending order.
          int tmp;
          if (s2 < s1) {
              tmp = s2;
              s2 = s1;
              s1 = tmp;
          }
          if (s3 < s2) {
              tmp = s3;
              s3 = s2;
              s2 = tmp;
          }
          if (s2 < s1) {
              tmp = s2;
              s2 = s1;
              s1 = tmp;
          }
          die1 = s1;
          die2 = s2;
          die3 = s3;
     }

     // --------------------- METHODS ---------------------
     // Accessor methods
     public int getDie1() {
          return die1;
     }
     public int getDie2() {
          return die2;
     }
     public int getDie3() {
          return die3;
     }
     public boolean threeSame() {
          return (die1 == die3);
     }
     public boolean runOfThree() {
          return (( (die1 + 1) == die2) && ( (die2 + 1) == die3));
     }
     public boolean pair() {
          return (((die1 == die2) || (die2 == die3)) && (die1 != die3));
     }
     public boolean allDifferent() {
          return (!runOfThree() && (die1 != die2) && (die2 != die3));
     }
     public void printResult() {
          if (threeSame())
              System.out.println("The roll is all the same.");
          else if (runOfThree())
              System.out.println("The roll is a run.");
          else if (pair())
              System.out.println("The roll is a pair.");
          else if (allDifferent())
              System.out.println("The roll is all different.");
    }

}

ThreeDiceScorer(计算器)类

public class ThreeDiceScorer extends ThreeDice {
    int total;
     public ThreeDiceScorer(int s1, int s2, int s3) {
         super(s1, s2, s3);
     }
public void calcTotalPoints() {
    int sumOfDice = die1 + die2 + die3;

          if (threeSame()){
              total= sumOfDice + 60;
          }
          else if (runOfThree()){
              total= sumOfDice + 40;
          }
          else if (pair()){
              total= sumOfDice + 20;
          }
          else if (allDifferent()){
            total= sumOfDice;
          }
    }

     public void printResult(int p,int r) {

              System.out.println("round "+ (r+1)+ "--> " + "player "+ (p+1) + "   "+ die1 + " " + die2 + " " + die3 + " " + "points: "+ total);

}
}

【问题讨论】:

  • 不要从你的问题中删除大的(和重要的)块。

标签: java loops for-loop


【解决方案1】:

溶胶

  • 切换播放器循环和回合循环。
  • 在每一轮循环中维护一个最大值并用最大值和玩家更新它。
  • 稍微修改 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");
    }

打印结果方法:

    public void printResult(int p, int r) {
        System.out.println("player " + (p + 1) + "   " + die1 + " " + die2 + " " + die3 + " " + "points: " + total);
    }

杂项

  • 正确缩进代码。
  • 复制时要小心。 (见提示)

【讨论】:

  • 感谢您的帮助,很抱歉再次打扰您,但是我如何打印总胜数、总积分数、每轮平均积分数、总玩家获胜者数,我已经更新了这个例子。我感谢你的帮助
  • 我检查输出,当两个值相等时代码不起作用
  • 当我运行它时它确实有效.. 这应该足以给你指明 tondo nwxt 的方向
【解决方案2】:

在查看您的代码时,我感觉您可以通过创建一些简单的类(确切地说是五个或六个)来让这一切变得更容易。

首先,我会将一些部分分解为类。我想到的两个主要类是一个简单的Die 类,它只是一个不可变的Die,它在创建时将骰子值设置为1 到6 之间的随机数。一旦创建Die 对象,它就不能改变了。您的 ThreeDice 类很窄,实际上是不必要的,因为三个骰子应该是 Player 对象(下一个类)的一部分,作为 3 个 Die 对象的简单数组和 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());
  }
}

下一个需要帮助的类是 Player 类。此类的重要部分将是玩家姓名,然后是 Die 对象数组(在您的情况下大小为 3)来保存玩家随机骰子。在这个类中,您还可以有方法来获取 3 个骰子的总值,以及一个方法/变量来获取用户在 3 个骰子相同的数字、如果有一对等情况下获得的额外分数。这里在创建骰子数组时,我们可以利用骰子数组从低到高的排序。这将使检查顺子更容易。

下面是一个 Player 类示例。

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;
  }
}

然后,由于您想保留所有轮次的总数,我认为您可能需要一个 Round 类。此类将包含一轮 Player 对象的数组。还有一个回合数、所有玩家在该回合中的总分、该回合的平均分和一个字符串,以指示哪个玩家赢得了该回合。

Round 类示例如下。

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;
  }
}

然后,由于您想保留所有玩家的总数,您可能需要创建一个小的 PlayerTotals 类。此类仅包含玩家姓名、所有回合的总获胜次数和所有回合的总分。请记住,这些是所有回合的总数,而不是单个回合的总数,因为 Round's playerArray 中的每个 Player 对象都将包含该特定回合的总数。

下面是一个 PlayerTotals 类示例

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;
  }

}

然后是另外两个类,您实际上可以将它们组合成一个类。一个是静态的GameUtils 类,它可以帮助做一些全局的事情,比如:GetPlayerArray,这个方法得到一个Player 对象的数组。每个Player 对象将包含每个玩家掷出的 3 个骰子的数组。这个骰子数组将从低到高排序。这是为每个玩家获得每轮初始随机掷骰的方法。同样在这里,我们可以GetPlayerOverallWins 循环遍历所有回合并计算每个玩家的获胜次数。一种称为GetTotalTies 的方法,用于获取所有回合的平局总数。还有一个方法GetPlayerOverallPoints 可以从所有回合中获得所有玩家的总分。同样在这里,我提示用户输入玩家人数和回合数,并检查以确保用户输入有效。

GameUtils 示例如下:

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;
  }

}

最后是一个DiceGame 类,其中包含一个将所有内容放在一起的主条目。骰子游戏类将包含全局变量numberOfPlayersnumberOfRoundsnumberOfDiceplayerArray 用于每一轮,然后是 Rounds 的数组,用于在所有轮运行后进行总计。下面的示例首先为轮数设置一个循环,在这个循环中,我们为他们创建所有玩家和骰子值,然后将轮信息保存到一个新的 Round 对象中,然后将每个新的 Round 对象放入一个数组中.然后将当前回合的结果输出给用户。一旦轮数循环结束,我们就应该有一个 Round 对象数组。这是PlayerTotals 类帮助的地方,因为我们可以为所有回合创建另一个PlayerTotals 对象数组。这使用了来自GameUtils 的一些方法,这些方法可以很好地放置在这个主类中。将所有回合的所有玩家总数相加后,将结果输出给用户。

主 DiceGame 类示例:

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);
    }
  }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多