0

我试图创建一个拥有一套技能和一套特色的“玩家”。每个技能都与某个特殊技能相关联。

然后给玩家 7 种特殊技能和 13 种技能。为了使其更具可读性(在我看来),我将结构用于特殊、技能和玩家。这也适用于使用结构..

请看一下我的代码,它非常简单。

private struct specials
{
   public string name;
   public int value;

   public specials(string n, int v)
   {
       this.name = n;
       this.value = v;
   }
}

private struct skills
{
    public string name;
    public specials spec;
    public int value;

    public skills(string n, specials s, int v)
    {
        this.name = n;
        this.spec = s;
        this.value = v;
    }
}

public struct player
{
    public specials strength = new specials("STRENGTH", 0);
    public specials perception = new specials("PERCEPTION", 0);
    public specials endurance = new specials("ENDURANCE", 0);
    public specials charisma = new specials("CHARISMA", 0);
    public specials intelligence = new specials("INTELLIGENCE", 0);
    public specials agility = new specials("AGILITIY", 0);
    public specials luck = new specials("LUCK", 0);

    //Complains about charisma, saying an object reference is required for 
    // the nonstatic field method or property
    public skills barter = new skills("Barter", charisma, 0); 
}

您可以在代码中的注释中看到我的问题。现在,我不明白为什么这应该是一个问题。

玩家被赋予了他自己的特殊技能和技能,而技能又与特殊技能相关联(我希望通过参考)。

public specials charisma = new specials("CHARISMA", 0);

这会创建一个名为魅力的新特殊对象,对吗?那么为什么这不能传递给一个新的技能对象。

最后一件事。出于某种原因,我仍然不明白,但真的很想知道,这可以通过在声明魅力时使用静态来解决,但我无法通过键入在我的表单类中更改它

player.charisma.value = 123;

问候!


编辑:

我刚刚发现了一些我无法解释的东西。而不是写(产生错误)

public skills barter = new skills("Barter", charisma, 0);

我写:(玩家现在是一个类)

public skills barter = new skills();

然后在玩家构造函数中,我可以像这样设置易货交易:

barter.spec = strength;

为什么会这样?这是不好的做法吗?好吧,无论如何我都不会使用它,因为如果我更改特殊球员,它将不会在易货交易中更新,因为我了解到结构是按值而不是引用传递的。但是我关于为什么我不能用结构初始化结构的问题仍然存在。

4

2 回答 2

2

首先,您定义的第一个结构是私有的,这很奇怪(除非它们嵌套在其他类型中)。

其次,你不能在结构中拥有实例字段初始化器,所以基本上你的整个player结构都是无效的,所以我不知道你是如何得到你描述的错误而没有先遇到这个的。

无论如何,您可能应该使用类。

至于您的最后一个问题,静态成员与types相关联,而不是与所述类型的实例相关联,这就是为什么您不能为单个实例更改它们的原因。

于 2013-11-06T09:29:06.583 回答
0

结构是值类型,这意味着您不能使用新关键字实例化它们。直接试试

public specials charisma = specials("CHARISMA", 0)

还结帐: http: //msdn.microsoft.com/en-us/library/s1ax56ch.aspx 希望这会有所帮助!

于 2013-11-06T09:16:38.053 回答