因为工作原因,好久没来了,最近在弄××方面的游戏,分享下×××算法
晕死了,标题也不能为laohuji???代码太长,不好贴,完整版的看下面链接吧
http://blog.csdn.net/yubangqi/archive/2010/05/23/5618720.aspx
 //初始化玩牌游戏
    public void PlayCardsInit()
    {
        if (iMaskedCardsType[0] == 0)//服务器从新启动后的初始化
        {
           
            iMaskedCardsType[0] = -1;
            iMaskedCardsType[Convert.ToInt16(Single)] = 1;
            iMaskedCardsType[Convert.ToInt16(Pair)] = 1;
            iMaskedCardsType[Convert.ToInt16(TwoPair)] = 0;
            iMaskedCardsType[Convert.ToInt16(Straight)] = 0;
            iMaskedCardsType[Convert.ToInt16(Flush)] = 0;
            iMaskedCardsType[Convert.ToInt16(ThreeOfAKind)] = 0;
            iMaskedCardsType[Convert.ToInt16(FullHouse)] = 0;
            iMaskedCardsType[Convert.ToInt16(FourOfAKind)] = 0;
            iMaskedCardsType[Convert.ToInt16(StraightFlush)] = 0;
        }
    }
    //检查出触发时间
    public void CheckTrigger()
    {
        String sDateAndTimeBuf = System.DateTime.Now.Date.ToString("yyyy-MM-dd");//系统当前日期
        String[] sSplitBufDate = sDateAndTimeBuf.Split(' ');//去空--------------------------------------------系统时间里有空格么?        String[] sSplitBufTime = System.DateTime.Now.TimeOfDay.ToString().Split(':');//取出今天的时间并分割,精确到小数点后面六位        //此代码一天执行一次
        if (sSplitBufDate[0] != sDateBuf)//缓存日期不是今天日期,即今天还没有执行过此代码
        {
            sDateBuf = sSplitBufDate[0];//缓存日期=今天日期,即标记今天此代码已经被执行过
            if (sSplitBufTime[0] == iOnTimeTrigger8.ToString())//每晚8点触发三张加对子(概率,下同)
            {
              
                iMaskedCardsType[Convert.ToInt16(FullHouse)] = 1;//触发加对子
            }
        }        //此代码一小时执行一次
        if (sSplitBufTime[0] != sHourBuf)//另一个小时开始
        {
            sHourBuf = sSplitBufTime[0];//缓存小时数=当前小时数
            if (--ThreeOfAKindCount <= 0)//一个小时倒计时结束
            {
                ThreeOfAKindCount = iHoursPerTrigger;//ThreeOfAKiindCount=2
                iMaskedCardsType[Convert.ToInt16(ThreeOfAKind)]++;//每2小时触发三张
            }
        }        //此代码一分钟执行一次
        if (sSplitBufTime[1] != sMinuteBuf)//另一分钟开始
        {
            sMinuteBuf = sSplitBufTime[1];//缓存分钟数=当前分钟数
            if (--FlushCount <= 0)//30分钟倒计时结束
            {
                FlushCount = iMinutesPerTrigger30;//FlushCount=30
                iMaskedCardsType[Convert.ToInt16(Flush)]++;//每30分钟触发同花
            }
            if (--StraightCount <= 0)//5分钟倒计时结束
            {
                StraightCount = iMinutesPerTrigger5;//StraightCount=5
                iMaskedCardsType[Convert.ToInt16(Straight)]++;//每5钟触发顺子
            }
            if (--TwoPairCount <= 0)//一分钟倒计时结束
            {
                TwoPairCount = iMinutesPerTrigger1;//TwoPairCount=1
                iMaskedCardsType[Convert.ToInt16(TwoPair)]++;//每1分钟触发两对半
            }
        }
    }
    //更新触发时间
    public void UpdateTrigger(String sCurrentCards)
    {
        String sCurrentHand = GetCardsType(sCurrentCards);//返回 牌类型,牌1数字~牌2数字~牌3数字~牌4数字~牌5数字
        String[] sSplitBuf = sCurrentHand.Split(',');
        if (sSplitBuf[0] != Single && sSplitBuf[0] != Pair)//牌类型不是单张或者对子
            iMaskedCardsType[Convert.ToInt16(sSplitBuf[0])]--;//重新将其他牌类型初始化为0
    }
    //返回:计算机发的5张牌。例:牌1的ImageUrl~牌2的ImageUrl~牌3的ImageUrl~牌4的ImageUrl~牌5的ImageUrl。
    public String GetNewHand()
    {
        String sNewHand = "";        while (sNewHand == "")
        {
            Random NewType = new Random();
            Random NewNumber = new Random();            Int32[] iCardsType = new Int32[iNumOfCards];
            Int32[] iCardsNumber = new Int32[iNumOfCards];            //牌的类型
            iCardsType[0] = NewType.Next(1, 5);//1-5之间的一个随机数
            iCardsType[1] = NewType.Next(1, 5);
            iCardsType[2] = NewType.Next(1, 5);
            iCardsType[3] = NewType.Next(1, 5);
            iCardsType[4] = NewType.Next(1, 5);
           
            //牌号
            iCardsNumber[0] = NewNumber.Next(1, 14);//1-14之间的随机数
            iCardsNumber[1] = NewNumber.Next(1, 14);
            iCardsNumber[2] = NewNumber.Next(1, 14);
            iCardsNumber[3] = NewNumber.Next(1, 14);
            iCardsNumber[4] = NewNumber.Next(1, 14);            sNewHand = CheckNewHand(iCardsType, iCardsNumber);//组合五张牌成一个字符串  花色_牌号~花色_牌号……
        }
        return sNewHand;
    }
    //返回5张牌如2_3~2_3~2_3~2_3~2_3
    public String CheckNewHand(Int32[] iCardType, Int32[] iCardsNumber)
    {
        if (lxFile_String.CheckDepurecatedNum(iCardsNumber))//几张牌的数字要完全不相同
            return "";
        else if (CheckDepurecatedCardType(iCardType))
        {
            return iCardType[0].ToString() + "_" + iCardsNumber[0].ToString() + "~" +
                   iCardType[1].ToString() + "_" + iCardsNumber[1].ToString() + "~" +
                   iCardType[2].ToString() + "_" + iCardsNumber[2].ToString() + "~" +
                   iCardType[3].ToString() + "_" + iCardsNumber[3].ToString() + "~" +
                   iCardType[4].ToString() + "_" + iCardsNumber[4].ToString();
        }
        return "";
    }