2017-04-13 48 views
0

當前正在開發一個項目並需要一些幫助。對c#來說還是比較新的。我創建了一個骰子滾動遊戲,其中5個骰子在兩個玩家之間輪流翻轉。我堅持的是通過這些值檢查三種類型和分配點。例如,一名球員按下輸入,一名出現三次,然後玩家應該得到三分,或者如果四次出現三次,那麼玩家接受點。我已經嘗試了許多使用if語句和for循環的不同方法,但似乎無法使其工作。我的代碼在下面提供。任何幫助將不勝感激。C#Dice Roll - 將值分配給值

感謝

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

這個循環後,您將擁有的字典項的列表,其中一個關鍵是骰子值,值的骰子數量與該值。

E.g.如果有人投擲了兩枚三分球,兩局末平分和一個四,詞典看起來:

重點:2,數值:2

鍵:3,值:2

鍵:4,價值: 1

通過通過這些迭代以後可以做一個評分系統......

+0

我正要寫這些東西,並補充說,你可以按照值來分組列表,即使只使用Linq,根據每個組中的骰子數量,你可以寫一些非常簡單的評估他們的邏輯 - 也就是說,如果你有5個組,那麼所有的骰子是不同的,如果任何組包含四個項目...等 –

+0

好的謝謝,我會嘗試添加到我的代碼,並讓你知道我如何得到。 – 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的一個非常重要的方面。 –