gpt4 book ai didi

c# - 在 C# 中存储和索引常量

转载 作者:行者123 更新时间:2023-11-30 20:59:38 27 4
gpt4 key购买 nike

我猜这是一个哲学问题。

我们正在启动一个视频游戏项目,并在进行过程中发现 C#。我们需要做的第一件事就是在一堆数组中存储常量,这样任何人都可以轻松访问这些值,这样我们就可以在定义新角色或武器类型时快速添加或修改值。

现在在 C++ 中,这就是我学会的方法:

  • 在一些 constants.h 文件中声明一个枚举,其最后一个元素是“WHATEVER_TYPE_END”;
  • 声明大小为“WHATEVER_TYPE_END”的常量数组,因为枚举和数组索引在 C++ 中运行良好;
  • 在 constants.cpp 中用不同类型的各种值填充这些数组。

一个例子:

enum FoulType {
FOUL_TYPE_NONE,
FOUL_TYPE_OUT_OF_PLAY,
FOUL_TYPE_OFFSIDE,
FOUL_TYPE_VIOLENCE,
FOUL_TYPE_RETENTION,
FOUL_TYPE_END
};

extern const char* FoulTypeNames[FOUL_TYPE_END];

extern const float FoulSanctionChances[FOUL_TYPE_END];

extern const ushort FoulSanctionSeconds[FOUL_TYPE_END];

extern const uchar FoulSanctions[FOUL_TYPE_END];

它很简洁,因为它可以让程序员毫不费力地检索修饰符。如果我想计算我的角色会造成多少伤害,我会做类似的事情

CharacterType charType = myCharacter.getType();
WeaponType weapType = myCharacter.getWeapon().getType();
damage = CharacterDamages[ charType ] * WeaponModifiers[ weapType ];

现在在 C# 中,我一直在努力思考如何获得类似的结果。经过三个小时的游历,我终于有了一些功能性的东西,但它看起来有点老套。

我拥有的是一个静态类(名为常量),其中声明了公共(public)枚举,并定义了大小为 (int)SomeEnum.END 的公共(public)静态只读数组。声明看起来像这样:

public enum WeaponType
{
Gun = 0,
Shotgun,
Assault,
End
};

public static readonly int[] WeapDamage = new int[ (int)WeaponType.End]
{
10,
50,
10
};

由于CS0134,数组是只读的而不是常量的.枚举必须显式转换为 int,否则它可以正常工作。现在,我知道那些“常量”并不是真正的常量,这些数组的值可能会改变;我找到了解决此问题的两种可能方法:

  • 保护数组,并使用 getter,如果有人真的需要整个数组而不仅仅是一个值,则返回数组的副本;
  • 使用 ReadOnlyCollection

因为我偏向于我的旧 C++ 方式(它们本身可能不像我想象的那么干净),这些解决方案都没有吸引我(尤其是 ReadOnlyCollection,因为我(我猜大部分是迷信的) ...) 害怕时间和/或内存开销(我们正在处理实时多人游戏))。

大多数情况下,我想,恐怕我只是为了用另一种语言实现一些几乎像但不完全是我所知道的东西而付出的努力只是我做事不正确的标志.那么,对于任何比我在 C# 和/或视频游戏制作方面有更多经验的人来说,在这里存储一堆常量的正确方法是什么?

最佳答案

它真的必须是常量吗?我的意思是你可以把它包装在一个类中。我不太喜欢使用很多依赖于其他常量的常量。您的代码不是很面向对象或可读性。当然,如果内存使用等是一个问题,也有异常(exception)。

但是 C# 做这样的事情的方式是面向对象的。

public class Weapon {
public string Name { get; private set; }
public WeaponType Type { get; private set; }
}

public class WeaponType {
public string Name { get; private set; }
public int Damage { get; private set; }
}

等等

然后有一个工厂方法在开始游戏时初始化你的武器/角色等。实际数据可以像文件一样存储在任何地方。

关于c# - 在 C# 中存储和索引常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15398215/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com