我正在设计一个游戏站点,许多(希望成千上万)玩家将同时相互玩某些纸牌游戏。牌组是标准52卡牌组。每张卡都有一套西装和一个等级。纸牌将被无时无刻地洗牌,发牌,挑选,订购,玩。我的问题是,Card
应该是枚举,结构还是类?
令每个卡为字节0..51。因此,一张卡将只占很少的空间。您可以将 watch 示为8个字节的位集。您可以在需要时快速计算给定牌的花色和等级:即字色(n)= n/13。这将非常有效。如果您需要为Cards编写方法,请通过扩展方法进行编写。
不,这就像编写机器代码。卡是一种简单的结构,只包含很少的数据,是不变的,很小的。它没有太多的行为,因此使其成为一个结构并将其视为被动数据结构。当需要时,您可以从给定的卡中快速计算0..51中的索引。
不,那不是面向对象的思维方式。进行卡片类(class)。使它不变。正好创建52个实例。让卡池保存这些实例。因此,当需要黑桃皇后时,它会向卡牌池询问。即使有成千上万的游戏正在进行,黑桃皇后也将只有一名。如果需要,将索引字段0..51存储在Card中。
我倾向于最后一个选项(类),但不确定。我不太担心性能。在此过程中,我可能会犯更严重的错误。我担心的是我的整体观点可能是错误的。也许这是一个非常容易的决定,我犹豫了,因为我缺乏其他所有人都拥有的一些知识。
你怎么看?
编辑:关于卡的行为。我认为一张卡只会知道其他卡。例如,它可以定义“谁击败了Bridge中的谁”的部分顺序。它不需要知道有关套牌的任何信息。这将是服务器端代码;当然,它不需要知道如何在屏幕上进行绘制等。
最佳答案
在确定引用类型还是值类型时,您应该问自己的基本问题是,这是我在逻辑上建模的值或引用的东西吗? 这就是为什么值类型和引用类型首先被称为“值类型”和“引用类型”的原因。
您是否打算将“卡”作为引用,就像对待具有身份的物理对象一样?例如,假设您正在建模Canasta,它同时使用两个标准纸牌组进行播放。您是否想跟踪两个不同的黑桃皇后并将它们视为具有引用意义的不同?
还是要像对待数字一样将它们视为值(value)?您永远不会说“这里的第六个数字与那里的第六个数字不同”,因为数字仅根据其值进行区分。
关于c# - 纸牌: Should they be enum or struct or class?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9933176/