C#实现斗地主洗牌

来自Asp.net精英论坛: bbs.1aspx.com 

这是我自己定义的一个关于牌的数据结构.
     public   class  Poker
    
{
        
public Int32 PokerIndex;//这张牌在整副牌中的索引.
        public Int32 PokerValue;//这张牌的字面大小.
        public Poker() { }
        
public Poker(Int32 PokerIndex, Int32 PokerValue)
        
{
            
this.PokerIndex = PokerIndex;
            
this.PokerValue = PokerValue;
        }

    }
然后将牌分成四部分.即三个玩家在未成为地主的时候,手上的17张牌.另外是三张地主牌.
         protected  Poker[] pk  =   new  Poker[ 54 ]; // 所有的牌
         protected  Poker[] pk1  =   new  Poker[ 17 ]; // 发给第一个人的牌
         protected  Poker[] pk2  =   new  Poker[ 17 ]; // 发给第二个人的牌
         protected  Poker[] pk3  =   new  Poker[ 17 ]; // 发给第三个人的牌
         protected  Poker[] pkTemp  =   new  Poker[ 3 ]; // 最后三张
然后产生整副牌
         // 产生牌
         public   void  InitPk()
        
{
            
for (Int32 index = 0; index < pk.Length; index++)
            
{
                pk[index] 
= new Poker();
                pk[index].PokerIndex 
= index;
                pk[index].PokerValue 
= index;
            }

        }

进行洗牌.主要是对牌进行一种随机的交换
         // 洗牌
         public   void  Random_Sequence()
        
{
            
int m, n;
            Random ram 
= new Random();
            
for (int i = 0; i < 1000; i++)
            
{
                m 
= ram.Next(054);
                n 
= ram.Next(054);
                
if (m != n)
                
{
                    
this.Permute(m, n);
                }

            }

        }

        
// 置换牌
         public   void  Permute(Int32 a, Int32 b)
        
{
            Poker temp;
            temp 
= pk[a];
            pk[a] 
= pk[b];
            pk[b] 
= temp;
        }
然后将牌分成四份.
         // 发牌
         public   void  Deal_cards()
        
{
            
for (int i = 0; i < 17; i++)
            
{
                pk1[i] 
= pk[i * 3];
                pk2[i] 
= pk[i * 3 + 1];
                pk3[i] 
= pk[i * 3 + 2];
            }

            pkTemp[
0= pk[51];
            pkTemp[
1= pk[52];
            pkTemp[
2= pk[53];
        }
对生成的牌进行排序.
        // 发牌
         public   void  Deal_cards()
        
{
            
for (int i = 0; i < 17; i++)
            
{
                pk1[i] 
= pk[i * 3];
                pk2[i] 
= pk[i * 3 + 1];
                pk3[i] 
= pk[i * 3 + 2];
            }

            pkTemp[
0= pk[51];
            pkTemp[
1= pk[52];
            pkTemp[
2= pk[53];
        }

        
// 对牌排序
         public  Poker[] Order_cards(Poker[] arr)
        
{
            Int32 c;
            
for (Int32 index = 0; index < arr.Length; index++)
            
{
                Math.DivRem(arr[index].PokerIndex, 
13out c);
                
if (arr[index].PokerIndex == 53)
                
{
                    arr[index].PokerValue 
= 16;
                }

                
else if (arr[index].PokerIndex == 52)
                
{
                    arr[index].PokerValue 
= 15;
                }

                
else
                
{
                    
if (c == 0)
                    
{
                        arr[index].PokerValue 
= 13;
                    }

                    
else if (c == 1)
                    
{
                        arr[index].PokerValue 
= 14;
                    }

                    
else
                    
{
                        arr[index].PokerValue 
= c;
                    }

                }

            }

            Sort(arr, arr.Length);
            
return arr;
        }

        
// 排序
         public   void  Sort(Poker[] arr, Int32 n)
        
{
            Int32 i, j, k;
            Poker temp;
            
for (i = 0; i < n; ++i)
            
{
                j 
= i;
                
for (k = i + 1; k < n; ++k)
                
{
                    
if (arr[j].PokerValue < arr[k].PokerValue)//如果前个数比后个数大,则交换位置。
                    {
                        temp 
= arr[k];
                        arr[k] 
= arr[j];
                        arr[j] 
= temp;
                    }

                }

            }

        }

        
public   void  AfterSort()
        
{
            pk1 
= Order_cards(pk1);
            pk2 
= Order_cards(pk2);
            pk3 
= Order_cards(pk3);
        }

在写的过程中,参考了这个贴子. http://www.cnblogs.com/blackzh/archive/2006/07/13/450036.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值