2017-04-13 1 views
0

現在、プロジェクトを進めており、何か助けが必要です。まだ比較的新しいC#です。私は5人のサイコロが2人のプレイヤーの間で交互に転がっていくサイコロの試合を作りました。私が執着しているのは、これらの値を3種類の点でチェックし、ポイントを割り当てることです。たとえば、プレーヤーがEnterを押して3回表示し、3点を受け取るか、4が3回表示されたらプレーヤーはポイント。私はifステートメントとforループを使ってたくさんの異なるメソッドを試しましたが、うまくいきません。私のコードは下に提供されています。C#ダイスロール - 得点を値に割り当てる

おかげ

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Dice_v4 
{ 
class Game 
{ 
    static void Main(string[] args) 
    { 
     Random RandomNum = new Random(); 
     Player[] player1 = new Player[5]; 
     Die[] myDie = new Die[5]; 

     for (int i = 0; i < 5; i++) 
     { 
      myDie[i] = new Dice_v4.Die(RandomNum); 
      player1[i] = new Dice_v4.Player(); 

     } 

     for (int i = 0; i < 2; i++) // Number of players 
     { 
      Console.Write("Enter Name for Player {0}:", i + 1); 
      string NewName = Console.ReadLine(); 
      player1[i].SetName(NewName); 
     } 

     Console.WriteLine(); 

     for (int j = 1; j < 20; j++) 
     { 
      for (int i = 0; i < 2; i++) 
      { 
       myDie[i].roll(); 
       Console.WriteLine("{0} Rolled:{1} on the first dice", player1[i].GetName(), myDie[i].GetTopNumber()); 
       Console.WriteLine("{0} Rolled:{1} on the second dice", player1[i].GetName(), myDie[i].GetTopNumber1()); 
       Console.WriteLine("{0} Rolled:{1} on the third dice", player1[i].GetName(), myDie[i].GetTopNumber2()); 
       Console.WriteLine("{0} Rolled:{1} on the fourth dice", player1[i].GetName(), myDie[i].GetTopNumber3()); 
       Console.WriteLine("{0} Rolled:{1} on the fifth dice", player1[i].GetName(), myDie[i].GetTopNumber4()); 
       Console.WriteLine("Total Throws:{0}", j); 
       Console.ReadLine(); } 
     } 
    } 
} 

class Die 
{ 
    private int NumberTop1;     //attributes 
    private int NumberTop2; 
    private int NumberTop3; 
    private int NumberTop4; 
    private int NumberTop5; 
    int threepoints = 0; 

    private Random RandomNumGenerator; 

    public Die(Random RandomGenerator)  // constructor 
    { 
     RandomNumGenerator = RandomGenerator;  // initialises random number 
    } 

    public void roll() 
    { 
     NumberTop1 = RandomNumGenerator.Next(1, 6); 
     NumberTop2 = RandomNumGenerator.Next(1, 6); 
     NumberTop3 = RandomNumGenerator.Next(1, 6); 
     NumberTop4 = RandomNumGenerator.Next(1, 6); 
     NumberTop5 = RandomNumGenerator.Next(1, 6); 

     // generates random number// Number of dice to be rolled 

     Console.WriteLine("\tTotal score = {0}", threepoints); 

     } 
    public int GetTopNumber() 
    { 
     return NumberTop1;   // Returns number on top which equals dice roll 
    } 

    public int GetTopNumber1() 
    { 
     return NumberTop2;   
    } 

    public int GetTopNumber2() 
    { 
     return NumberTop3; 
    } 

    public int GetTopNumber3() 
    { 
     return NumberTop4; 
    } 

    public int GetTopNumber4() 
    { 
     return NumberTop5; 
    } 

} 

class Player 
{ 

    private string Name; 

    public void SetName(string NewName)   // constructor 
    { 
     Name = NewName;      // initalises name 
    } 

    public string GetName() 
    { 
     return Name;     // Returns name when called 

    } 
} 

} 
+0

によって、個々のロールにアクセスすることができます方法は何のように働くのですか?あなたの質問にそれを含めてください! –

+0

あなたのPlayerクラスもうまく見えます。しかし、getterメソッドとsetterメソッドを削除し、 'public string Name {get;セット; } ' –

+0

古いバージョンを削除しました。彼らと一緒にどこにもいなかったし、カイルローンに感謝 – Duncher

答えて

0

アドバイス:

あなたが持っているときはいつでもsomething1と呼ばれる変数やプロパティ、something2、... - あなたはおそらく何か間違ったことをやっている、とあなたはおそらくリストを使用する場合、配列、ハッシュマップ...

私の考えは、すべての数値をリストに追加してから、おそらくキーをダイスの値とし、値をカウントとする辞書を作ることです。または、後で操作するために必要なフォーマットに応じて、他の操作を行うこともできます。

List<int> diceValues = new List<int>(); 
diceValues.Add(die.GetTopNumber()); 
diceValues.Add(die.GetTopNumber1()); 
diceValues.Add(die.GetTopNumber2()); 
diceValues.Add(die.GetTopNumber3()); 
diceValues.Add(die.GetTopNumber4()); 

今、あなたはリストでそれらを持っていることを、あなたは次のように何かを行うことができます:あなたはキーがサイコロの値になります辞書項目のリストを持っています。このループの後

var values = new Dictionary<int, int>(); 
foreach(var item in diceValues) { 
    if(values.Keys.Contain(item)) { 
     values[item]++; 
    } else { 
     values[item] = 1; 
    } 
} 

、および値はその値を持つダイスの数です。

など。誰かが2つのスリー、および2回のデュースおよび1個から4個を投げた場合、辞書にはなります

キー:2、値:2

キー:3、値:2

キー:4、値:後で採点システムを作ることができ、これらを反復処理することで1

...

+0

私はこれらの行に沿って何かを書こうとしていましたが、Linqを使っていてもリストを値でグループ化することができ、各グループのサイコロの数によっては、あなたが5つのグループを持っている場合、つまりすべてのダイスが異なる場合、グループに4つのアイテムが含まれている場合など... –

+0

okありがとう、私はこれを自分のコードに追加して、 。 – Duncher

0

私はすべてに沿って、これらのプロパティを削除し、代わりに、リストや配列を使用します。

あなたがリストを宣言:

public List<int> Roles { get; private set; } 

そして、あなたのロール法はなることができます:

public void roll() 
{ 
    this.Roles = Enumerable.Range(1, 5) 
          .Select(i => RandomNumGenerator.Next(1, 6)) 
          .ToList(); 

    // Check for three of a kind: 
    bool threeOfAKind = this.Roles.GroupBy(i => i).Any(g => g.Count() >= 3); 

    // rest of your logic 

    Console.WriteLine("\tTotal score = {0}", threepoints); 
} 

後で、 `私は別の多くを試してみたthis.Roles[numOfRoll]

+0

メモとして、この回答のLINQについて説明したいと思うかもしれません。 OPは彼らが初心者だと言っていたので、LINQの使用についてあまり知らないでしょう。 –

+0

この使い方を説明できますか?このコードを私の中に含めることを試みましたが、各パートが何をしているかはわかりませんでした。ありがとう – Duncher

+0

もちろん、あなたには分からない部分はありますか?それがLINQの部分であれば、それについてのチュートリアルを読むことを強くお勧めします。それは.netの非常に重要な側面です –

関連する問題