コード例 #1
0
 public CardSet(CardSetType setType, int keyNumber, int repeatCount, Card[] cards)
 {
     this.Type        = setType;
     this.KeyNumber   = keyNumber;
     this.RepeatCount = repeatCount;
     this.Cards       = cards;
 }
コード例 #2
0
        private void CardDeckShuffle(CardSetType setType)
        {
            if (mCardDeck == null)
            {
                int cardMaxCount = Mathf.Max(cardsOrgan.Length, cardsSystem.Length);
                mCardDeck = new M8.CacheList <CardData>(cardMaxCount);
            }
            else
            {
                mCardDeck.Clear();
            }

            switch (setType)
            {
            case CardSetType.Organs:
                for (int i = 0; i < cardsOrgan.Length; i++)
                {
                    mCardDeck.Add(cardsOrgan[i]);
                }
                break;

            case CardSetType.Systems:
                for (int i = 0; i < cardsSystem.Length; i++)
                {
                    mCardDeck.Add(cardsSystem[i]);
                }
                break;
            }

            mCardDeck.Shuffle();
        }
コード例 #3
0
        private int GetCardSetTypeWeight(CardSetType setType)
        {
            switch (setType)
            {
            case CardSetType.Invalid:
            case CardSetType.None:
            default:
                //无效牌型,最小
                return(-1);

            case CardSetType.JokerBomb:
                //王炸,最大
                return(2);

            case CardSetType.Bomb:
                //普通炸弹
                return(1);

            case CardSetType.Single:
            case CardSetType.Pair:
            case CardSetType.Triple:
            case CardSetType.TripleWithOne:
            case CardSetType.TripleWithPair:
            case CardSetType.Straight:
            case CardSetType.DoubleStraight:
            case CardSetType.TripleStraight:
            case CardSetType.TripleStraightWithOne:
            case CardSetType.TripleStraightWithPair:
            case CardSetType.QuadraWithTwo:
            case CardSetType.QuadraWithTwoPairs:
                //普通牌型
                return(0);
            }
        }
コード例 #4
0
ファイル: Cardset.cs プロジェクト: NikitaBeloshapka/Uno-last
        public CardSet(CardSetType cardSetType) : this()
        {
            if (cardSetType == CardSetType.Empty) return;

            //подумать, как сформировать
            foreach (var colour in Enum.GetValues(typeof(CardColour)))
            {
                foreach (var kind in Enum.GetValues(typeof(KindsOfCards)))
                {
                    if((CardColour)colour!=CardColour.black) Cards.Add(GetCard((CardColour)colour, (KindsOfCards)kind));
                }
            }

        }
コード例 #5
0
        /// <summary>
        /// 这些牌能组成哪一种牌型?
        /// </summary>
        /// <param name="cards"></param>
        /// <returns>能组成的牌型,无效返回invalid牌型</returns>
        public static CardSet GetCardSet(Card[] cards)
        {
            CardSetType setType = GetCardSetType(cards);
            List <(int cnt, int weight)> handData = GetHandDataCW(cards);
            CardSet result = new CardSet();

            result.Type      = setType;
            result.Cards     = cards;
            result.KeyNumber = handData[handData.Count - 1].weight; //所有牌型的key都是最多的一种牌中最大的一种

            //分情况可以不用写for暴力,但是代码就短多了,其实可读性差不多
            switch (setType)
            {
            case CardSetType.Invalid:
            case CardSetType.None:
            default:
                result.KeyNumber   = (int)CardWeight.wMin;   //这些是无效的牌型
                result.RepeatCount = 0;
                break;

            case CardSetType.JokerBomb:
                result.KeyNumber   = (int)CardWeight.wJokerRed;   //王炸的key是大王
                result.RepeatCount = 1;
                break;

            case CardSetType.Bomb:
            case CardSetType.Single:
            case CardSetType.Pair:
            case CardSetType.Triple:
            case CardSetType.TripleWithOne:
            case CardSetType.TripleWithPair:
            case CardSetType.QuadraWithTwo:
            case CardSetType.QuadraWithTwoPairs:
                result.RepeatCount = 1;     //这些牌型无重复部分,因为它们的长度是固定的
                break;

            case CardSetType.Straight:
            case CardSetType.DoubleStraight:
            case CardSetType.TripleStraight:
                result.RepeatCount = handData.Count;     //这些牌型的重复数等于种类数(最小单元为1种牌)
                break;

            case CardSetType.TripleStraightWithOne:
            case CardSetType.TripleStraightWithPair:
                result.RepeatCount = handData.Count / 2;     //这些牌型的重复数等于种类数的一半(最小单元为2种牌)
                break;
            }

            return(result);
        }
