unity 扎金花比大小

目录结构

public class Define 
{
    public const int FLOWER_SPADE = 3;// 黑桃
    public const  int FLOWER_HEART = 2;// 红桃
    public const  int FLOWER_CLUB = 1;// 梅花
    public const  int FLOWER_DIAMOND = 0;// 方片

    public const  int NUM_A = 14;
    public const  int NUM_K = 13;
    public const  int NUM_Q = 12;
    public const  int NUM_J = 11;
    public const  int NUM_10 = 10;
    public const  int NUM_9 = 9;
    public const  int NUM_8 = 8;
    public const  int NUM_7 = 7;
    public const  int NUM_6 = 6;
    public const  int NUM_5 = 5;
    public const  int NUM_4 = 4;
    public const  int NUM_3 = 3;
    public const  int NUM_2 = 2;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace GameCore
{

    public class PlayerUtil 
    {
        // 将一副牌按牌面从大到小排序
        public static void SortPlayerByNumber(Player player)
        {
            for (int i = 0; i < 3; i++) 
            {
                for (int j = 0; j < 3 - i - 1; j++) 
                {
                    if (player.cards[j].number < player.cards[j + 1].number)
                    {
                        Card tempCard = player.cards[j];
                        player.cards[j] = player.cards[j + 1];
                        player.cards[j + 1] = tempCard;
                    }
                }
            }
        }

        // 将一副牌按花色从大到小排序
        public static void SortPlayerByFlower(Player player) {
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3 - i - 1; j++) 
                {
                    if (player.cards[j].flower < player.cards[j + 1].flower)
                    {
                        Card tempCard = player.cards[j];
                        player.cards[j] = player.cards[j + 1];
                        player.cards[j + 1] = tempCard;
                    }
                }
            }
        }

        // 将对子移动到一幅牌的前两位
        public static void MoveDouble2Front(Player player) 
        {
            if (player.cards[1].number == player.cards[2].number)
            {
                Card tempCard = player.cards[0];
                player.cards[0] = player.cards[2];
                player.cards[2] = tempCard;
            }
        }

