我正在学习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);
}
}
}
该计划有效,所以我知道我走在正确的轨道上。我遇到的问题是将其转换为一个类。我已经尝试了几次,一遍又一遍,在我转向的任何地方都会遇到不同的错误。因此,为了将这个程序转换成一个类,我的关键问题是:
答案 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
因此,d1
,d2
,d3
,d4
和sum
变量的值可以在{{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
}
这是我不确定的理解:
为什么我必须声明“make_it_roll”才能使代码生效? 如果没有该行,表单只显示空值。是吗 因为我必须创建一个新的类实例来激活它?
为什么我必须通过说“four_d6_less_one.dice1”来调用变量 等等?为什么我不能把“dice1”作为变量?
是否有更有效的方法来编写此代码(我确信总会如此 是的,但我想知道我是否错过了什么。)