2017-04-13 2 views
0

현재 프로젝트 작업 중이므로 도움이 필요합니다. 여전히 비교적 새로운 C#. 나는 5 명의 주사위가 2 명의 플레이어 사이에서 차례로 번갈아 가며 굴러가는 주사위 굴림 게임을 만들었습니다. 내가 붙어있는 것은 3 가지 종류의 값을 확인하고 포인트를 지정하는 것입니다. 예를 들어, 플레이어가 엔터를 누르고 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

플레이어 클래스도 괜찮아 보입니다. 하지만 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; 
    } 
} 

을하고, 그 값을 가진 주사위의 숫자 값.

예. 누군가가 두 개의 열로, 두 듀스와 1 ~ 4를 던졌다 경우 사전 보일 것이다

키 : 2, 값 : 2

키 : 3, 값 : 2

키 : 4, 값 : 나는 모두 함께 이러한 속성을 제거하고 대신 목록 또는 배열을 사용

+0

나는 Linq를 사용하여 값으로 목록을 그룹화 할 수 있으며, 각 그룹의 주사위 개수에 따라 꽤 간단하게 쓸 수 있다고 덧붙였다. 그 (것)들을 평가하는 논리 - ie 5 개의 그룹이있는 경우에 모든 주사위는 다른 어떤 그룹든지 4 개의 품목을 포함하는 경우에 ... 등등이다. –

+0

ok 감사, 나는 이것을 나의 코드에 추가하고 당신이 나가 어떻게에 관하여 알게 할 것이다 . – Duncher

0

나중에 채점 시스템을 만들 수 있습니다 다음을 반복함으로써

1 ....

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 부분이라면, 나는 그것이 매우 중요한 측면 인 것처럼 그것에 대한 약간의 튜토리얼을 읽는 것을 강력히 권한다. –