C# 斗牛核心算法

 扑克牌(0·52)取随机数

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

public class BullFightTools
{
    public static List<int> usedNumber = new List<int>();
    private static int[] points = new int[5];   

    /// <summary>
    /// 开始游戏
    /// </summary>
    public static void StartGame()
    {
        usedNumber.Clear();
    }

    /// <summary>
    /// 要牌
    /// </summary>
    /// <returns></returns>
    public static int GetNumber()
    {
        int number = -1;
        do
        {
            number = new Random().Next(0, 52);
        } while (usedNumber.Contains(number));
        usedNumber.Add(number);
        return number;
    }

    /// <summary>
    /// 类型
    /// </summary>
    public enum PokerType
    {
        Boom = -1,//炸弹
        WuXiaoNiu = -2,//五小牛
        Gold = -3,//金牛
        Silver = -4,//银牛
        None = -5 //没牛
    }

    public static int CheckType(List<int> list)
    {
        int sum = 0;//和        
        int TenNum = 0;//10的个数       
        int Count = list.Count;
        list.Sort();//排序        
        //1、判断是不是炸弹牛 (/4是点数,%4是花色)       
        if ((list[0] / 4) == (list[3] / 4) && (list[1] / 4) == (list[4] / 4))
        {
            return (int)PokerType.Boom;
        }
        //2、金牛银牛的判断不需要进行数据处理就能够得到       
        if (list[0] >= 40)
        {
            //金牛           
            return (int)PokerType.Gold;
        }
        if (list[0] >= 36)
        {
            //银牛            
            return (int)PokerType.Silver;
        }        //3、换成与牌对应的数值     
        for (int i = 0; i < Count; i++)
        {
            if ((list[i] / 4) > 9)
            {
                points[i] = 10;
            }
            else { points[i] = list[i] / 4 + 1; }
        }
        //4、计算 整十数 的数量      
        for (int i = 0; i < Count; i++)
        {
            if (points[i] >= 10) //10 J Q K 的数量       
            { TenNum++; }
            //Debug.Log("牌对应的数" + points[i]);
        }
        //5、如果大于等于10的数量超过了3,必定有牛,直接返回牛的点数,不需要求和    
        if (TenNum >= 3) { return (points[0] + points[1]) % 10; }
        //5、求和 ,五张牌的总值,判断是不是J、Q、K、值为10         for (int i = 0; i < Count; i++)  
        { sum += points[i]; }
        //Debug.Log("sum = " + sum);
        //6、判断五小牛      
        if (sum < 10) { return (int)PokerType.WuXiaoNiu; }
        //7、计算其他牛的点数,有牛的一般情况  包含  (1,3,8,9,10)(5,7,8 ,10,10)类型    
        for (int i = 0; i < Count - 1; i++)
        {
            for (int j = i + 1; j < Count; j++)
            {                //剔除两个数字之后能够整除10即有牛,返回牛的点数        
                if ((sum - (points[i] + points[j])) % 10 == 0)
                {
                    //Debug.Log("第一种情况");
                    return (points[i] + points[j]) % 10;
                }
            }
        }
        //8、有一个整十数的特殊情况   2,3,4,5,10  包含2,5,7,10,10     
        if (TenNum == 1)
        {
            for (int i = 0; i < Count; i++)
            {
                if (sum - 10 - points[i] % 10 == 0) //有牛的情况         
                {
                    //Debug.Log("第二种情况");
                    return (sum - 10) % 10; //返回牛几             
                }
            }
        }
        //9、有两个整十数的特殊情况 2,8,3,10,10,      
        for (int i = 0; i < Count - 1 - TenNum; i++)
        {
            for (int j = i + 1; j < Count - TenNum; j++)
            {
                if ((points[i] + points[j]) == 10)
                {
                    for (int k = 0; k < TenNum; k++)
                    {
                        sum -= 10;
                        Debug.Log("第三种情况");
                        return sum % 10; //返回牛几               
                    }
                }
            }
        }
        //8、没牛      
        return (int)PokerType.None;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值