コード例 #6
0
        public CardSet(CardSetType cardSetType, string directory = @"Cards\") : this()
        {
            if (cardSetType == CardSetType.Empty)
            {
                return;
            }

            //Набрать карты
            try
            {
                StreamReader streamReader = new StreamReader(directory + "descriptions.txt");
                Cards = GetCardsFromFile(streamReader);
                streamReader.Close();
            }
            catch
            {
                throw new Exception("directory with cards is incorrect");
            }
        }
コード例 #7
0
        /// <summary>
        /// 获取一种牌型的最小合法重复数
        /// </summary>
        /// to be improve 因为历史原因,这个方法没有在CardSet里面用到,
        /// 但是实际上应该用它来代替硬编码,来提高可修改性(降低耦合,是这个意思不)
        public static int GetMinRepeat(CardSetType setType)
        {
            int repeat = 1;

            switch (setType)
            {
            case CardSetType.Invalid:
            case CardSetType.None:
                repeat = 0;
                break;

            case CardSetType.JokerBomb:
            case CardSetType.Bomb:
            case CardSetType.Single:
            case CardSetType.Pair:
            case CardSetType.Triple:
            case CardSetType.TripleWithOne:
            case CardSetType.TripleWithPair:
            case CardSetType.QuadraWithTwo:
            case CardSetType.QuadraWithTwoPairs:
            default:
                repeat = 1;
                break;

            case CardSetType.Straight:
                repeat = 5;
                break;

            case CardSetType.DoubleStraight:
                repeat = 3;
                break;

            case CardSetType.TripleStraight:
            case CardSetType.TripleStraightWithOne:
            case CardSetType.TripleStraightWithPair:
                repeat = 2;
                break;
            }
            return(repeat);
        }
コード例 #8
0
        /// <summary>
        /// 尝试获取一个精确的牌型(精确到第一关键字)
        /// </summary>
        /// <returns>是否获取成功</returns>
        private bool TryGetExactCardSet(out CardSet cardSet, CardSetType setType, int keyNumber, int repeat)
        {
            cardSet = null;
            Card[] cardsResult = null;
            switch (setType)
            {
            case CardSetType.Invalid:
                cardSet = CardSet.Invalid;
                return(true);

            case CardSetType.None:
                cardSet = CardSet.None;
                return(true);

            case CardSetType.JokerBomb:
                return(TryGetCardSetJokerBomb(out cardSet));

            case CardSetType.Single:
            case CardSetType.Pair:
            case CardSetType.Triple:
            case CardSetType.Bomb:
                if (!TryGetExactCardSetPart1(out cardsResult))
                {
                    return(false);
                }
                break;

            case CardSetType.Straight:
            case CardSetType.DoubleStraight:
            case CardSetType.TripleStraight:
                if (!TryGetExactCardSetPart2(out cardsResult))
                {
                    return(false);
                }
                break;

            case CardSetType.TripleWithOne:
            case CardSetType.TripleWithPair:
            case CardSetType.TripleStraightWithOne:
            case CardSetType.TripleStraightWithPair:
            case CardSetType.QuadraWithTwo:
            case CardSetType.QuadraWithTwoPairs:
                if (!TryGetExactCardSetPart3(out cardsResult))
                {
                    return(false);
                }
                break;

            default:
                break;
            }
            cardSet = new CardSet(setType, keyNumber, repeat, cardsResult);
            return(true);

            bool TryGetExactCardSetPart1(out Card[] cardsResult1)//加1避免名称冲突(vs可以通过编译,unity不行)
            {
                int repeatCount = 1;

                switch (setType)
                {
                case CardSetType.Single:
                    repeatCount = 1;
                    break;

                case CardSetType.Pair:
                    repeatCount = 2;
                    break;

                case CardSetType.Triple:
                    repeatCount = 3;
                    break;

                case CardSetType.Bomb:
                    repeatCount = 4;
                    break;
                }

                return(TryGetCards(out cardsResult1, keyNumber, repeatCount));
            }

            bool TryGetExactCardSetPart2(out Card[] cardsResult1)
            {
                int straightRepeat = 1;//这是几顺,是单顺,双顺还是三顺

                switch (setType)
                {
                case CardSetType.Straight:
                    straightRepeat = 1;
                    break;

                case CardSetType.DoubleStraight:
                    straightRepeat = 2;
                    break;

                case CardSetType.TripleStraight:
                    straightRepeat = 3;
                    break;
                }
                return(TryGetStraight(out cardsResult1, keyNumber, repeat, straightRepeat));
            }

            bool TryGetExactCardSetPart3(out Card[] cardsResult1)
            {
                int length         = 1;
                int straightRepeat = 1;

                int[] subCardCnts = null;
                switch (setType)
                {
                case CardSetType.TripleWithOne:
                    length         = 1;
                    straightRepeat = 3;
                    subCardCnts    = new int[] { 1 };
                    break;

                case CardSetType.TripleWithPair:
                    length         = 1;
                    straightRepeat = 3;
                    subCardCnts    = new int[] { 2 };
                    break;

                case CardSetType.TripleStraightWithOne:
                    length         = repeat;
                    straightRepeat = 3;
                    subCardCnts    = new int[] { 1 };
                    break;

                case CardSetType.TripleStraightWithPair:
                    length         = repeat;
                    straightRepeat = 3;
                    subCardCnts    = new int[] { 2 };
                    break;

                case CardSetType.QuadraWithTwo:
                    length         = 1;
                    straightRepeat = 4;
                    subCardCnts    = new int[] { 1, 1 };
                    break;

                case CardSetType.QuadraWithTwoPairs:
                    length         = 1;
                    straightRepeat = 4;
                    subCardCnts    = new int[] { 2, 2 };
                    break;
                }
                return(TryGetStraightWithSubCards(out cardsResult1, keyNumber, length, subCardCnts, straightRepeat));
            }
        }
コード例 #9
0
 public GraphicCardSet(Panel panel, CardSetType cardSetType, string directory = @"Cards\")
     : base(cardSetType, directory)
 {
     Panel = panel;
 }
コード例 #10
0
        public static async ValueTask <(string Name, int Value)> GetInsertCardTypeValue(CardSetType type, DbConnector connector)
        {
            var cardSetId = await connector.Command($"select CardSetTypeId from cardsettypes where Name = '{s_cardSetTypeNameMap[type]}';").QuerySingleAsync <int>();

            return(DatabaseDefinition.ColumnName[CardRequirement.CardSetTypeFieldNumber], cardSetId);
        }
コード例 #11
0
 private static IEnumerable <CardRequirement> GetCardGroupRequirement(string cardNameMatch, CardSetType cardSetType)
 {
     yield return(new CardRequirement
     {
         RequiredSetName = cardNameMatch,
         CardSetType = cardSetType,
         CardRequirementType = CardRequirementType.NamedSet
     });
 }
コード例 #12
0
        private static CardRequirement GetCardSetRequirement(GameServiceClient client, string cardName, int gamePackageId, CardSetType cardSetType)
        {
            if (cardSetType == CardSetType.CardSetAlly)
            {
                var allies = AllyUtility.GetAlliesAsync(client, name: cardName, nameMatchStyle: NameMatchStyle.Exact).Result;
                if (allies.Count() != 0)
                {
                    return(new CardRequirement
                    {
                        RequiredSetId = allies.FirstOrDefault(x => x.GamePackageId == gamePackageId, allies.First()).Id,
                        CardSetType = CardSetType.CardSetAlly,
                        CardRequirementType = CardRequirementType.SpecificRequiredSet
                    });
                }

                throw new Exception($"Couldn't find Ally named {cardName}");
            }

            if (cardSetType == CardSetType.CardSetAdversary)
            {
                var adversaries = AdversaryUtility.GetAdversariesAsync(client, name: cardName, nameMatchStyle: NameMatchStyle.Exact).Result;
                if (adversaries.Count() != 0)
                {
                    return(new CardRequirement
                    {
                        RequiredSetId = adversaries.FirstOrDefault(x => x.GamePackageId == gamePackageId, adversaries.First()).Id,
                        CardSetType = CardSetType.CardSetAdversary,
                        CardRequirementType = CardRequirementType.SpecificRequiredSet
                    });
                }

                throw new Exception($"Couldn't find Adversary named {cardName}");
            }

            if (cardSetType == CardSetType.CardSetNeutral)
            {
                var neutrals = NeutralUtility.GetNeutralsAsync(client, name: cardName, nameMatchStyle: NameMatchStyle.Exact).Result;
                if (neutrals.Count() != 0)
                {
                    return(new CardRequirement
                    {
                        RequiredSetId = neutrals.FirstOrDefault(x => x.GamePackageId == gamePackageId, neutrals.First()).Id,
                        CardSetType = CardSetType.CardSetNeutral,
                        CardRequirementType = CardRequirementType.SpecificRequiredSet
                    });
                }

                throw new Exception($"Couldn't find Neutral named {cardName}");
            }

            if (cardSetType == CardSetType.CardSetHenchman)
            {
                var henchmen = HenchmanUtility.GetHenchmenAsync(client, name: cardName, nameMatchStyle: NameMatchStyle.Exact).Result;
                if (henchmen.Count() != 0)
                {
                    return(new CardRequirement
                    {
                        RequiredSetId = henchmen.FirstOrDefault(x => x.GamePackageId == gamePackageId, henchmen.First()).Id,
                        CardSetType = CardSetType.CardSetHenchman,
                        CardRequirementType = CardRequirementType.SpecificRequiredSet
                    });
                }

                throw new Exception($"Couldn't find Henchman named {cardName}");
            }

            throw new Exception($"Coudn't figure out how to handle {cardSetType}");
        }
コード例 #13
0
        private static IEnumerable <CardRequirement> GetAdditionalCardSetsRequirement(GameServiceClient client, string info, CardSetType setType)
        {
            var splitInfo = info.Split('|').Select(x => int.Parse(x)).ToList();

            if (splitInfo.Count != 1 && splitInfo.Count != 5)
            {
                throw new Exception($"Bad data {info}");
            }

            var hasMultipleValues = splitInfo.Count > 1;

            for (int i = hasMultipleValues ? 1 : 0; i < (hasMultipleValues ? 6 : 1); i++)
            {
                yield return(new CardRequirement
                {
                    PlayerCount = i,
                    CardSetType = setType,
                    AdditionalSetCount = splitInfo[hasMultipleValues ? i - 1 : i],
                    CardRequirementType = CardRequirementType.AdditionalSetCount
                });
            }
        }
コード例 #14
0
 public GraphicCardSet(Panel panel, CardSetType cardSetType = CardSetType.Empty) : base(cardSetType)
 {
     Panel = panel;
 }