C#Dice Roll - 将分数分配给值

时间:2017-04-13 16:11:16

标签: c# dice

目前正在开展一个项目并需要一些帮助。 c#还是比较新的。我创造了一个骰子滚动游戏,其中5个骰子在2个玩家之间轮流滚动。我坚持的是通过这些值检查三种类型并分配点。例如,一个玩家按下输入,一个出现三次,然后玩家应该得到三个点,或者如果四个出现三次,则玩家接收到点。我已经尝试了许多使用if语句和for循环的不同方法,但似乎无法使其正常工作。我的代码在下面提供。任何帮助将不胜感激。

由于

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

    }
}

}

2 个答案:

答案 0 :(得分:0)

建议:

每当你有一些名为something1,something2,...的变量或属性时 - 你可能做错了,你可能想要使用list,array,hashmap ...

我的想法是将所有数字添加到列表中,然后可能迭代创建一个字典,其中key是骰子值,value是count。或者您可以做其他事情,具体取决于以后操作所需的格式。

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

通过迭代这些,你可以稍后制作一个评分系统......

答案 1 :(得分: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]

访问每个单独的论坛