扑克牌:它们应该是枚举还是结构或类?

Ali*_*hat 11 c# struct

我正在设计游戏网站,许多(希望成千上万)玩家会相互同时玩某些纸牌游戏.甲板是标准牌52牌.每张卡都有一套西装和一个等级.卡片将被随机洗牌,处理,挑选,订购,播放.我的问题是,应该Card是枚举,结构还是类?

  • 对于枚举:让每张卡都是字节0..51.因此卡片占用的空间非常小.您可以将手表示为8字节的位集.当需要时,您可以非常快速地计算给定卡的套装和等级:即suit(n)= n/13.这将非常有效.如果需要为Card编写方法,请通过扩展方法编写.

  • 对于struct:不,这就像编写机器代码一样.卡是一种简单的结构,保存的数据非常少,不可变,很小.它没有太多行为,因此将其作为结构并将其视为被动数据结构.当需要时,您可以非常快速地从给定卡计算0..51中的索引.

  • 对于课堂:不,这不是一种面向对象的思维方式.制作卡片课程.让它一成不变.准确创建52个实例.让卡池保存这些实例.因此,当需要黑桃皇后时,它会向卡池询问.即使有数千场比赛正在进行,也会有一个也只有一个黑桃皇后.如果需要,可以在卡中存储索引字段0..51.

我倾向于最后一个选项(课程),但我不确定.我不太担心表现; 在此过程中,我可能会犯更严重的错误.我担心的是我的整个观点可能是错的; 也许这是一个非常简单的决定,我犹豫不决,因为我缺乏其他人拥有的一些知识.

你怎么看?

编辑:关于卡的行为.我认为一张卡片只会知道其他卡片.例如,它可以定义"谁击败谁在桥中"的部分顺序.它不需要知道关于甲板的任何信息.这将是服务器端代码; 当然,它不需要知道在屏幕等上绘制自己.

Eri*_*ert 13

在决定引用类型或值类型时,你应该问自己的基本问题当然是我在逻辑上建模一个,或者引用东西这就是为什么值类型和引用类型首先被称为"值类型"和"引用类型".

您是否计划将"卡片"作为参考处理,就像处理具有身份的物理对象一样?例如,假设您正在为Canasta建模,它同时使用两个标准卡片组进行播放.你是否想要跟踪两个不同的黑桃皇后并将它们视为不同的参考

或者你会把它们当作价值观,对待数字的方式?你永远不会说"这里的六号与那里的六号不同",因为数字只能通过它们的数值来区分.

  • @AliFerhat:正确; 不可变的memoized引用类型的行为非常类似于值类型.基本上每张"卡片"都会变成单身.如果卡中的信息量小于参考的大小,我认为没有理由制作单身; 间接会给你带来什么? (5认同)

Mat*_*hew 5

制作一张structclass一张卡片时,卡片的价值应为a enum,而卡片的套装也是一张enum.

制作牌组,你可以使用a class,它包含一个列表card,有类似的操作等Shuffle.

  • @Tigran我不确定你对此有何看法. (2认同)