2016-12-16 7 views
-6

私は、複数のラウンドで3つのサイコロをプレイするプレイヤーをシミュレートするプログラムを設計する必要があります。それぞれのダイススローにポイントが与えられます。私は各ラウンドについてサイコロの値とその値の各プレイヤーのポイント数と各ラウンドのの勝者を表示しなければなりません(そのラウンドのポイントが最も高いプレーヤー、 。ループ内の変数を比較する方法

私はポイント計算機を実装しましたが、各ラウンドの勝者を表示する方法はわかりません。また、水平になっていると出力を垂直に表示しています。

おそらく、ゲームクラス内のループ内の値を比較するとうまくいくと思います。 P.S.私はJavaで新しいです、良い解決策がある場合は、コードを変更するための提案をしてください。 2 4 5点:11

ラウンド2 - >プレーヤー1:>プレイヤー1 -

これは私のプログラムは

1ラウンド表示さWAHTある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点: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は勝者2プレーヤーです

ラウンド3プレーヤー1:1 4ポイント:29プレーヤー2:4 5 6ポイント:55ラウンド勝者はプレーヤーです2

ラウンド4プレーヤー1:1 3 5ポイント:9プレーヤー2:1 5ポイント: 3 6 6点:35プレイヤー2:2 2 4点:28ラウンドの勝者であるプレーヤの合計が勝つ1

:プレイヤー1:31ラウンドの勝者は、プレーヤ2

ラウンド5プレイヤー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); 

} 
} 
+0

質問から大きな(そして重要な)チャンクを削除しないでください。 – Tom

答えて

0

ソル

  • ループループとラウンドループを切り替えます。
  • 各ラウンドループでmaxを維持し、max valueとplayerで更新します。
  • printresultを少し修正してラウンドを削除してください。

ループとmax:

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

PrintResult方法:

  • インデントコードを適切

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

    その他。

  • コピー中は注意してください。
+0

私に助けてくれてありがとう、もう一度迷惑をかけて申し訳ありませんが、勝利の総数、合計得点、1ラウンドあたりの平均得点、そして全選手の勝者をどのように印刷することができますか?私はあなたの助けをapriciate –

+0

私はdobble出力をチェックし、両方の値が等しいときにコードが動作しません –

+0

それは私がそれを実行したときに作動しました..このshoulsはあなたにどのようなtondo nwxt – RE60K

0

あなたのコードを見ている間、正確な5つまたは6つの簡単なクラスを作成することで、これをもっと簡単にすることができると感じています。

まず、いくつかの部分をクラスに分割します。私が考えている2つの主なクラスは単純なDieクラスです。このクラスは作成されたときにダイ値を1から6までの乱数に設定する不変のDieです。Dieオブジェクトを作成すると変更できません。あなたのThreeDiceクラスは狭く、実際には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()); 
    } 
} 

支援するための次のクラスはプレーヤーのクラスになります。このクラスの重要な部分は、プレイヤーの名前、次にランダムなサイコロを保持する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オブジェクトの配列で構成されます。また、ラウンドナンバー、すべてのプレーヤーからのラウンドの合計ポイント、ラウンドのポイントの平均値、およびラウンドを獲得したプレーヤーを示す文字列。

ラウンドクラスの例を以下に示します。あなたはすべてのプレーヤーの合計を維持したいので、

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クラスを作成することもできます。このクラスは、プレイヤー名、すべてのラウンドの合計得点、すべてのラウンドの合計得点で構成されます。個々のラウンドではなく、PlayerオブジェクトがRound'splayerArrayの各ラウンドの合計を含むため、これらはすべてのラウンドの合計です。

A PlayerTotalsクラスの例では、実際には1つのクラスに組み合わせることができ

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

} 

次に、2つの以上のクラスを下回っています。静的なGameUtilsクラスは、GetPlayerArrayのようないくつかのグローバルな処理を行うのに役立ち、このメソッドはPlayerオブジェクトの配列を取得します。各Playerオブジェクトには、各プレイヤーがロールした3つのサイコロの配列が含まれます。このダイスの配列は、低から高にソートされます。これは、各ラウンドの各プレイヤーの最初のランダムロールを取得する方法です。また、ここで我々はすべてのラウンドをループすることができ、各プレイヤーが獲得した勝利数を合計することができるGetPlayerOverallWinsを行うことができます。すべてのラウンドからの総同数を得るには、GetTotalTiesというメソッド。そして、方法GetPlayerOverallPointsすべてのラウンドからすべての選手ポイントの合計を取得する。また、ここでは、ユーザーの入力が有効であることを確認するために、プレーヤーの数とラウンド数を入力するためのプロンプトを表示しました。

A 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クラスはすべて一緒にそれを置くために。ダイスゲームクラスはグローバル変数 numberOfPlayersで構成されます。 numberOfRounds,および playerArrayを各ラウンドに使用し、次に 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); 
    } 
    } 
} 

これらは物事が容易になります願っています。がんばろう!

関連する問題