将“随机”骰子程序转换为类

时间:2014-02-04 22:37:36

标签: c# class object random

我正在学习C#以获得新的职位,并且为了更好地理解课程,我写了一个简短的模具工具来帮助我。该代码基本上滚动了四个d6,增加了总数,并减去了最小的模具卷。代码是通过表单生成的,表单显示所有滚动值,以及减去错误检查。这是代码:

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public static int d1 = 0;
        public static int d2 = 0;
        public static int d3 = 0;
        public static int d4 = 0;

        public static int sum = 0;

        public Form1()
        {
            InitializeComponent();
        }

        private void form_description_Click(object sender, EventArgs e)
        {

        }

        private void roll_button_Click(object sender, EventArgs e)
        {
            Random random_number = new Random();
            d1 = random_number.Next(1, 7);
            d2 = random_number.Next(1, 7);
            d3 = random_number.Next(1, 7);
            d4 = random_number.Next(1, 7);

            sum = Math.Min(Math.Min(Math.Min(d1, d2), d3), d4);

            label_d1.Text = "Value of D1 is:  " + d1;
            label_d2.Text = "Value of D2 is:  " + d2;
            label_d3.Text = "Value of D3 is:  " + d3;
            label_d4.Text = "Value of D4 is:  " + d4;
            label_sum.Text = "Value of Sum is:  " + sum;


            attribute_roll.Text = "Your strength is: " + ((d1 + d2 + d3 + d4) - sum);
        }
    }
}

该计划有效,所以我知道我走在正确的轨道上。我遇到的问题是将其转换为一个类。我已经尝试了几次,一遍又一遍,在我转向的任何地方都会遇到不同的错误。因此,为了将这个程序转换成一个类,我的关键问题是:

  1. 是否可以在我自己的班级中使用Random,一个已有的类?或者我是否需要在表单中声明它?
  2. 如果我在类中使用“public static int”,值会转移到方法吗?我不清楚“public int”和“public static int”之间的区别吗?

3 个答案:

答案 0 :(得分:1)

1。可以在自己的班级中使用它,你只需在班级范围内定义它。

class Foo
{
    Random rng = new Random();
    ...
}

2. 静态成员不需要访问实例,因此它们对整个程序是全局的,非静态成员与实例绑定。

class Foo
{
    public static int Bar = 42;
    public int Baz = 42;
}

Console.WriteLine( Foo.Bar ); //OK, static variables don't require the class to be instantiated.
Console.WriteLine( Foo.Baz ); //Error, Baz is not static.

Foo foo_instance = new Foo();
Console.WriteLine( foo_instance.Baz ); //OK

请注意,因此,从实例方法中更改静态变量也会全局更改它。

class Foo
{
    public static int Bar = 42;

    public void Baz()
    {
        Bar = Bar + 1;
    }
}

Console.WriteLine( Foo.Bar ); //42

Foo foo_instance = new Foo();
foo_instance.Baz();

Foo foo_instance2 = new Foo();
foo_instance2.Baz();

Console.WriteLine( Foo.Bar ); //44

因此,d1d2d3d4sum变量的值可以在{{1}的主要实例之外更改如果您有多个实例并导致意外结果。

Form1类也位于Random命名空间中,因此如果出现错误,则需要在文件顶部添加System

答案 1 :(得分:0)

让我完全按照你的要求回答你的两个问题:

1)您可以在班级中使用Random。它不需要采用

形式

2)您可以使用静态和非静态方法中的静态变量,但不能使用静态方法中的非静态变量。

竖起大拇指!您发现这些类可能对您的情况有所帮助的事实是编写更好的rpogram的第一步。尝试在线查找涵盖面向对象设计原理的教程。这是你真正受益的东西,与实际的编程语言无关。

我的建议:投资50美元一个月无限Pluralsight trainings。从头开始选择 C#基础 C#课程,并按照示例重新实施它们。

答案 2 :(得分:0)

花了很多试验和错误,但我设法将我的代码转换为一个类。不幸的是,我不是100%肯定我明白我的想法。这是该类的代码:

public class four_d6_less_one
    {
        ////Variables declared here.  
        public static int dice1;
        public static int dice2;
        public static int dice3;
        public static int dice4;

        public static int minus_low;

        public static int sum_dice;

        //This is the constructor
        public four_d6_less_one()
        {
            Random rand_dice = new Random();
            dice1 = rand_dice.Next(1, 7);
            dice2 = rand_dice.Next(1, 7);
            dice3 = rand_dice.Next(1, 7);
            dice4 = rand_dice.Next(1, 7);

            minus_low = Math.Min(Math.Min(Math.Min(dice1, dice2), dice3), dice4);

            sum_dice = dice1 + dice2 + dice3 + dice4 - minus_low;
        }

以下是表单本身的代码:

 private void roll_button_Click(object sender, EventArgs e)
        {
            four_d6_less_one make_it_roll = new four_d6_less_one();

            label_d1.Text = "Value of D1 is:  " + four_d6_less_one.dice1;  //This is where dice1 goes
            label_d2.Text = "Value of D2 is:  " + four_d6_less_one.dice2;  //This is where dice2 goes
            label_d3.Text = "Value of D3 is:  " + four_d6_less_one.dice3;  //This is where dice3 goes
            label_d4.Text = "Value of D4 is:  " + four_d6_less_one.dice4;  //This is where dice4 goes
            label_sum.Text = "Value of Sum is:  " + four_d6_less_one.minus_low;  //This is where minus_sum goes
            attribute_roll.Text = "Your strength is: " + four_d6_less_one.sum_dice;  //This totals all variables and subtracts minus_sum

        }

这是我不确定的理解:

  1. 为什么我必须声明“make_it_roll”才能使代码生效? 如果没有该行,表单只显示空值。是吗 因为我必须创建一个新的类实例来激活它?

  2. 为什么我必须通过说“four_d6_less_one.dice1”来调用变量 等等?为什么我不能把“dice1”作为变量?

  3. 是否有更有效的方法来编写此代码(我确信总会如此 是的,但我想知道我是否错过了什么。)