        // 将对子已经处于一副牌的前两张的牌,移动对子中花色大的到最前面
        public static void ExchangeSortedDoubleFlower(Player player) 
        {
            if (player.cards[0].flower < player.cards[1].flower)
            {
                Card tempCard = player.cards[0];
                player.cards[0] = player.cards[1];
                player.cards[1] = tempCard;
            }
        }
    }

}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace GameCore
{
    public class Card
    {
        public int number { get; set; }

        public int flower { get; set; }

        public Card() { }

        public Card(int flower, int number) 
        {
            this.flower = flower;
            this.number = number;
        }

    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace GameCore
{
    public class Player 
    {
        public int index {get; set;}

        public Card[] cards = new Card[3];

        public int type { get; set; }

        public bool isSpecial { set; get; }

        public int value {  get; set; }

        public Player() 
        {
        }

        public Player(Card card0, Card card1, Card card2) 
        {
            this.cards[0] = card0;
            this.cards[1] = card1;
            this.cards[2] = card2;
        }

        public Card[] GetCards()
        {
            return cards;
        }

        public void SetCards(Card[] cards) 
        {
            this.cards = cards;
        }

    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace GameCore
{
    /**
    *  发牌器,洗牌发牌
    */
    public interface PlayerProvider 
    {
        // 产生单副牌
        Player GetSinglePlayer();

        // 产生多副牌
        List<Player> GetPlayers(int number);

        // 发一张牌
        Card GetCard();

        // 洗牌
        void Shuffle();
    }
}


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace GameCore
{
    /**
 *   一副牌
 */
    public class LimitedPlayerProvider : PlayerProvider
    {
        private List<Card> cards = new List<Card> ();
        private Random random = new Random();

        public LimitedPlayerProvider()
        {
            InitCards();
        }

        public void InitCards()
        {
            cards.Clear();
            for (int i = 14; i > 1; i--)
            {
                for (int j = 3; j >= 0; j--)
                {
                    Card card = new Card(j, i);
                    cards.Add(card);
                }
            }
        }

        public  Player GetSinglePlayer()
        {
            if (cards.Count < 3)
            {
                Debug.Log("牌不够......");
                return null;
            }
            Player player = new Player();
            for (int i = 0; i < 3; i++)
            {
                player.cards[i] = GetCard();
            }
            PlayerUtil.SortPlayerByNumber(player);
            return player;
        }

        public List<Player> GetPlayers(int number)
        {
            if ( number * 3 > cards.Count)
            {
                return null;
            }
            List<Player> players = new List<Player> ();
            for (int i = 0; i < number; i++)
            {
                Player player= GetSinglePlayer();
                players.Add(player);
            }
            return players;
        }

        // 发一张牌
        public Card GetCard()
        {
            if (cards.Count <= 0)
            {
                return null;
            }

            int cardIndex = Random.Range(0, cards.Count);
            Card card = cards[cardIndex];
            cards.RemoveAt(cardIndex);
            return card;
        }

        // 洗牌
        public void Shuffle()
        {
            InitCards();
        }
    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace GameCore
{
    public class TypeValueSetter 
    {
        private ValueCalculator calculator;

        public TypeValueSetter(ValueCalculator calculator)
        {
            this.calculator = calculator;
        }

        public void RegPlayerType(Player player)
        {
            if (IsFlush(player))
            {
                if (IsStraight(player)) 
                {
                    player.type = PlayerType.STRAIGHT_FLUSH;
                    player.value = calculator.GetStraightFlushValue(player);
                } 
                else 
                {
                    player.type = PlayerType.FLUSH;
                    player.value = calculator.GetFlushValue(player);
                }
            }
            else if (IsStraight(player)) 
            {
                player.type = PlayerType.STRAIGHT;
                player.value = calculator.GetStraightValue(player);
            } 
            else if (IsDouble(player)) 
            {
                if (IsBomb(player))
                {
                    player.type = PlayerType.BOMB;
                    player.value = calculator.GetBombValue(player);
                } 
                else {
                    player.type = PlayerType.DOUBLE;
                    PlayerUtil.MoveDouble2Front(player);
                    player.value = calculator.GetDoubleValue(player);
                }
            }
            else
            {
                player.type = PlayerType.NORMAL;
                player.value = calculator.GetNormalValue(player);
                if (IsSpecial(player)) 
                {
                    player.isSpecial = true;
                }
            }
        }

        private bool IsFlush(Player player)
        {
            return player.cards[0].flower == player.cards[1].flower
                && player.cards[1].flower == player.cards[2].flower;
        }

        private bool IsStraight(Player player)
        {
            return ((player.cards[0].number == player.cards[1].number + 1)
                && player.cards[1].number == player.cards[2].number + 1);
        }

        private bool IsBomb(Player player)
        {
            return (( player.cards[0].number == player.cards[1].number )
                && (player.cards[1].number == player.cards[2].number));
        }

        private bool IsDouble(Player player)
        {
            return player.cards[0].number == player.cards[1].number
                || player.cards[1].number == player.cards[2].number;
        }

        private bool IsSpecial(Player player)
        {
            return player.cards[0].number == 5 && player.cards[1].number == 3 && player.cards[2].number == 2;
        }

    }

}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace GameCore
{
    public class PlayerComparator : IComparer<Player>
    {
        private TypeValueSetter recognizer;

        public PlayerComparator(ValueCalculator calculator)
        {
            this.recognizer = new TypeValueSetter(calculator);
        }
            
        public void SetupRegularPlayer(Player player)
        {
            recognizer.RegPlayerType(player);
        }

        public void SetupUnRegularPlayer(Player player)
        {
            PlayerUtil.SortPlayerByNumber(player);
            recognizer.RegPlayerType(player);
        }

        public void SortRegularPlayers(List<Player> playersInput)
        {
            foreach(Player player in playersInput)
            {
                recognizer.RegPlayerType(player);
            }
        }

        public int Compare(Player player1, Player player2)
        {
            return (player1.value - player2.value);
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerType 
{
    public const  int BOMB = 5;

    public const  int BOMB_MAX_VALUE = 7881;

    public const  int STRAIGHT_FLUSH = 4;

    public const  int STRAIGHT_FLUSH_MAX_VALUE = 7867;

    public const  int FLUSH = 3;

    public const  int FLUSH_MAX_VALUE = 7855;

    public const  int STRAIGHT = 2;

    public const  int STRAIGHT_MAX_VALUE = 4052;

    public const  int DOUBLE = 1;

    public const  int DOUBLE_MAX_VALUE = 4040;

    public const  int NORMAL = 0;

    public const  int NORMAL_MAX_VALUE = 3803;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace GameCore
{
    public interface ValueCalculator 
    {
        int GetBombValue(Player player);

        int GetStraightFlushValue(Player player);

        int GetFlushValue(Player player);

        int GetStraightValue(Player player);

        int GetDoubleValue(Player player);

        int GetNormalValue(Player player);
    }

}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace GameCore
{
    public class FlowerValueCalculator : ValueCalculator
    {
        private int GetFlowerValue(Player player)
        {
            return player.cards[0].flower * 16 + player.cards[1].flower * 4 + player.cards[2].flower;
        }

        private int GetA32FlowerValue(Player player)
        {
            return player.cards[1].flower * 16 + player.cards[2].flower * 4 + player.cards[0].flower;
        }

        public int GetBombValue(Player player)
        {
            PlayerUtil.SortPlayerByFlower(player);
            return (player.cards[0].number + PlayerType.STRAIGHT_FLUSH_MAX_VALUE) * 64 + GetFlowerValue(player);
        }
            
        public int GetStraightFlushValue(Player player)
        {
            return (player.cards[2].number + PlayerType.FLUSH_MAX_VALUE) * 64 + GetFlowerValue(player);
        }

        public int GetFlushValue(Player player)
        {
            return (player.cards[0].number * 256 + player.cards[1].number * 16 + player.cards[2].number
                + PlayerType.STRAIGHT_MAX_VALUE) * 64 + GetFlowerValue(player);
        }

        public int GetStraightValue(Player player)
        {
            return (player.cards[2].number + PlayerType.DOUBLE_MAX_VALUE) * 64 + GetFlowerValue(player);
        }

        public int GetDoubleValue(Player player)
        {
            PlayerUtil.ExchangeSortedDoubleFlower(player);
            return (player.cards[1].number * 16 + player.cards[2].number + PlayerType.NORMAL_MAX_VALUE) * 64
                + GetFlowerValue(player);
        }

        public int GetNormalValue(Player player)
        {
            return (player.cards[0].number * 256 + player.cards[1].number * 16 + player.cards[2].number) * 64
                + GetFlowerValue(player);
        }
    }

}








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值