65.9K
CodeProject 正在变化。 阅读更多。
Home

扑克牌

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.57/5 (4投票s)

2008年8月30日

CPOL

2分钟阅读

viewsIcon

41254

downloadIcon

1280

一组代表典型扑克牌的类。

引言

这是一篇简要介绍我创建的一组类的文章,这些类代表一组典型的扑克牌。我想创建一个cribbage游戏,首先我开始寻找Open Source代码,希望能为我构建基本的扑克牌类。 令人惊讶的是,我没有找到任何符合我需求的。 所以,我决定为我的cribbage游戏需要创建的第一件事是扑克牌。这些包括一个卡片类、一个卡片数组(卡片的集合)、一个卡片比较器(用于以不同的方式对卡片数组进行排序)、一副标准的52张牌和靴子类。 我最初用C#编写了这些类,但使用免费在线工具将它们翻译成VB。 我希望这对您有所帮助。

使用代码

项目文件实际上有解决方案文件以及三个项目。 有一个项目用于C#卡片类,一个用于VB.NET卡片类,第三个是一个简单的C#控制台应用程序,旨在向您展示这些类的用途。 C#和VB.NET类在功能上是相同的,并且仅在编写它们的语言上有所不同。

在查看其他人如何处理卡片类时,我看到的最常见的错误之一是,在表示卡片属性时不使用枚举。 通过使用强类型数据,代码将更容易阅读,并且不易出错。

我在其他类似项目中看到的另一个缺点是缺乏对卡片进行排序的方法。 有很多不同的方式来排列一组卡片,例如面值、点数、花色、升序、降序等。 我决定创建一个静态类,该类使用IComparable接口使排序更容易。 排序算法的实际实现隐藏在一个私有的嵌套类中,如下所示

public static class CardComparer
{
    public static IComparer SortFaceAscending()
    {
        return (IComparer)new SortFaceAscendingHelper();
    }
    
    ....
    
    private class SortFaceAscendingHelper : IComparer
    {
        int IComparer.Compare(object a, object b)
        {
            if (a is Card && b is Card)
            {
                Card cardA = (Card)a;
                Card cardB = (Card)b;

                if (cardA.Face > cardB.Face) { return 1; }
                else if (cardA.Face < cardB.Face) { return -1; }
                else { return 0; }
            }
            else { throw new ArgumentException("Object is not of type Card."); }
        }
    }

改进/构建此代码的方法

我构建此代码作为我目前正在开发的cribbage游戏的基础。 它可以用于或轻松修改以与您想要的任何纸牌游戏一起玩。 各种纸牌游戏之间最大的区别是卡片的实际值,这就是我将面值和花色属性与卡片的实际值分开的原因。 这可以通过基于当前正在玩的游戏的卡片值来改进,也许通过传递给卡片构造函数的静态类。

© . All rights reserved.