C#:扑克牌游戏(2):给CardLib添加Cards集合

(一):背景

        在上一篇文章中,我们简单建立了几个可能在后面会用到的类并且放到了一个类库中,接下来需要对这几个类进行进一步的思考。首先一个问题是,我们原先在Deck类中,使用了一个数组来代表一副牌,但是我们知道,在一个扑克牌游戏中,(例如斗地主),会存在着抽牌,出牌的动作,当发生这种动作时,对象的个数就发生变化了。这种情况下,我们使用一个固定个数的数组就不是那么合适了。因此在这篇文章中,会使用集合的技术来代替原先的数组。

        因为有抽牌出牌的动作,所以我们还需要一个Cards类来代表“一手牌”这个概念

(二):建立新工程

        按照书上的做法,建立新类库工程命名为Ch11CardLib

(三):建立原先的枚举

        枚举Rank和Suit和上一篇文章一致

(四):建立代表一手牌的新类Cards

        创建新类,命名为Cards,这是一个继承CollectionBase类的集合。首先考虑到抽牌的动作,一个集合内对象减少而另一个集合内对象增加,因此建立增加对象和减少对象的方法。

public void Add(Card newCard)
        {
            List.Add(newCard);
        }
        public void Remove(Card oldCard)
        {
            List.Remove(oldCard);
        }

        然后我们考虑实现“判断某张牌是否在集合内”的功能

 public bool Contains(Card card) => InnerList.Contains(card);

        接下来是将一个集合内对象复制到另一个集合内

        public void CopyTo(Cards targetCards)
        {
            for(int index=0;index<this.Count;index++)
            {
                targetCards[index] = this[index];
            }
        }

(五):修改Deck类

        修改完的Deck类见下面代码

(六):建立客户端工程进行验证

        和上一篇文章中的做法一样,代码不变

(七):输出结果

(八):源代码

        Ch11CardLib类库中

        Suit.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ch11CardLib
{
    public enum Suit
    {
        Club,
        Diamond,
        Heart,
        Spade
    }
}

        Rank.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ch11CardLib
{
    public enum Rank
    {
        Ace = 1,
        Deuce,
        Three,
        Four,
        Five,
        Six,
        Seven,
        Eight,
        Ten,
        Jack,
        Queen,
        King
    }
}

        Card.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ch11CardLib
{
    public class Card
    {
        public Rank rank;
        public Suit suit;

        public Card()
        {
            
        }

        public Card(Suit newSuit, Rank newRank)
        {
            suit = newSuit;
            rank = newRank;
        }

        public override string ToString()
        {
            return "The " + rank + "of " + suit + "s";
        }
    }
}

        修改过的Deck.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ch11CardLib
{
    public class Deck
    {
        private Cards cards = new Cards();

        public Deck()
        {
            for(int suitVal=0;suitVal<4;suitVal++)
            {
                for (int rankVal=1;rankVal<14;rankVal++)
                {
                    cards.Add(new Card((Suit)suitVal, (Rank)rankVal));
                }
            }
        }

        public Card GetCard(int cardNum)
        {
            if (cardNum >= 0 && cardNum <= 51)
                return cards[cardNum];
            throw new System.ArgumentOutOfRangeException("cardNum", cardNum, "Value must between 0 and 51");
        }

        public void Shuffle()
        {
            Cards newDeck = new Cards();
            bool[] assigned = new bool[52];
            Random sourceGen = new Random();
            for(int i=0;i<52;i++)
            {
                int sourceCard = 0;
                bool foundCard = false;
                while(foundCard==false)
                {
                    sourceCard = sourceGen.Next(52);
                    if (assigned[sourceCard] == false)
                        foundCard = true;
                }
                assigned[sourceCard] = true;
                newDeck.Add(cards[sourceCard]);
            }
            newDeck.CopyTo(cards);
        }
    }
}

        新建的Cards.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace Ch11CardLib
{
    public class Cards:CollectionBase
    {
        public void Add(Card newCard)
        {
            List.Add(newCard);
        }

        public void Remove(Card oldCard)
        {
            List.Remove(oldCard);
        }

        public Card this[int cardIndex]
        {
            get { return (Card)List[cardIndex]; }
            set { List[cardIndex] = value; }
        }

        public void CopyTo(Cards targetCards)
        {
            for(int index=0;index<this.Count;index++)
            {
                targetCards[index] = this[index];
            }
        }

        public bool Contains(Card card) => InnerList.Contains(card);
    }
}

        Ch11CardClient工程

        Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Ch11CardLib;
using static System.Console;

namespace Ch11CardClient
{
    class Program
    {
        static void Main(string[] args)
        {
            Deck myDeck = new Deck();
            myDeck.Shuffle();
            for(int i=0;i<52;i++)
            {
                Card tempCard = myDeck.GetCard(i);
                WriteLine(tempCard.ToString());                                 
            }
            ReadKey();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/buaazyp/article/details/82981076